Чистый код? Есть ли какая-либо разница, если код просто работает? Да, это имеет значение.
Несколько лет назад я работал инженером по программному обеспечению — я создавал работающие приложения. Моя проблема была простой: я фокусировался на том, чтобы как можно быстрее закончить работу и написать код, который работает, что приводило к накоплению технического долга, за который мне пришлось бы расплачиваться в определенный момент времени.
Как создавать чистый код
Это не случится в момент, когда вы закончите читать все главы Clean Code от Дядюшки Боба. Это требует знаний и постоянной практики: вы должны знать принципы, паттерны и методы. Это тяжелая работа, и она требует нескольких лет опыта, но вы можете начать уже сегодня.
Неважно, насколько чистый код вы пишете, всегда есть одна или две вещи, которые вы можете узнать, чтобы стать ещё лучше.
Один из лучших способов — это учиться у экспертов и читать их книги или посты. Вам стоит читать их твиты, смотреть их выступления, следить за ними на GitHub и учиться, как они пишут и структурируют код.
Ваш рост в качестве инженера ограничен, если вы не учитесь у экспертов в вашей области.
Делайте короткие функции
Существует множество статей о том, что методы и функции должны быть как можно меньше. Но это можно неправильно истолковать.
Чистый код — это не просто создание коротких методов, а написание кода, который будет доступно доносить его цель.
Если функция слишком длинная, это, вероятно, признак того, что она делает слишком много, и читатели могут запутаться в том, что она делает. Функция должна делать одну вещь.
if($order->contains($status){ //do something with order
} function contains($status){ $order_statuses=['accepted','delivered','rejected','processed']; if (in_array($status, $order_statuses)) { return true; } return false; }
Мы можем сделать функцию contains чище, переписав её так:
function contains($status){ return in_array($status, $this->config->statuses); }
Функция стала чище, и мы её разделили.
Переменные или функции должны использовать названия, которые определяют, что они делают
Подбор названий для функций может быть утомительным, но это того стоит. Это спасет вас от создания комментариев, которые не всегда обновляются с изменением кода.
$date = date('Y-m-d'); //Ofcourse, it's a date but too generic!
$orderCreationDate =date('Y-m-d'); //cleaner code
Избегайте утверждений if и switch
У меня принятие этого пункта заняло определенное время. “Как вы можете говорить мне, что нужно избегать моих любимых if и else?” Правда заключается в том, что условные выражения могут быть поделены на отдельные функции и классы. Это не значит, что вы никогда не должны использовать if и switch, но их иногда можно избежать.
Вот хороший пример:
class BookOrder { public function process() { switch ($this->book->type) { case 'audiocopy': return $this->processAudioBook(); break; case 'downloadablecopy': return $this->processDownloadableCopy(); break; case 'paperbookcopy': return $this->processPaperBookCopy(); break; default: } } }
Более чистый способ написания этого кода:
interface IBookOrder { public function process(); }
class AudioBookOrder implements IBookOrder :void { public function process() { // TODO: Implement process() method. } }
class PaperBookOrder implements IBookOrder: void { public function process() { // TODO: Implement process() method. } }
class DownloadableBookOrder implements IBookOrder: void { public function process() { // TODO: Implement process() method. } }
Избегайте ментальных карт
Чистый код должен быть простым для чтения и понимания, и он не должен оставлять места для догадок.
Это не язык делает программу простой, а программист делает простым язык, — Роберт Мартин
Этот код проверяет, что клиент может извлечь определенную сумму денег. Он работает, но он беспорядочен.
if($this->user->balance > $amount && $this->user->activeLoan===0){ $this->user->balance -=$amount; // withdraw amount; }
Попробуем сделать его чище.
if($this->hasNoActiveLoan() && $this->canWithdrawAmount($amount)){ $this->withdraw($amount); } public function hasNoActiveLoan(){ return $this->user->activeLoan===0; } public function canWithdrawAmount(float $amount){ return $this->user->balance > $amount; } public function withdraw(float $amount){ $this->user->balance -=$amount; }
Теперь его не только проще понять, но и проще протестировать.
Понимайте и применяйте принципы S.O.L.I.D.
S.O.L.I.D. — это аббревиатура для первых пяти принципов объектно-ориентированного программирования, которые составил Роберт Мартин. Эти принципы позволяют вам писать код, который будет связным и хорошо инкапсулированным. Успешное применение этих принципов поможет вам писать хороший код. Вы можете почитать об этих принципах здесь.
Не будьте слишком жестокими к себе
Удивляетесь, почему что-то находится в списке? В мире чистого кода просто потеряться, желая узнать все за день. Плохая новость — чистый код требует месяцев и лет работы. Принципы можно выучить и применить, но все начинается с решения делать код все чище.
Заключение
Я надеялся вдохновить кого-то стать более хорошим разработчиком и начать заботиться о чистоте кода.
Для дальнейшего чтения:
- Awesome Curated List of Clean Code Resources
- Clean Code: A Handbook of Agile Software Craftsmanship 1st Edition
- Clean Code PHP
- A month of clean code
- Clean code concept adapted for PHP
- Clean code JavaScript