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

Если бы я мог научить начинающего разработчика только одной вещи...
Фото UX Indonesia на Unsplash
👋
Хочешь поучаствовать в жизни сайта? Мы ищем авторов!
Это перевод статьи Чжунтао Цю: If I Could Teach Only One Thing To A Beginner Developer

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

Поэтому я провел несколько "интервью", часть - через WeChat, часть - через Google Forms и остальные - из внутренней темы Google Chat.

Сбор и анализ данных. Изображение Чжунтао Цю.

Принцип единственной ответственности

Результат получился очень любопытным. Первый главный принцип - это "Принцип единственной ответственности", "Single Responsibility Principle", или сокращенно SRP. Хотя существуют и другие интерпретации, обычно SRP означает, что вы должны сделать свою функцию, класс или модуль настолько простым и связным, насколько это возможно.

Одним из конкретных примеров этого принципа может быть то, что я извлек из темы Google Chat:

...Я предлагаю им дать своим функциям осмысленные имена (это относится к первому пункту) и посмотреть, приходится ли им использовать союзы типа и/или для определения того, что делает функция. Если это так, им следует разбить эту функцию на несколько...

Это применимо и к другим уровням в вашем коде. Например, класс не должен делать две несвязанные вещи. Класс данных Person может иметь name, address и dob, но метод deliver будет излишним.

Ниже приведен пример, который я обсуждал в этой статье: компонент Avatar включает в себя всплывающий Tooltip и показывает его при предоставлении props.name. Применяя SRP, вы, скорее всего, захотите выделить код, связанный с Tooltip, и убедиться, что Avatar заботится только о логике, связанной с аватаром.

Упрощаем свой код с помощью SRP. Изображение Чжунтао Цю.

Инкапсуляция

Вторая по популярности тема - инкапсуляция. Грубо говоря, это принцип, согласно которому не следует использовать разбросанные тут и там данные или функции, а инкапсулировать их внутри класса или типа того. Но кроме того, он также может обязывает знать, где и какие данные и методы должны быть размещены.

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

Рядом с компонентами React часто можно увидеть небольшие функции преобразования данных, и по мере того, как меняется способ использования этих данных на фронтенде (использование аббревиатуры вместо полного имени или добавление ветки if-else, где понадобится), эти маленькие функции верхнего уровня становится трудно поддерживать.

Функция transformAddress. Изображение Чжунтао Цю.

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

Инкапсулируем логику адреса в класс. Изображение Чжунтао Цю.

Don’t Repeat Yourself

Номер три в списке - DRY - Don't Repeat Yourself. Все мы ненавидим повторять одно и то же при кодировании, особенно когда приходится делать это вручную. Вообще говоря, в большинстве случаев действует правило трех, то есть вам следует не допускать более трех случаев дублирования.

Здесь, как и в других принципах разработки программного обеспечения, следует заметить одну вещь: сначала вы должны попытаться понять, зачем код дублируется, а затем убрать дублирование. Есть несколько интересных статей (я поместил их в раздел ссылок внизу) о том, когда не следует удалять дублирование.

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

Функция верхнего порядка. Изображение Чжунтао Цю.

И затем вы можете передать этой функции любую функцию, чтобы избежать дублирования, например:

Передача функции, как переменной. Изображение Чжунтао Цю.

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

Подводя итоги

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

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

Ссылки

Материал подготовлен с ❤️ редакцией Кухни IT.

Олег Ямников

Олег Ямников

Главный кухонный корреспондент.