Я устроился на своем месте, обсуждая решение с членами моей команды. «Мы должны выиграть это», - сказал я, глубоко зарывшись в разработку рабочего прототипа в течение двух дней. - Соревновательный характер каждого человека только что разожжется, и парни должны просто бороться за 1, 2 и 3 места.

Через несколько минут один из судей, старший инженер, подошел к моему столу с неодобрительным выражением лица и пробормотал: «Ваш код не чистый, он грязный!» и это было началом моего пути к более чистому коду.

Чистый код? Что ж, для меня это не было странным, но имеет ли значение, если код просто работает? ДА, это имеет значение, тысячу раз.

За несколько лет до этого события я работал инженером-программистом; Я создал рабочие приложения, но мне только что сказали нечто иное, чем заставить работать мой код.

Моя проблема была проста: я сосредоточился на выполнении работы, намереваясь написать работающий код и, в свою очередь, получить технический долг, который в какой-то момент придется выплатить.

Как кодировать свой путь к чистоте

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

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

Один из лучших способов учиться у самих экспертов, читая их книги или сообщения. Вы должны размещать их твиты через ваш твиттер, слушать их выступления, подписываться на них на GitHub, изучать и узнавать, как написан и структурирован их код.

Ваш рост как инженера будет ограничен, если вы не будете постоянно учиться у экспертов в своей области.

Держите свои функции небольшими

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

Чистый код - это не просто написание коротких методов, а скорее написание кода, который четко передает намерение.

Когда функция слишком длинная, это, скорее всего, признак того, что она делает слишком много, и читатели могут потеряться, расшифровывая, что она делает. Функция должна делать одно.

if($order->contains($status){
   //do something with order
}
function contains($status){
    $orderStatuses =['accepted','delivered','rejected','processed'];
      if (in_array($status, $orderStatuses)) {
            return true;
         }
        return false;
   }

Мы можем сделать функцию ‘contains’ более чистой, переписав ее как:

function contains($status){
  return in_array($status, $this->config->statuses);
}

Функция «contains» не только очищается, но и не связана;

Переменные или функции должны использовать имена, которые описывают, что они делают.

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

$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 - это аббревиатура от первых пяти принципов объектно-ориентированного программирования, определенных Робертом Мартином. Эти принципы, когда их применяют, позволяют писать код, который имеет слабую взаимосвязь, связность и хорошо инкапсулирован. Принципы тесно связаны, и только их успешное применение может помочь вам написать лучший код. Я оставлю это для другого поста, но вы можете прочитать об этих принципах здесь.

Не будьте слишком строги к себе

Хотите знать, почему это в списке? Легко увязнуть в мире чистого кода и захотеть все усваивать раз в день. Печальная новость: это требует времени, месяцев, лет и самоотверженности. Принципы нужно изучать и применять на практике, но все началось с решения сделать все чище.

Заключение

Написав этот пост, я надеюсь вдохновить кого-то стать лучшим разработчиком и начать заботиться (в случае, если вы не) о чистом коде.

Не стесняйтесь оставлять свои комментарии, делать любой из примеров более чистым, добавлять меня в LinkedIn или расскажите мне о новой возможности.

Для дальнейшего чтения

Потрясающий список ресурсов чистого кода
Чистый код: руководство по гибкому программированию, 1-е издание
Чистый код PHP
Месяц чистого кода
Концепция чистого кода, адаптированная для PHP

Чистый код JavaScript