Как найти вонючие части вашего кода [Часть XXXVIII]

Как найти вонючие части вашего кода [Часть XXXVIII]

5 июня 2023 г.

Это пахнет, потому что, вероятно, есть много случаев, когда его можно отредактировать или улучшить.

Большинство этих запахов — просто намеки на то, что что-то может быть не так. Следовательно, их не обязательно исправлять как таковые… (Тем не менее, вы должны изучить это.)

Пахнет предыдущим кодом

Вы можете найти все предыдущие запахи кода (Часть I – XXXVII) здесь.

n Продолжим...


Code Smell 186 — Жестко прописанные бизнес-условия


Вы FTX, и ваш код допускает особые случаи

<цитата>

TL;DR: не добавляйте в код жестких бизнес-правил.

Проблемы

  • Открытое/закрытое нарушение принципа
  • Жесткое кодирование
  • Тестируемость

Решения

  1. Подтвердите условие.
  2. Создайте параметры конфигурации и установите исключение для поведения конфигурации.
  3. Не используйте Настройки/Конфигурации.

Контекст

Согласно Reuters< /a> во время недавнего скандала с FTX было жестко закодировано условие, позволяющее пропустить контроль рисков в собственном портфеле.

Код был явным, и разработчики знали об этом правиле.

Пример кода

Неверно

Правильно

Обнаружение

Мы можем искать первичные жестко заданные условия (связанные с примитивными типами).

У нас может быть больше ложных срабатываний, чем реальных проблем.

Теги

Заключение

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

Отношения

Code Smell 133 — Жестко закодированные условия IF

Code Smell 29 — Настройки/Конфигурации

Подробнее

Кредиты

Фото Александра Милса на странице Скрыть


<цитата>

Информатика инвертирует нормальное. В обычной науке вам дан мир, и ваша задача — выяснить правила. В информатике вы даете компьютеру правила, и он создает мир.

Алан Кей

Великие цитаты о разработке программного обеспечения


Код Запах 187 — Если/иначе наоборот

Первое, что мы читаем после условия if, это IF

<цитата>

TL;DR: у вас есть важное условие else для else.

Проблемы

  • Читаемость

Решения

  1. Поменять местами условия.

Контекст

Элегантно написать операторы IF не так просто, как кажется.

Есть много вариантов и вариантов.

Нам нужно обратить особое внимание на удобочитаемость.

Пример кода

Неверно

fun addToCart(item: Any) {
    if (!cartExists()) {
        // Condition is negated
        this.createCart();
        this.cart.addItem(Item);
        // Repeated Code
    }
    else {
        // Normal case is on the else clause
        this.cart.addItem(Item);
    }
}

Правильно

fun addToCart(item: Any) {
    if (cartExists()) {
        this.cart.addItem(Item);
    }
    else {      
        this.createCart();
        this.cart.addItem(Item);
    }
}   

fun addToCartShorter(item: Any) {
    if (!cartExists()) {
        this.createCart();
    }
    this.cart.addItem(Item);    
}

Обнаружение

  • [x] Полуавтоматический

Мы можем найти отрицательные выражения для условий IF и проверить этот анти-шаблон.

Теги

  • IF

Заключение

Нам нужно читать код как прозу.

Люди сначала читают стандартный случай, а затем исключительный.

Отношения

Code Smell 51 — Двойное отрицание

Code Smell 156 — Неявное прочее< /p>

Подробнее

Кредиты

Фото Карол Казаницки на Unsplash


<цитата>

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

Д. Гелернтер


Code Smell 188 – Повторяющиеся имена параметров

Используйте контекстные и локальные имена

<цитата>

TL;DR: не повторяйте названия параметров. Имена должны быть контекстными.

Проблемы

  • Дублирование
  • Читаемость

Решения

  1. Удалить повторяющуюся часть имени

Контекст

При использовании имен мы часто упускаем из виду, что слова зависят от контекста и их нужно читать как целое предложение.

Пример кода

Неверно

class Employee
  def initialize(@employee_first_name : String, @employee_last_name : String, @employee_birthdate : Time)
  end
end

Правильно

class Employee
  def initialize(@first_name : String, @last_name : String, @birthdate : Time)
  end
end

Обнаружение

  • [x] Полуавтоматический

Мы можем проверить имена параметров и попытаться найти дубликаты.

Теги

  • Именование

Заключение

Используйте короткие и контекстные имена для параметров.

Отношения

Code Smell 174 — Имя класса в атрибутах

Code Smell 87 – Несогласованная сортировка параметров

Кредиты

Фото Вольфганга Хассельмана на Unsplash


<цитата>

Как правило, программные системы не работают должным образом до тех пор, пока они неоднократно не использовались в реальных приложениях.

Дэвид Парнас


Code Smell 189 — Непродезинфицированный ввод

Плохие актеры есть. Нам нужно быть очень осторожными с их мнением.

<цитата>

TL;DR: очищайте все, что выходит из-под вашего контроля.

Проблемы

  • Безопасность

Решения

  1. Используйте методы очистки и фильтрации входных данных.

Контекст

Всякий раз, когда вы получаете входные данные из внешнего ресурса, принцип безопасности требует от вас проверки и проверки на наличие потенциально опасных входных данных.

Внедрение SQL – яркий пример угрозы.

Мы также можем добавить утверждения и инварианты для наших входных данных.

Более того, мы можем работать с объектами с ограниченным доступом< /а>.

Пример кода

Неверно

Правильно

Обнаружение

Мы можем статически проверять все входные данные, а также использовать инструменты тестирования на проникновение.

Теги

Заключение

Нам нужно быть очень осторожными с данными, которые мы не можем контролировать.

Отношения

Code Smell 121 — Проверка строк< /p>

Code Smell 178 — Нарушение подмножеств< /p>

Запах кода 15 – Пропущенные предварительные условия

Подробнее

Кредиты

Фото Джесс Зоерб на Unsplash


<цитата>

Компании должны производить свои собственные корпоративные системы так же часто, как компании, занимающиеся сетевой безопасностью, должны производить собственный аспирин.

Фил Саймон


Код Запах 190 – Ненужные свойства

Перестаньте думать о данных как об атрибутах. Они нужны только для подтверждения вашего поведения

<цитата>

TL;DR: не сосредотачивайтесь на случайных свойствах. Вам не понадобится их много.

Проблемы

  • Анемичные модели
  • Свойства раздувания
  • Нарушение YAGNI

Решения

  • Создавайте атрибуты только для поддержки ваших методов (поведения).

Контекст

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

Нам нужно добавить атрибуты «по запросу», когда будет достаточно доказательств. Объекты не являются «держателями данных».

Пример кода

Неверно

class PersonInQueue
  attr_accessor :name, :job

  def initialize(name, job)
    @name = name
    @job = job
  end
end

Правильно

class PersonInQueue

  def moveForwardOnePosition
    # implement protocol
  end
end

Обнаружение

  • [x] Полуавтоматический

Мы можем обнаружить неиспользуемые атрибуты.

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

Теги

  • Анемия

Заключение

Начните создавать свои объекты с протокола.

Добавляйте атрибуты только при необходимости.

Отношения

Code Smell 144 — Взаимозаменяемые объекты< /p>

Code Smell 01 — Анемичные модели

Code Smell 40 — DTO

Code Smell 109 — Автоматические свойства< /p>

Кредиты

Фото Мелани Понграц на Unsplash


<цитата>

Объектное мышление фокусирует наше внимание на пространстве проблемы, а не на пространстве решения.

Дэвид Уэст


Скоро появятся еще 5 запахов кода…


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE