Логотип ConstructiCat
CodeBust.
Навигация по разделу ▾

Одержимость элементарными типами.

Элементарные типы используются вместо маленьких объектов для небольших задач (валюта, диапазоны, специальные строки для телефонных номеров и т. п.), константы — для кодирования информации (например, USER_ADMIN_ROLE = 1 для пользователей с правами администратора), а строковые константы — в качестве названий полей в массивах данных.

##Признаки и симптомы

  • Использование элементарных типов вместо маленьких объектов для небольших задач (например, валюта, диапазоны, специальные строки для телефонных номеров и т. п.)

  • Использование констант для кодирования какой-то информации (например, константа USER_ADMIN_ROLE = 1 для обозначения пользователей с ролью администратора).

  • Использование строковых констант в качестве названий полей в массивах.

void register(String email, String phone, String zip, int year, int month, int day) {
  if (!email.contains("@")) throw new IllegalArgumentException("email");
  if (phone.length() < 7) throw new IllegalArgumentException("phone");
}

##Причины проблемы

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

Примитивные типы нередко используются для «симуляции» типов. Это когда вместо отдельного типа данных вы имеете набор чисел или строк, который составляет список допустимых значений для какой-то сущности. Зачастую этим конкретным числам и строкам даются понятные имена с помощью констант, что и является причиной их широкого распространения.

Ещё одним плохим способом использования примитивных типов является «симуляция» полей. При этом класс содержит большой массив разнообразных данных, а в роли индексов массива для получения этих данных используются строковые константы, заданные в классе.

##Лечение

##Результат

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

  • Улучшает понимание и организацию кода. Операции над определёнными данными теперь собраны в одном месте, и их не надо искать по всему коду. Теперь не нужно догадываться, зачем созданы все эти странные константы и почему поля содержатся в массиве.

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