Мир новых технологий (обзоры, новинки)
Содержание
Чистый код? Есть ли какая-либо разница, если код просто работает? Да, это имеет значение.
Несколько лет назад я работал инженером по программному обеспечению — я создавал работающие приложения. Моя проблема была простой: я фокусировался на том, чтобы как можно быстрее закончить работу и написать код, который работает, что приводило к накоплению технического долга, за который мне пришлось бы расплачиваться в определенный момент времени.
Это не случится в момент, когда вы закончите читать все главы 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 и 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. — это аббревиатура для первых пяти принципов объектно-ориентированного программирования, которые составил Роберт Мартин. Эти принципы позволяют вам писать код, который будет связным и хорошо инкапсулированным. Успешное применение этих принципов поможет вам писать хороший код. Вы можете почитать об этих принципах здесь.
Удивляетесь, почему что-то находится в списке? В мире чистого кода просто потеряться, желая узнать все за день. Плохая новость — чистый код требует месяцев и лет работы. Принципы можно выучить и применить, но все начинается с решения делать код все чище.
Я надеялся вдохновить кого-то стать более хорошим разработчиком и начать заботиться о чистоте кода.
Для дальнейшего чтения: