Как найти вонючие части вашего кода [Часть XXXV]
17 апреля 2023 г.Это пахнет, потому что, вероятно, есть много случаев, когда его можно отредактировать или улучшить.
Большинство этих запахов — просто намеки на то, что что-то может быть не так. Следовательно, их не обязательно исправлять как таковые… (Тем не менее, вы должны изучить это.)
Пахнет предыдущим кодом
Вы можете найти все предыдущие запахи кода (Часть I–XXXIII) здесь. п
Продолжим...
Code Smell 171 – классы во множественном числе
Курсы — это то, что мне дорого
<цитата>TL;DR: классы представляют концепции. А концепции единственны.
Проблемы
- Именование
- Стандарты кода
Решения
- Переименовать классы в единственное число
Контекст
Называть вещи сложно.
Нам необходимо согласовать определенные правила.
Пример кода
Неверно
class Users
Правильно
class User
Обнаружение
- [x] Автоматически
Это синтаксическое правило.
Теги
- Именование
Заключение
Назовите понятия в единственном числе.
Классы — это понятия.
Подробнее
Что такое имя - Часть II Реабилитация р>
Отказ от ответственности
Запахи кода — это только мои мнение.
Кредиты
Фото Антона Маланина на Unsplash
<цитата>
Мы все еще находимся в зачаточном состоянии, чтобы называть то, что на самом деле происходит в проектах разработки программного обеспечения.
Алистер Кокберн
Великие цитаты о разработке программного обеспечения
Code Smell 172 – значения аргументов по умолчанию не являются последними
Сигнатура функции должна быть очищена от ошибок
<цитата>TL;DR: не используйте необязательные аргументы перед обязательными. На самом деле: вообще не используйте необязательные аргументы
Проблемы
- нарушение принципа Fail Fast
- Читаемость
Решения
- Переместите необязательные аргументы в последнюю очередь.
- Избегайте необязательных аргументов.< /li>
Контекст
Необязательные аргументы — это запах кода.
Определение необязательных аргументов перед обязательными является ошибкой.
Пример кода
Неверно
<?
function buildCar($color = "red", $model) {
//...
}
// First argument with optional argument
buildCar("Volvo");
// Runtime error: Too few arguments to function buildCar()
Правильно
<?
function buildCar($model, $color = "Red", ){...}
buildCar("Volvo")}}
// Works as expected
def functionWithLastOptional(a, b, c='foo'):
print(a)
print(b)
print(c)
functionWithLastOptional(1, 2)
def functionWithMiddleOptional(a, b='foo', c):
print(a)
print(b)
print(c)
functionWithMiddleOptional(1, 2)
# SyntaxError: non-default argument follows default argument
Обнаружение
- [x] Автоматически
Многие линтеры могут применять это правило, поскольку мы можем вывести его из сигнатуры функции.
Кроме того, многие компиляторы прямо запрещают это.
Теги
- Читаемость
Заключение
Старайтесь быть строгими при определении функций, чтобы избежать связывания.
Отношения
Code Smell 19 – необязательные аргументы
Подробнее
Отказ от ответственности
Запахи кода — это только мои мнение.
Кредиты
Фото Мануэля Торреса Гарсии на Скрыть
<цитата>
Программы предназначены для чтения людьми и только для случайного выполнения компьютерами.
Дональд Кнут
Code Smell 173 – Разбитые окна
Всегда оставляйте палаточный лагерь чище, чем вы его нашли». Если вы обнаружите беспорядок на земле, вы уберете его независимо от того, кто его устроил.
<цитата>TL;DR: Следуйте правилу бойскаутов дяди Боба.
Проблемы
- Читаемость
- Удобство обслуживания
Решения
- Оставьте код лучше
- Изменить
Контекст
Мы читаем код гораздо чаще, чем пишем.
Мы должны взять на себя ответственность за код с ошибками и оставить его в лучшем виде.
Пример кода
Неверно
int mult(int a,int other)
{ int prod
prod= 0;
for(int i=0;i<other ;i++)
prod+= a ;
return prod;
}
// Formatting, naming, assignment and standards inconsistent
Правильно
int multiply(int firstMultiplier, int secondMultiplier) {
int product = 0;
for(int currentIndex=0; currentIndex<secondMultiplier; currentIndex++) {
product += firstMultiplier;
}
return product;
}
// or just multiply them :)
Обнаружение
- [x] Полуавтоматический
Мы можем использовать другие детекторы запаха кода и оставить код в лучшем виде.
Теги
- Стандарты
Заключение
Мы должны следовать правилу бойскаутов и оставить код лучше.
Отношения
Code Smell 164 — Смешанные отступы< /p>
CODE SMELL 159 — MIXED_CASE р>
Отказ от ответственности
Запахи кода — это только мои мнение.
Кредиты
Фото Павла Червински на сайте Скрыть
<цитата>
Одно разбитое окно, оставленное без ремонта, вселяет в обитателей здания чувство заброшенности. Люди начинают мусорить. Появляется граффити. Начинаются серьезные структурные разрушения. За относительно короткий промежуток времени здание повреждается
Энди Хант
Code Smell 174 — Имя класса в атрибутах
Повторяющиеся имена — это плохой запах. Имена должны быть контекстными
<цитата>TL;DR: не добавляйте к своим атрибутам префикс имени класса
Проблемы
- Неконтекстные имена
Решения
- Удалить префикс класса из атрибута
Контекст
Это запах именования, мы не должны читать атрибуты изолированно, а имена зависят от контекста.
Пример кода
Неверно
public class Employee {
String empName = "John";
int empId = 5;
int empAge = 32;
}
Правильно
public class Employee {
String name;
int id; // Ids are another smell
int age; // Storing the age is yet another smell
}
Обнаружение
- [x] Полуавтоматический
Если полное имя включено в префикс, наши линтеры могут предупредить нас.
Теги
- Именование
Заключение
Тщательное присвоение имен – очень важная задача.
Нам нужно назвать поведение, а не тип или данные
Отношения
Code Smell 188 — избыточные имена параметров
Code Smell 141 — IEngine, AVehicle, ImplCar а>
Подробнее
Что такое имя - Часть II Реабилитация р>
Отказ от ответственности
Запахи кода — это только мои мнение.
Кредиты
Фото Феникс Хан на Unsplash
<цитата>
Копирование пропускает понимание. Понимание — это то, как вы растете. Вы должны понять, почему что-то работает или почему что-то так оно и есть. Когда вы копируете это, вы упускаете это. Вы просто переназначаете последний слой вместо того, чтобы разбираться во всех нижних слоях.
Джейсон Фрид
Code Smell 175 — Изменения без покрытия
Если в вашем мерж-реквесте не был изменен тест, вы не завершили свою работу
<цитата>TL;DR: не меняйте код, не нарушив некоторые тесты.
Проблемы
- Качество
- Удобство обслуживания
Решения
- Закройте свой код.
Контекст
Когда вам нужно внести изменения, вам нужно обновить текущую спецификацию вашего кода.
Для этого и нужны тесты.
Вместо того, чтобы создавать мертвую документацию о том, что делает ваш код, вы должны написать покрывающий сценарий использования.
Если вы изменяете непокрытые тесты, вам необходимо добавить покрытие.
Предположим, вы изменили код с существующим покрытием. Повезло тебе! Идите и измените свои сломанные тесты.
Пример кода
Неверно
export function sayHello(name: string): string {
const lengthOfName = name.length;
- const salutation = `How are you ${name}?, I see your name has ${lengthOfName} letters!`;
+ const salutation = `Hello ${name}, I see your name has ${lengthOfName} letters!`;
return salutation;
}
Правильно
export function sayHello(name: string): string {
const lengthOfName = name.length;
- const salutation = `How are you ${name}?, I see your name has ${lengthOfName} letters!`;
+ const salutation = `Hello ${name}, I see your name has ${lengthOfName} letters!`;
return salutation;
}
import { sayHello } from './hello';
test('given a name produces the expected greeting', () => {
expect(sayHello('Alice')).toBe(
'Hello Alice, I see your name has 6 letters!'
);
});
Обнаружение
- [x] Автоматически
Мы можем убедиться, что все наши запросы на слияние включают тестовый код.
Исключения
Если ваш код и ваши тесты находятся в разных репозиториях, у вас могут быть разные запросы на вытягивание.
Теги
- Качество
Заключение
Покрытие тестами так же важно, как и функциональный код.
Система тестирования — наш первый и более лояльный клиент.
Мы должны заботиться о них.
Отношения
Code Smell 05 — Нарушители комментариев
Отказ от ответственности
Запахи кода — это только мои мнение.
Кредиты
Фото Венсана Пере на Unsplash
<цитата>
Прежде чем использовать метод в устаревшей системе, проверьте, есть ли для него тесты. Если их нет, напишите. Когда вы делаете это последовательно, вы используете тесты как средство коммуникации.
Майкл Фезерс
Скоро появятся еще 5 запахов кода…
Оригинал