Одержимість елементарними типами
Симптоми і ознаки
-
Використання елементарних типів замість маленьких об’єктів для невеликих завдань (наприклад, валюта, діапазони, спеціальні рядки для телефонних номерів і тому подібне).
-
Використання констант для кодування якоїсь інформації (наприклад, константа
USER_ADMIN_ROLE = 1
для позначення користувачів з роллю адміністратора). -
Використання рядкових констант як назв полів в масивах.
Причини появи
Як і більшість інших запахів, цей розпочинається з маленької слабкості. Програмістові знадобилося поле для зберігання якихось даних. Він подумав, що створити поле елементарного типу куди простіше, ніж новий клас. Це й було зроблено. Потім знадобилося інше поле, і воно також було додане схожим чином. А потім не встигли ви озирнутися, як клас вже збільшився до грандіозних розмірів.
Примітивні типи досить часто використовуються для «симуляції» типів. Це коли замість окремого типу даних у вас є декілька чисел або рядків, які складаються в список допустимих значень для якоїсь сутності. Найчастіше цим конкретним числам і рядкам дають зрозумілі імена за допомогою констант, що і стає причиною їх широкого поширення.
Ще одним поганим методом використання примітивних типів є «симуляція» полів. При цьому клас містить великий масив різноманітних даних, а в ролі індексів масиву для отримання цих даних використовуються строкові константи, задані в класі.
Лікування
-
Якщо ви маєте безліч різноманітних полів примітивних типів, можливо, деякі з них можна логічно згрупувати і перенести в свій власний клас. Ще краще, якщо в цей клас ви зможете перенести і поведінку, пов’язану з цими даними. Впоратися з цією проблемою допоможе заміна значення даних об’єктом.
-
Якщо значення цих полів використовуються в параметрах методів, використайте заміну параметрів об’єктом або передачу всього об’єкта.
-
У випадках, коли в змінних закодовані якісь складні дані, використайте заміну кодування типу класом, заміну кодування типу підкласами або заміну кодування типу станом/стратегією.
-
Якщо серед змінних є масиви, використайте заміну масиву об’єктом.
Виграш
-
Підвищує гнучкість коду завдяки використанню об’єктів замість примітивних типів.
-
Покращує розуміння і організацію коду. Операції над певними даними тепер зібрані в одному місці, і їх не потрібно шукати по всьому коду. Тепер не треба здогадуватися, навіщо створені всі ці дивні константи і чому поля містяться в масиві.
-
Може розкрити факти дублювання коду.