Как написать четко определенный и простой в обслуживании код

Вступление

Имея сегодня на выбор сотни языков, современный разработчик обладает невероятной гибкостью при проектировании и создании программного обеспечения. Существует любой тип синтаксиса, который можно вообразить, от низкоуровневого кода для грубой мощности до более удобочитаемого для облегчения разработки.

Когда дело доходит до выбора правильного инструмента для работы, обычно существует компромисс между этими факторами, и в каждом языке есть безграничные способы решения проблемы. В то время как некоторые языки являются строго типизированными и требуют определений для таких вещей, как типы возвращаемых переменных и функций, некоторые не требуют (или даже не поддерживают) спецификации типов.

Независимо от системы типов, которую реализует выбранный вами язык, явно написанный код часто легче анализировать, читать и отлаживать.

Что такое явное программирование?

Явное программирование - это процесс создания исходного кода, в котором все входы, выходы, операции и исключения явно определены с использованием лучших функций, доступных в текущем языке и среде.

Этот подход дает некоторые преимущества по сравнению с противоположным, неявным программированием, в котором значение всего «подразумевается» и оставляется на усмотрение компилятора или интерпретатора, других разработчиков или кого-либо еще, чтобы определить предполагаемую работу каждого раздела программы, часто почти в реальном времени.

Хотя неявное программирование действительно обеспечивает некоторую гибкость, позволяя разработчику выражать намерение разными способами с меньшими ограничениями, явное программирование имеет основные преимущества:

  • Компьютер, на котором запущено ваше приложение, будет иметь лучшее представление о том, чего вы пытаетесь достичь. Например, заблаговременное определение переменной с правильно ассоциированным типом позволяет машине, на которой выполняется или интерпретирует ваш код, выделять память, настраивать сборщик мусора и делать другие полезные вещи, полезные для вашей программы.
  • Другие люди - например, тестировщики и разработчики, читающие ваш код в будущем, - также будут лучше понимать, что программа должна делать и как она должна работать. Как и в случае выше, следующий человек, который будет работать над программой, может четко видеть тип и контекст каждой переменной. При чтении десятков тысяч строк кода (или более) для поддержки большого проекта эти мелкие детали имеют огромное значение.

Это большие преимущества перед необходимостью выяснять, что означает каждая отдельная переменная и почему, и что делать, когда типы не совпадают и требуется приведение типов, и все это начинает быстро складываться при повторении миллиардов раз.

На первый взгляд может показаться, что не нужно инициализировать переменные на языках, которые не требуют этого и искать другие ярлыки, для экономии времени. Однако учтите, что в этих случаях этот человек экономит одну или две секунды усилий и заставляет всех и всех компенсировать это позже, угадывая, что означает код, и надеясь, что он не потерпит неудачу, когда произойдет какое-то исключение или когда кто-то в конечном итоге меняет его - вводя новые ошибки, которые теперь требуют дополнительных затрат на отладку и рефакторинг. Реальная экономия времени - это небольшие предварительные затраты в несколько секунд на то, чтобы защитить программное обеспечение и связанные с ним инструменты, документацию и другие системы.

Определите свои варианты

Функции, доступные разработчику для создания четко определенного и легкого для чтения кода, будут широко варьироваться в зависимости от среды, от грубых сценариев оболочки и фрагментарной архитектуры до чрезвычайно мощных инструментов отладки в реальном времени, доступных в Visual Studio Code и других современных редакторах. .

В программировании система типов - это набор правил, которые присваивают свойство, называемое типом, различным частям компьютерной программы. Это эффективно определяет, в какой степени разработчик может или не может проиллюстрировать точную предполагаемую работу каждой части программы. Из различных правил в системе типов два наиболее важных следующие:

  • Безопасность типов: степень, в которой язык предотвращает ошибки типа.
  • Выражение типа: подразумеваются ли типы или определены явно.

Для получения информации о системах типов, используемых в некоторых распространенных языках, см. Эту статью: Сравнение языков программирования по системам типов.

Определите как можно больше

Если у вас есть выбор между двумя вариантами, один из которых сэкономит вам несколько секунд сейчас, но означает снижение производительности и дополнительное время для отладки для кого-то позже, не поленитесь. Добавьте сейчас дополнительные три секунды и спасите кого-нибудь - возможно, даже себя - потраченного впустую времени и усилий, позже выясняя, как что-то должно работать и почему однажды это внезапно сломалось.

Что-то, конечно же, легко читать и понимать в тот момент, когда вы это пишете, поскольку в вашем туннельном видении вы пишете этот единственный фрагмент кода, который идеально вписывается в вашу собственную память и имеет для вас смысл.

Умножьте это на тысячи компонентов, каждый из которых соединен различными способами, в зависимости от того, кто его и когда построил, а затем представьте, что вы пробираетесь через это год или около того, пытаясь исправить какую-то случайную ошибку за 11 час до крупного релиза. . Тогда становится более ясно, почему важно определить, как программа должна работать, и оставить как можно меньше возможностей для интерпретации. Вот как на самом деле работают стандартные компьютерные системы: с точно известными параметрами и жесткой обработкой ошибок, чтобы гарантировать, что ничего не взорвется, когда что-то пойдет не так. И идут не так, как надо, очень часто.

Создавайте вещи, которые имеют смысл

Определение предполагаемого поведения вашего кода способом, очевидным как для машин, так и для людей, - это простой процесс:

  1. Серьезно подумайте о том, что вы собираетесь сделать и почему, прежде чем приступить к реализации. Проведите некоторое время за доской или с ручкой и блокнотом и убедитесь, что ваши идеи имеют смысл, и проходят логические тесты слева и справа, внутри и снаружи. Если вы не сделаете этого сейчас, все остальные будут делать это за вас по пути, что вам не будет весело.
  2. Определите параметры того, что вы делаете, включая необходимые вам переменные, их типы, как их назвать, какие типы абстракций или других функций использовать и т. Д. Если ваша команда или проект использует Разработка через тестирование, сейчас самое подходящее время для того, чтобы записать их в тестовые примеры, которые впоследствии можно будет отшлифовать до надежного набора тестов приложения.
  3. Для проектов, связанных с реляционными базами данных, убедитесь, что вы следуете стандартным соглашениям по именованию, определению типов, нормализации, индексации и другим передовым методам проектирования баз данных. Поместите сложные операции с данными в хорошо названные функции базы данных и легко повторно используйте их из исходного кода приложения. Сделайте то же самое с представлениями SQL, чтобы не перегружать ваше приложение массивными избыточными запросами.
  4. Используйте функции абстракции, доступные в вашем языке, по крайней мере, для создания разделительных слоев между основной частью вашей бизнес-логики и базовыми элементами вашего приложения. Избегайте, например, ситуаций, когда основная точка входа для API находится буквально в одном шаге от прямого вызова базы данных (или, что еще хуже, в том же блоке кода). Это кажется тривиальным, но опять же, для сотен основных компонентов API рефакторинг чего-то, что вы скопировали 275 раз вместо однократного абстрагирования, становится огромным кошмаром, которого можно было бы легко избежать в лоб.
  5. Практикуйтесь в написании самодокументируемого кода: называйте вещи так, чтобы они соответствовали лучшим языковым практикам и давали понять будущим читателям, что они означают. Например, старайтесь избегать случайных или загадочных имен для переменных, функций или чего-либо еще, вместо этого убедитесь, что каждое имя дает очевидные подсказки относительно того, что оно представляет, и, что более важно, почему.
  6. Выявите все основные слабые места, касающиеся языка, используемого при разработке каждой части вашего приложения, и разумно используйте эту информацию для создания служебных классов и методов для себя и / или выбора надежной структуры, которая обеспечивает предсказуемое поведение, решая эти проблемы. Хорошим примером этого является таблица сравнения типов для PHP, которая иллюстрирует нестандартное поведение, или различные доступные фреймворки, которые могут помочь смягчить эти проблемы. Другой пример - язык TypeScript, который был представлен в 2012 году как более структурированный надмножество JavaScript с функциями ООП, заимствованными из C # и Java.

Заключение

Есть много способов, которыми кто-то может решить проблему, особенно тот, в котором есть множество доступных примеров, когда другие находили множество разных способов достижения в основном одного и того же, и все они являются жизнеспособными вариантами. Найдите языки и инструменты, которые подходят вам и позволят вам создавать то, что вы хотите, в меру своих возможностей, а затем освоите функции, доступные в этой среде. Это позволяет создавать программное обеспечение, которое по-прежнему будет отлично работать и с которым будет легко работать годы или даже десятилетия спустя.

Хороший дизайн неподвластен времени. Его не волнуют отраслевые модные словечки, тенденции, появляющиеся технологии или что-либо еще в этом отношении. Вещи, которые хорошо работают и прекрасно выглядят, всегда будут работать, поэтому современные дизайнеры используют очень старые концепции, такие как золотое сечение, которое художники, такие как да Винчи, широко использовали с большим успехом из-за того, что оно широко распространено в природе.

Определите, что вы хотите, чтобы что-то делало и как вы хотите, чтобы это работало, а затем приступайте к его построению таким образом, чтобы у читателя не оставалось абсолютно никаких догадок, является ли этот читатель машиной, на которой выполняется ваша программа, или другим программистом, который должен работать. через несколько месяцев или лет.

Ваши клиенты, партнеры и, возможно, вы в будущем будете благодарить вас за это.

~ 8_bit_hacker