„Дори лош код може да функционира“. Този цитат идва от книганаписана от известния американски инженер — Робърт Сесил Мартин, Чист код. Някои от вас може би го познават като чичо Боб. В книгата си той продължава да обяснява няколко практики, които помагат за създаването на код, който е прост, поддържаем и гъвкав. Написано през 2008 г. Оттогава насам много са се променили технологиите и тези няколко принципа остават същите. Но как ви изглежда чистият код? След като работих като софтуерен инженер от известно време, ето какво научих.

Тук няма директен отговор с много определения за това какво е чист код за различни разработчици. Чистият код също може да бъде субективен за вида стил на програмиране, който използвате. Но по същество чистият код се свежда до това едно просто правило. Лесно е за разбиране и лесно за промяна.

Ето няколко много общи принципа на софтуерното инженерство и такива, на които се натъкнах чрез проба и грешка, които ми помогнаха да създам по-чист код.

ИЗСУХА/УМРЕ

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

Имаме три различни функции за генериране на типове автомобили. Трябва да извикаме всяка функция за всеки от тези типове автомобили. За да избегнем дублирането на код и по този начин да намалим техническия дълг, вместо това можем да направим нещо подобно.

Сега имаме само една функция, която можем да използваме повторно, като подадем необходимия параметър. Много по-добре, нали?

Целувка

Бъдете супер прости или бъдете прости глупави. Това говори само за себе си. Като инженери често се оказваме в ситуации, в които сме преработили кода. Това е една от основните причини за големия технически дълг в наследените системи. Нека да разгледаме друг пример.

Правилото за единична отговорност с тире по-малко е повече. В примера по-долу можем да видим, че проверяваме дали кошчето е празно, за да можем да го напълним отново. Имаме две променливи isBinEmpty и canRefill. Ако контейнерът е празен, задаваме canRefill на true и isBinEmpty на false, след което регистрираме резултатите. 🤔

Можем да опростим това, като премахнем canRefillпроменливата,разчитайки само на isBinEmpty. Можем също така да приложим правилото за единична отговорност, като гарантираме, че логиката за регистриране извършва само регистриране. Резултатът е както е показано по-долу, от 9 реда код до 2. Лесно.

Наименуването е всичко

Ако програмирате от известно време, знаете колко важно е това. Наименуването помага за разбирането и ако кодът, с който работите, е стар, доброто наименуване е най-добрият ви приятел. Понякога често е по-добре да групирате логиката в собствена променлива, вместо да я разпръснете като отделни операции. Ще ви покажа какво имам предвид в следния пример.

Имаме функция, която приема две булеви стойности, които изпълняват операция И едно с друго. Резултатът ни показва дали формата е квадрат. Имайки предвид тези две свойства в примера, показан по-долу, очакваме да видим, че това наистина е квадрат.

Тази логика обаче може да бъде подобрена и разделена още повече на два отделни реда. Не само, че е много по-лесно за разбиране, но също така преработихме кода, за да не бъде нищо повече от това, което трябва да бъде, като присвоихме двата параметъра с оператор И, който ги свързва.

Имам ли нужда от това вече

Ако имах по един долар всеки път, когато задавах този въпрос, щях да бъда богат. Ще трябва постоянно да си задавате това, отново и отново. Това е едно от онези неща, които трябва да направите като старание в програмирането, като писане на модулни тестове и уверете се, че сте тествали кода си, за да видите, че работи.

Продължавайки от примера по-горе, можем да преработим тази част още повече. Питаме се имаме ли вече нужда от променливата isSquare? Не, не го правим и вместо това можем просто да върнем резултата.

Чистият код не спира непременно до писането на „чист“ код. Създава се в среда за сътрудничество с последователна комуникация във вашия екип. То непрекъснато мисли за миналото, настоящето и бъдещето от различни гледни точки и винаги поставя под съмнение всичко. Това е начин на ‹/живот›.