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

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

9 марта 2023 г.

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

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

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

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

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


Code Smell 156 – еще неявное

Мы узнаем, если/иначе, в наш первый день программирования. Тогда мы забываем об остальном.

<цитата>

TL;DR: будьте откровенны. Даже с Else.

Проблемы

Решения

  1. Напишите явное else

Контекст

Если мы рано возвращаемся к предложению IF, мы можем опустить часть else.

После этого мы удаляем IF и используем полиморфизм.

Именно тогда мы пропускаем реальные дела.

Пример кода

Неверно

function carBrandImplicit(model) {
  if (model === 'A4') {
    return 'audi';
  }
  return 'Mercedes-Benz';
}

Правильно

function carBrandExplicit(model) {
  if (model === 'A4') {
    return 'audi';
  }
  if (model === 'AMG') {
    return 'Mercedes-Benz';
  }

  // Fail Fast
  throw new Exception('Model not found);
}

Обнаружение

  • [x] Автоматически

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

Мы также можем переписать их и провести мутационное тестирование.

Теги

  • Условия

Заключение

Такой запах вызывает много публичных споров и ненависти.

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

Отношения

Code Smell 102 – код стрелки< /p>

Code Smell 36 — Switch/case/else операторы if/else/if

Подробнее

Прекратите использовать неявное Else< /p>

Когда использовать неявное Else

Быстрая ошибка

Как навсегда избавиться от раздражающих IF

Кредиты

Фото Елены Можвило на странице Скрыть


<цитата>

Самая большая проблема в командах разработчиков ПО — убедиться, что все понимают, что делают все остальные.

Мартин Фаулер


Код запаха 157 — Баланс на уровне 0

Сегодня я ожидал платежа в своем кошельке. Баланс был 0. Я запаниковал.

<цитата>

TL;DR: Null — это не 0. Error — это не 0. просто 0 — это 0.

Проблемы

Решения

  1. Проведите четкое различие между нулем и ошибкой.

Контекст

Я много читал о проблемах безопасности.

Особенно в криптовалюте.

На прошлой неделе я прочитал о теме взлома криптовалюты.

Когда мой кошелек показал мне 0 на балансе, я запаниковал.

Это был просто запах UX.

Блокчейн был недоступен 💩

Пример кода

Неверно

"""
Below code is automatically generated by code-davinci-002 on GTP3 Codex

1. check balance with blockchain
2. If blockchain is unreachable show 0 as the balance
"""

import requests
import json

def get_balance(address):
    url = "https://blockchain.info/q/addressbalance/" + address
    response = requests.get(url)
    if response.status_code == 200:
        return response.text
    else:
        return 0      
"""
Below code is automatically generated by code-davinci-002 on GTP3 Codex

1. check balance with blockchain
2. If blockchain is unreachable throw an error
"""

import requests
import json

def get_balance(address):
    url = "https://blockchain.info/q/addressbalance/" + address
    response = requests.get(url)
    if response.status_code == 200:
        return response.text
    else:
        raise BlockchainNotReachableError("Error reaching blockchain")

Обнаружение

  • [x] Руководство

Это запах дизайна.

Мы можем найти закономерности, когда возникает исключение или код возврата выдается и маскируется 0.

Теги

  • Пользовательский интерфейс

Заключение

Всегда руководствуйтесь принципом наименьшего удивления.

Отношения

Code Smell 12 — Null

Code Smell 139 — Деловой код в пользовательском интерфейсе< /а>

Code Smell 73 — Исключения для ожидаемых случаев

Code Smell 72 — Коды возврата< /p>

Подробнее

Null: ошибка на миллиард долларов

Кредит

Фото Жасмин Сесслер на Unsplash

Отказ от ответственности

Запахи кода — это только мои мнение.

<цитата>

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

Тони Хоар (нулевой изобретатель)

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


Code Smell 158 — переменные не переменные


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

<цитата>

TL;DR: будьте декларативны в отношении изменчивости.

Проблемы

  • Читаемость
  • Учитывайте изменчивость биекции.
  • Возможные проблемы с производительностью и памятью.

Решения

  1. Замените переменную на константу и четко определите область ее действия.

Рефакторинг

Рефакторинг 003 — Извлечение константы

Рефакторинг 008 — преобразование переменных в константы

Контекст

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

Иногда мы предполагаем, что значение может измениться с помощью MAPPER.

Позже мы узнаем, что это не изменится.

Поэтому нам нужно повысить его до константы.

Это также позволит избежать магических констант.< /p>

Пример кода

Неверно

<?php

function configureUser() {
  $password = '123456';
  // Setting a password on a variable is another vulnerability
  // And Code Smell
  $user = new User($password);
  // Notice Variable doesn't change
}

Правильно

<?php

define("USER_PASSWORD", '123456')

function configureUser() {  
  $user = new User(USER_PASSWORD);
}

// or 

function configureUser() {  
  $user = new User(userPassword());
}

function userPassword() : string {
  return '123456';
}

// Case is an oversimplification as usual

Обнаружение

  • [x] Автоматически

Многие линтеры проверяют, имеет ли переменная только одно назначение.

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

Теги

  • Изменчивость

Заключение

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

Отношения

Code Smell 116 — переменные, объявленные с помощью 'var'< /а>

Code Smell 127 — Изменяемые константы< /p>

Code Smell 107 — Повторное использование переменных< /p>

Code Smell 02 — Константы и магические числа< /а>

Подробнее

Злая сила мутантов

Отказ от ответственности

Запахи кода — это только мои мнение.

Кредиты

Фото Ноя Бушера на Unsplash


<цитата>

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

Джон Галл


КОД ЗАПАХ 159 — MIXED_CASEI

Серьезной разработкой занимается множество разных людей. Мы должны начать соглашаться.

<цитата>

TL;DR: не смешивайте разные преобразования регистра

Проблемы

  • Читаемость
  • Удобство обслуживания

Решения

  1. Выберите стандарт дела.

2. Держитесь за него

Контекст

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

Некоторые предпочитают camelCase🐫, другие snake_case🐍, MACRO_CASE🗣️ и многие другие. р>

Код должен быть простым и читаемым.

Пример кода

Неверно

{
    "id": 2,
    "userId": 666, 
    "accountNumber": "12345-12345-12345",
    "UPDATED_AT": "2022-01-07T02:23:41.305Z",
    "created_at": "2019-01-07T02:23:41.305Z",
    "deleted at": "2022-01-07T02:23:41.305Z"
}

Правильно

{
    "id": 2,
    "userId": 666, 
    "accountNumber": "12345-12345-12345",
    "updatedAt": "2022-01-07T02:23:41.305Z",
    "createdAt": "2019-01-07T02:23:41.305Z",
    "deletedAt": "2022-01-07T02:23:41.305Z"
  // This doesn't mean THIS standard is the right one
}

Обнаружение

  • [x] Автоматически

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

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

Исключения

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

Теги

Заключение

Соответствовать стандартам легко.

Мы должны обеспечить их соблюдение.

Отношения

Запах кода 48 — Код без стандартов

Подробнее

Что такое имя? Часть I. Квест

Все соглашения об именах

Отказ от ответственности

Запахи кода — это только мои мнение.

Кредиты

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


<цитата>

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

Крейг Зеруни


Код запаха 160 — неверный идентификатор = 9999

Maxint – очень хорошее число для недопустимого идентификатора. Мы никогда не достигнем этого.

<цитата>

TL;DR: не связывайте настоящие идентификаторы с недействительными. На самом деле: избегайте идентификаторов.

Проблемы

* Вы можете получить неверный идентификатор раньше, чем думаете.

* Также не используйте null для недопустимых идентификаторов.

* Связывание флагов от вызывающего объекта с функциями.

Решения

  1. Моделирование особых случаев с помощью специальных объектов.

2. Избегайте 9999, -1 и 0, поскольку они являются допустимыми объектами предметной области и связаны реализацией.

3. Введите нулевой объект

Контекст

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

Затем мы изобрели ошибку на миллиард долларов.

Затем мы выросли и смоделировали специальные сценарии с полиморфными специальными значениями.

Пример кода

Неверно

#include "stdio.h"
#include "stdlib.h"
#include "stdbool.h"
#define INVALID_VALUE 999

int main(void)
{    
    int id = get_value();
    if (id==INVALID_VALUE)
    { 
        return EXIT_FAILURE;  
        // id is a flag and also a valid domain value        
    }
    return id;
}

int get_value() 
{
  // something bad happened
  return INVALID_VALUE;
}

// returns EXIT_FAILURE (1)

Правильно

#include "stdio.h"
#include "stdlib.h"
#include "stdbool.h"
// No INVALID_VALUE defined

int main(void)
{    
    int id;
    id = get_value();
    if (!id) 
    { 
        return EXIT_FAILURE;
        // Sadly, C Programming Language has no exceptions
    }  
    return id;
}  

get_value() 
{
  // something bad happened
  return false;
}

// returns EXIT_FAILURE (1)

Обнаружение

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

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

Теги

  • Нет

Заключение

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

Если внешний идентификатор не существует, то это не число.

Отношения

Code Smell 120 — последовательные идентификаторы< /p>

Code Smell 12 — Null

Подробнее

Null: ошибка на миллиард долларов

22 тысячелетие – ошибка, которая нас смущает

Отказ от ответственности

Запахи кода — это только мои мнение.

Кредиты

Фото Маркуса Списке на Скрыть


<цитата>

Жуки прячутся в углах и собираются на границах.

Борис Бейзер


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


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