Как се пише чист код?
Какво е чист код? Всеки има различен отговор. Следват някои от моите наблюдения от четене на блогове, книги и десетилетие професионален опит.
Конвенции за именуване
- Не използвайте съкращения.
- Имената с възможност за търсене са по-добри
- Избягвайте използването на кодирани имена
Имената на класовете трябва да са съществителни.
public class User() {} public class Company() {}
Имената на функции трябва да са глаголи, името трябва ясно да посочва действието, което извършват.
public User fetchUserByEmail(String email) {} public void deleteUserById(String id) {}
Променливите и аргументитетрябва да са кратки и описателни.
String firstName; String billingStatus; public Subscription updateSubscription(UpdateSubscriptionRequest updateRequest) {}
Константите трябва да са само с главни букви
String DATE_FORMAT = "YYYY-MM-DD"; String API_KEY = "XXXXXXXX";
Имена, разкриващи намерения,кодът е начин за комуникация с разработчиците, които го четат.
public boolean isUserHasPermission() {} public List<User> sortUserByAge() {}
Изберете една дума за понятиее абстрактно и се придържайте към него.
// bad practice public List<User> getUsers() {} public List<Message> fetchMessages() {} public List<Contacts> retrieveContacts() {} // good practice public List<User> fetchUsers() {} public List<Message> fetchMessages() {} public List<Contacts> fetchContacts() {}
Класове
- Класовете трябва да са малки и да съдържат малки функции, които силно насърчават идеята за абстрахиране на всяка част от логиката, която може дори да е номинално сложна, в отделна функция на нещо.
- Използвайте правилно нивата на достъп.
- Поддържайте помощните функции и променливите частни, с изключение на някои случаи за тестване.
- Изложете необходимите променливи чрез getter и setter.
Функции
- Функциите трябва да са кратки и да правят само едно нещо. Ако нашите функции правят повече от едно нещо, моментът е идеален за извличане към друга функция.
- Малките функции са лесни за разбиране.
- Предайте възможно най-малко аргументи, в идеалния случай никакви.
- Функциите не трябва да са по-дълги от 20 реда и най-вече по-малко от 10 реда.
- Това означава, че операторите if, forиwhileциклите трябва да са дълги един ред, очевидно този ред трябва да извиква друга функция.
Принципи на софтуерното инженерство
- DRY - Не повтаряйте сами
- Kiss - Keep it simple stupid
- SOLID Принципи
Не повтаряйте сами
- Част от кода не трябва да се повтаря в софтуера.
- Намалете дублирането и увеличете повторното използване.
- Повторната употреба означава по-малко код, което води до по-добра поддръжка, но не забравяйте, че известна повторна употреба може действително да увеличи четливостта.
- Противоположното на СУХО е МОКРО - Пишете всичко два пъти, Наслаждаваме се на писане, Губим всеки време.
- Общо правило, когато пишете нещо три пъти, е време да преработите логиката във функция и да я използвате повторно.
Бъдете прости глупако
- Поддържайте кода възможно най-прост.
- Избягвайте ненужната сложност за по-добро разбиране и поддръжка.
- За да запазите кода прост, разбийте проблема на малки стъпки или функции.
SOLID Принципи
- Принцип на единична отговорност -Една функция трябва да прави само едно нещо. Ако една функция прави повече от едно нещо, тогава функцията трябва да бъде разделена на множество функции.
- Отворен или затворен принцип -Обектът трябва да се отваря за разширение, но да е затворен за модификация.
- Заместване на Лисков или принцип на заместване -На променлива от даден тип може да бъде присвоена стойност от всеки подтип и метод с параметър от даден тип може да бъде извикан с аргумент от всеки подтип на Тип.
- Разделение на интерфейса -По-големите интерфейси трябва да бъдат разделени на по-малки. Правейки това, можем да гарантираме, че внедряващите класове трябва да се интересуват само от методите, които са интересни за тях.
- Принцип на инверсия на зависимост – Модулите от високо ниво не трябва да зависят от модули от ниско ниво. И двете трябва да зависят от абстракциите.
Форматиране на кода
Форматирането на кода е за комуникация.
- Функциите трябва да бъдат разделени с празни редове
- Понятия, които са тясно свързани, трябва да се поддържат заедно вертикално.
- Декларациите на променливите на екземпляра трябва да са на едно място и най-добре в горната част на класа
- Зависимите функции трябва да са вертикално близо, повикващият трябва да е над Callee
- Редовете не трябва да надвишават максимум 200 знака.
- Не нарушавайте правилото за отстъп, дори в случай на кратки, if изрази или функции
Коментари
- Коментарите трябва да се използват само като обяснение. Ако пишем функции по описателен начин, можем изобщо да избегнем писането на коментари.
- Не пишете коментари за това, което правите, вместо това пишете коментари защо правите.
- Посочете хакове, заобиколни решения и временни поправки.
- Не пишете излишни коментари, ако кодът е обяснителен, няма нужда да добавяте коментари.
- TODO & FIXMEкоментарите са подходящи, защото IDE може лесно да ги намери, преди да приключи проекта.
Регистриране
- Избягвайте прекомерното или по-малкото регистриране
- Избягвайте да печатате обект
- Използвайте правилни нива на регистрационни файловеГРЕШКА, ПРЕДУПРЕЖДЕНИЕ, ИНФОРМАЦИЯ, ОТСТРАНЯВАНЕ НА ГРЕШКИ
Обработка на изключения
Нещата могат да се объркат и когато се объркат, ние сме отговорни за обработването и хвърлянето на валидни отговори, които потребителят може да разбере.
- Не позволявайте на функциите да приемат нулеви параметри, използвайте предварителни условия.
- Помислете за хвърляне на конкретно изключение, вместо да хвърляте нула.
- Опитайте се да не хванете общи изключения, вместо това хванете конкретно изключение и хвърлете подходящ код и съобщение до потребителя.
- В блока catch регистрирайте изключения и хвърлете изключение с цялата полезна информация. Не правете нищо допълнително.
- Накраяблокирайте за изпълнение на код за почистване като затваряне на връзка, файл и освобождаване на нишки и т.н.
Тестове
- Единичните тестове трябва да бъдат бързи и изпълнени за кратко време.
- Тестовете не трябва да зависят от други тестове.
- Едно твърдение на тест.
- Напишете модулни тестове, за да проверите функционални аргументи, условни изрази, изключения и очаквани резултати.
Забележка: В следващите ми публикации ще обясня всяка тема поотделно с пример.