Как се пише чист код?

Какво е чист код? Всеки има различен отговор. Следват някои от моите наблюдения от четене на блогове, книги и десетилетие професионален опит.

Конвенции за именуване

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

Имената на класовете трябва да са съществителни.

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 регистрирайте изключения и хвърлете изключение с цялата полезна информация. Не правете нищо допълнително.
  • Накраяблокирайте за изпълнение на код за почистване като затваряне на връзка, файл и освобождаване на нишки и т.н.

Тестове

  • Единичните тестове трябва да бъдат бързи и изпълнени за кратко време.
  • Тестовете не трябва да зависят от други тестове.
  • Едно твърдение на тест.
  • Напишете модулни тестове, за да проверите функционални аргументи, условни изрази, изключения и очаквани резултати.

Забележка: В следващите ми публикации ще обясня всяка тема поотделно с пример.