Вы когда-нибудь страдали от плохого кода? Если вы программист, вы определенно так себя чувствовали. Возможно, вы полностью испортили свой собственный плохой код ...
Единственным допустимым показателем качества кода является 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» - Роберт Мартин.