Хорошие разработчики определяются качеством кода. В индустрии ПО написание эффективного кода означает экономию денег, которые пойдут на тестирование, обновления, развитие и починку багов. В этой статье я покажу вам настоящие примеры техник и идей, которые помогут вам подчистить унаследованный код и перепроектировать его так, чтобы он стал более надежным и структурированным. Эти правила помогут вам переработать код, и благодаря им будет легче писать более понятный код.
Что такое рефакторинг и зачем он нужен?
Рефакторинг - техника, правила написания кода с целью сделать его более простым для понимания. Это важно прежде всего для других разработчиков, чтобы они могли читать, расширять и повторно использовать код без надобности его редактировать. Ниже вы найдете несколько примеров переработки и улучшения унаследованного кода.
Никогда не перерабатывайте код готового приложения без проведения тестов
Мой первый совет - никогда не начинайте перерабатывать унаследованный код, который не проходил модульные тесты. Думаю, причина очевидна: многие функциональные элементы могут оказаться поломанными, и их будет трудно починить, потому что вы не сможете понять, в чем именно дело. Если вам нужно перепроектировать код, сначала протестируйте его и убедитесь, что сделали это с той частью, с которой будете работать.
Начинайте рефакторинг с самой глубокой части кода
Посмотрите на изображение. Это настоящий проект для системы управления гостиницей, найденный мной на github. Это настоящее ПО с открытым исходным кодом, а закрытый код мог бы быть и хуже.
![nachinajte-refaktoring-s-samoj-glubokoj-chasti-koda](https://api.falbar.one/storage/images/609/656/cb6/zdwfsmztk-nachinajte-refaktoring-s-samoj-glubokoj-chasti-koda.jpg)
Как вы можете заметить, на картинке красным цветом отмечены три уровня. Самая глубокая его часть - конструкция if/else, что внутри первого if. Лучше всего сконцентрироваться на одном логическом элементе, тогда будет проще переработать весь код.
Сокращайте методы, разделяя их на более короткие или на конфигурационные файлы/DB-таблицы
Может быть, в этом случае можно выделить эту часть кода в приватный метод:
![sokraschajte-metody-razdelyaya-ih-na-bolee-korotkie](https://api.falbar.one/storage/images/609/656/cb6/ldsx1sreu-sokraschajte-metody-razdelyaya-ih-na-bolee-korotkie.jpg)
Следующий шаг - получить данные и загрузить их отображение. Переработав остальные части, взгляните на метод add(). Он стал гораздо «чище», его легче читать и тестировать.
![vzglyanite-na-metod-add](https://api.falbar.one/storage/images/609/656/cb6/9sklfl8fy-vzglyanite-na-metod-add.jpg)
Всегда используйте {} в функции if
В большинстве языков программирования можно писать функцию if в одну строчку. Многие разработчики так и делают, потому что так проще. Однако это трудно читать. В таком случае также легко могут появиться проблемы: стоит оставить одну пустую строчку, и функция может повредиться. Посмотрите на разницу между двумя примерами:
![vsegda-ispolzujte-v-funktsii-if](https://api.falbar.one/storage/images/609/656/cb6/ppbhxiwkn-vsegda-ispolzujte-v-funktsii-if.jpg)
Не используйте магические числа и строки
В следующем примере можно заметить, что если количество комнат превышает 250, то появляется ошибка. В этом случае 250 является магическим числом. Если вы не являетесь разработчиком, который создал этот код, будет трудно понять, что же это значит.
![ne-ispolzujte-magicheskie-chisla-i-stroki](https://api.falbar.one/storage/images/609/656/cb7/sxryi3fhy-ne-ispolzujte-magicheskie-chisla-i-stroki.jpg)
Чтобы переработать это место, можно предположить, что 250 - максимальное количество комнат. Вместо хардкода выделим это в переменную $maxAvailableRooms
. Теперь другие разработчики смогут понять это место.
![razrabotchiki-smogut-ponyat-eto-mesto](https://api.falbar.one/storage/images/609/656/cb7/m9ko166vm-razrabotchiki-smogut-ponyat-eto-mesto.jpg)
Не используйте оператор else, если того не требуется
В этой же функции availableRooms() можно заметить функцию if, в которой можно запросто убрать часть else без вреда логике.
![ne-ispolzujte-operator-else-esli-togo-ne-trebuetsya](https://api.falbar.one/storage/images/609/656/cb7/oxjwj7bxt-ne-ispolzujte-operator-else-esli-togo-ne-trebuetsya.jpg)
Используйте понятные названия для методов, переменных, тестов
Ниже можно увидеть два метода из системы управления гостиницей. Они называются index() и room_m(). Лично мне трудно определить, для чего они нужны. Думаю, было бы проще понять, если бы их названия были более содержательными.
![ispolzujte-ponyatnye-nazvaniya-dlya-metodov](https://api.falbar.one/storage/images/609/656/cb7/ndfxo6op2-ispolzujte-ponyatnye-nazvaniya-dlya-metodov.jpg)
Используйте максимум возможностей вашего языка программирования
Многие разработчики не используют все возможности языка программирования, на котором работают. А ведь там есть компоненты, которые обеспечат написание эффективного кода и помогут вам поберечь силы. Взгляните на примеры ниже и заметьте, как легко добиться того же результата, при этом написав более короткий код и используя подсказки при вводе кода.
![ispolzujte-maksimum-vozmozhnostej-vashego-yazyka](https://api.falbar.one/storage/images/609/656/cb7/yat5vvvnw-ispolzujte-maksimum-vozmozhnostej-vashego-yazyka.jpg)
![ispolzujte-maksimum-vozmozhnostej-yazyka-programmirovaniya](https://api.falbar.one/storage/images/609/656/cb7/kaqcprvct-ispolzujte-maksimum-vozmozhnostej-yazyka-programmirovaniya.jpg)
Еще несколько правил написания кода, которыми я бы хотел закончить статью
- Используйте [] в массивах, а не старую версию array();
- Используйте === оператор вместо == в случае, когда важно проверять dataType;
- Всегда будет хорошей идеей давать открытым методам содержательные, понятные и в то же время короткие названия. У приватных методов могут быть длинные названия, так как у них ограниченный объем;
- Используйте общие названия только в методах, которые реализуют интерфейс, например, add(). Содержательные названия понадобятся единственным методам класса addUser() и addDocument();
- Убирайте неиспользованные методы из классов;
- Используйте префиксы is и has для функций, которые используют логическое выражение: isAdmin($user), hasPermission($user);
- Всегда пользуйтесь модификаторами доступа в классовых методах и параметрах;
- Остерегайтесь загрязнения интерфейса: выбирайте только те методы, которыми пользователи могут пользоваться открыто;
- Организуйте классы методов так, чтобы открытые методы были на поверхности;
- Всегда применяйте принцип единственной обязанности к своим классам.