Хорошие разработчики определяются качеством кода. В индустрии ПО написание эффективного кода означает экономию денег, которые пойдут на тестирование, обновления, развитие и починку багов. В этой статье я покажу вам настоящие примеры техник и идей, которые помогут вам подчистить унаследованный код и перепроектировать его так, чтобы он стал более надежным и структурированным. Эти правила помогут вам переработать код, и благодаря им будет легче писать более понятный код.
Что такое рефакторинг и зачем он нужен?
Рефакторинг - техника, правила написания кода с целью сделать его более простым для понимания. Это важно прежде всего для других разработчиков, чтобы они могли читать, расширять и повторно использовать код без надобности его редактировать. Ниже вы найдете несколько примеров переработки и улучшения унаследованного кода.
Никогда не перерабатывайте код готового приложения без проведения тестов
Мой первый совет - никогда не начинайте перерабатывать унаследованный код, который не проходил модульные тесты. Думаю, причина очевидна: многие функциональные элементы могут оказаться поломанными, и их будет трудно починить, потому что вы не сможете понять, в чем именно дело. Если вам нужно перепроектировать код, сначала протестируйте его и убедитесь, что сделали это с той частью, с которой будете работать.
Начинайте рефакторинг с самой глубокой части кода
Посмотрите на изображение. Это настоящий проект для системы управления гостиницей, найденный мной на github. Это настоящее ПО с открытым исходным кодом, а закрытый код мог бы быть и хуже.
Как вы можете заметить, на картинке красным цветом отмечены три уровня. Самая глубокая его часть - конструкция if/else, что внутри первого if. Лучше всего сконцентрироваться на одном логическом элементе, тогда будет проще переработать весь код.
Сокращайте методы, разделяя их на более короткие или на конфигурационные файлы/DB-таблицы
Может быть, в этом случае можно выделить эту часть кода в приватный метод:
Следующий шаг - получить данные и загрузить их отображение. Переработав остальные части, взгляните на метод add(). Он стал гораздо «чище», его легче читать и тестировать.
Всегда используйте {} в функции if
В большинстве языков программирования можно писать функцию if в одну строчку. Многие разработчики так и делают, потому что так проще. Однако это трудно читать. В таком случае также легко могут появиться проблемы: стоит оставить одну пустую строчку, и функция может повредиться. Посмотрите на разницу между двумя примерами:
Не используйте магические числа и строки
В следующем примере можно заметить, что если количество комнат превышает 250, то появляется ошибка. В этом случае 250 является магическим числом. Если вы не являетесь разработчиком, который создал этот код, будет трудно понять, что же это значит.
Чтобы переработать это место, можно предположить, что 250 - максимальное количество комнат. Вместо хардкода выделим это в переменную $maxAvailableRooms
. Теперь другие разработчики смогут понять это место.
Не используйте оператор else, если того не требуется
В этой же функции availableRooms() можно заметить функцию if, в которой можно запросто убрать часть else без вреда логике.
Используйте понятные названия для методов, переменных, тестов
Ниже можно увидеть два метода из системы управления гостиницей. Они называются index() и room_m(). Лично мне трудно определить, для чего они нужны. Думаю, было бы проще понять, если бы их названия были более содержательными.
Используйте максимум возможностей вашего языка программирования
Многие разработчики не используют все возможности языка программирования, на котором работают. А ведь там есть компоненты, которые обеспечат написание эффективного кода и помогут вам поберечь силы. Взгляните на примеры ниже и заметьте, как легко добиться того же результата, при этом написав более короткий код и используя подсказки при вводе кода.
Еще несколько правил написания кода, которыми я бы хотел закончить статью
- Используйте [] в массивах, а не старую версию array();
- Используйте === оператор вместо == в случае, когда важно проверять dataType;
- Всегда будет хорошей идеей давать открытым методам содержательные, понятные и в то же время короткие названия. У приватных методов могут быть длинные названия, так как у них ограниченный объем;
- Используйте общие названия только в методах, которые реализуют интерфейс, например, add(). Содержательные названия понадобятся единственным методам класса addUser() и addDocument();
- Убирайте неиспользованные методы из классов;
- Используйте префиксы is и has для функций, которые используют логическое выражение: isAdmin($user), hasPermission($user);
- Всегда пользуйтесь модификаторами доступа в классовых методах и параметрах;
- Остерегайтесь загрязнения интерфейса: выбирайте только те методы, которыми пользователи могут пользоваться открыто;
- Организуйте классы методов так, чтобы открытые методы были на поверхности;
- Всегда применяйте принцип единственной обязанности к своим классам.