Вы когда-нибудь страдали от плохого кода? Если вы программист, вы определенно так себя чувствовали. Возможно, вы полностью испортили свой собственный плохой код ...

Единственным допустимым показателем качества кода является WTF в минуту.

Недостаточно написать только хорошо работающий код. Это тоже должен быть чистый код. Потому что это делает код читаемым и делает его понятным любому, независимо от того, кто написал код. Так что пора быть хорошим программистом, а не просто программистом. В этой статье я дам вам несколько советов о том, как писать чистый код на основе знаний, которые я получил из книги «Чистый код Роберта Мартина».

Итак, что такое чистый код…?

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

1- Сначала рассмотрим форматирование кода. Почему нам нужно сосредоточиться на форматировании? Потому что точное форматирование кода улучшает читаемость кода и упрощает его изменение и сопровождение.

A) В коде группа строк представляет собой законченную мысль (имя пакета, импорт, классы, функции). При рассмотрении вертикального форматирования лучше разделять полные мысли пустой строкой, как показано ниже.

package org.ballerinalang.stdlib.services.nativeimpl.cookie;

import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class CookieFunctionTest {
}

Б) Кроме того, концепции, которые тесно связаны друг с другом, следует держать вертикально близко друг к другу. Например: -

  • Лучше объявлять переменные максимально приближенными к их использованию. При рассмотрении локальных переменных лучше, если они будут объявлены в верхней части каждой функции, управляющие переменные, используемые в циклах for, должны быть объявлены внутри оператора цикла. Объявление переменной экземпляра должно появиться в верхней части класса.
  • При рассмотрении зависимых функций они должны быть закрыты по вертикали, так как вызывающая функция находится над вызываемым. Функции должны появляться в коде в соответствии с порядком их использования.
  • На основе прямой зависимости, такой как функция, вызывающая другую, или функция, использующая переменную, или группа функций, выполняющих аналогичную задачу, их сродство становится сильнее, и поэтому их вертикальное расстояние должно быть меньше. Следуйте приведенному ниже коду.
Cookie cookie = new;
function addPersistentCookie(Cookie cookie) {
    if (isExpired(cookie)) {
         self.allCookies[self.allCookies.length()] = cookie;    
    }
}

function isExpired(Cookie cookie) returns boolean {
    time:Time curTime = time:currentTime();
    if (cookie.expires < curTime.time) {
        return true;
    } else {
        return false;
    }
}

C) Горизонтальное пустое пространство можно использовать для обозначения сильно связанных вещей и отделения слабосвязанных.

  • Оставляйте пробелы с обеих сторон оператора присваивания. Эти пробелы делают очевидным разделение имени переменной и значения.
int maxAge = 0;
  • В блоке while или if оставляйте пробел между if / while и круглыми и фигурными скобками. Посмотрите, как в приведенном ниже коде сохраняются пробелы.
if (self.expires == "" && self.maxAge == 0) {
    return false;
} else {
    return true;
}

while (i < myArray.length()) {
    i = i + 1;
}
  • Не оставляйте пробел между именем функции и параметрами.
  • Сохраняйте запятую и пробел между аргументами в функции.
boolean isPersistent(maxAge, expires) {
    if (expires == ""  && maxAge == 0) {
        return false;
    } else {
        return true;
    }
}
  • Оставляйте пробелы, чтобы сосредоточить внимание на приоритете операторов.
  (-b - Math.sqrt(determinant)) / (2*a);
  • Лучше использовать невыровненное объявление и присваивание переменных (если мы не искушаем смотреть только на имена переменных, не обращая внимания на тип, значения или оператор присваивания).
//Avoid this                                                   
public string    name =         "SID003";                     
public string    value =        "7388984hjs";                 
public string    domain =       "example.com";              
public string    path =         "/sample";                    
public int       maxAge =       3600;                         
public time:Time creationTime = time:currentTime();         

//Use this
public string name = "SID003";
public string value = "7388984hjs";
public string domain = "example.com";
public string path = "/sample";
public int maxAge = 3600;
public time:Time creationTime = time:currentTime();
  • Мы должны уделять больше внимания отступу в коде. Объявление класса не имеет отступа, но функции внутри класса имеют отступ на один уровень справа от класса. Содержимое метода смещено на один уровень вправо от метода. Это правило также применяется к отступу в блоке. (if block или while block). В большинстве случаев мы рассматриваем одноуровневый отступ как четыре пробела (одна табуляция). Проверьте, как используется отступ в следующем коде.
class Cookie {
    string name = "SID003";
    string value = "38748bnndx";
    
    boolean isValid(name, value) {
        if (name == "" || value == "") {
            return false;
        } else {
            return true;
        }
    }
}
  • Не пытайтесь нарушить это правило для коротких циклов if, while или коротких функций.
//Avoid this
public string render() throws Exception { return ""; }

//Use this
public string render() throws Exception {
    return "";
}
  • И убедитесь, что фиктивные тела в определенных блоках вашего кода также имеют правильный отступ.
while (this.read(buf, 0, readBufferSize) != -1) 
    ;

2- Далее мы увидим, как использовать значимые имена в вашем коде. Когда мы занимаемся программированием, мы должны использовать разные имена в нашем коде для объявления переменных, констант, функций и классов ... Но не забывайте использовать значимые имена, если скорость wtfs в минуту для вашего кода не станет выше: D: D

A) Всегда старайтесь использовать намеренно раскрывающие имена. Имя должно показывать, какова цель и почему она существует.

int d; //days since creation        -  dirty code
int daysSinceCreation;              -  clean code

Б) Избегайте использования дезинформации (непоследовательного написания и ложных выводов) в названиях.

Пример: - Использование L в нижнем регистре или O в верхнем регистре можно спутать с единицей и нулем. И если использовать имя как accountList, но на самом деле это не список, то это может дать дезинформацию.

В) По возможности используйте произносимые имена.

--dirty code                   --clean code
 Date genymdhms;               Date generationTimeStamp;
 String rqstPath;              String requestPath;
 String cmt;                   String comment;

D) Используйте имена с возможностью поиска. Однобуквенные имена следует использовать только как локальные переменные внутри короткого метода. Длина имени определяется размером его области. Если имя используется в нескольких местах, лучше использовать удобное для поиска имя.

Пример: -Если мы используем константу как WORK_DAYS_PER_WEEK для представления 5, будет легче найти ее, чем искать во всех местах, где использовалось 5.

E) Не нарушайте традиционные имена переменных и не заставляйте читателей мысленно переводить имена, которые они уже знают, на другие имена.

Пример: -Используйте счетчик цикла как i, j или k. Не используйте другие названия для счетчика циклов.

F) Делайте значимые различия, чтобы читатель мог понять, в чем разница между двумя названиями. Вы не можете использовать одно и то же имя для обозначения двух разных вещей в одной и той же области.

Пример: - «product, productData, productInfo» - это разные имена, но между ними нет никакого смысла. «информация и данные», «a и an» - безразличные шумовые слова. Не используйте такие имена. Другими примерами безразличных имен являются «product и theProduct», «customer, customerObject и customerInfo »,« деньги и moneyAmount.

G) Используйте существительное или существительное, но не глагол в названиях классов. И используйте глагол или глагольную фразу для имен методов (можно использовать префиксы set, get).

H) По возможности постарайтесь добавить содержательный контекст.

Пример: -предположим, мы должны сформировать адрес, используя переменные. Мы можем использовать имя как «addStreet», «addState» для переменных вместо использования «street» и « состояние ».

I) Все переменные, функции и классы должны использовать стиль CamelCase. Единственная разница в том, что первая буква класса должна быть заглавной. Константы должны использовать все заглавные буквы и разделяться подчеркиванием, если они состоят из двух слов.

class Example {
    int maxAge = 0;
    boolean httpOnly = false;
    const string EQUALS = "=";
    boolean isValid() {
        //body
    }
}

3- Использование модульных тестов также является очень важной частью, как и производственный код, поскольку модульные тесты повышают гибкость, удобство сопровождения и удобства использования нашего кода. Читаемость делает тест чистым. Здесь убедитесь, что каждый тест имеет один и только один оператор assert, а также только одну концепцию следует тестировать в каждой тестовой функции. Чистые тесты должны иметь не более пяти функций.

  • Быстро - тесты должны выполняться быстро.
  • Независимые -тестовые функции не должны зависеть друг от друга.
  • Повторяющиеся тесты должны иметь возможность запускаться в любой среде.
  • -Тесты с самопроверкой должны иметь логический вывод, пройден или не пройден.
  • Своевременные модульные тесты должны быть написаны до производственного кода. Тестовые функции должны выполняться своевременно.

Надеюсь, это поможет вам при написании чистого кода. В следующей статье я расскажу о функциях и использовании комментариев…. : D Удачного кодирования !!

Использованная литература :

Чистый код - «Справочник по Agile Software Craftsmanship» - Роберт Мартин.