Які анти-шаблони іменування існують? [зачинено]


35

Є деякі імена, де, якщо ви виявите, що дотягуєтесь до цих імен, ви знаєте, що вже щось зіпсували.

Наприклад:

XxxManager
Це погано, оскільки клас повинен описувати, що робить клас. Якщо найбільш конкретне слово, яке ви можете придумати для того, що робить клас, - це "керувати", то клас занадто великий.

Які ще анти-шаблони іменування існують?

Для уточнення я не запитую "які імена погані" - це питання цілком суб'єктивне, і немає можливості відповісти на нього. Я запитую, "які назви вказують на загальні проблеми дизайну в системі". Тобто, якщо ви хочете викликати компонент Xyz, це, ймовірно, вказує на те, що компонент погано сприймається. Також зауважте, що з кожного правила є винятки - я просто шукаю попереджувальні прапори, коли мені справді потрібно зупинитись і переосмислити дизайн.



4
Для тих, хто голосує, щоб закрити як "неконструктивне" - ви б готові пояснити причину, чому? Єдине, з чим це не дуже добре, це те, що відповіді можуть бути короткими, але це, безумовно, відповідає іншим п'яти рекомендаціям ...
Біллі ONeal


2
@Aaronaught: Будь-які пропозиції? Я чітко сформулював це, як я можу в редагуванні ....
Біллі ONeal

1
@jhocking - Я погоджуюся з деяким із цього посилання - особливо, що про те, що "Менеджер" та "Обробник" є надто цінними, щоб їх відпустити. І я не те, що продається на основі дизайну та інших альтернатив, які в багатьох випадках здаються принаймні такими ж невиразними. Іноді "Черга" чи що завгодно може бути доречним, але часто той факт, що менеджер зберігає (або посилається) на елементи у черзі, є лише одним аспектом управління цими елементами. Як щось корисне виражає "менеджер" як назву вакансії, IMO те саме стосується і OOP.
Steve314

Відповіді:


22

Наступні імена анти-шаблонів пов'язані з .NET і, особливо, C #:

  • Невідповідності . Якщо ви вирішили почати кожне ім'я поля з головного підкреслення, дотримуйтесь його .
  • Абревіатури Ambiguos з відсутніми голосними . Я серйозно бачив такі назви полів, як cxtCtrlMngr. Ви навряд чи здогадуєтесь, на що це повинно стояти.
  • Занадто довгі і багатослівні назви змінних . ILoginAttemptRepositoryдобре і описово - ILoginAttemptRepositoryUsingEntityFrameworkForObjectRelationalMappingє описовим, але, безумовно, непоганим.

7
Є Iозначало мати на увазі , interfaceтут, implementerабо першої особи однини? Оскільки більшість класів реалізує інтерфейс, занадто велика кількість класів / взаємодій стартових з великим рахунком - Iце неприємність, що перешкоджає читаемості та запаху коду.
користувач невідомий

3
+1 для "Абревіатури Амбігуоса з пропущеними голосними", вони зводить мене з розуму!
FrustratedWithFormsDesigner

6
@Billy ONeal: C ++ має інтерфейси; вони просто не штучно відокремлені від класів. ;)
Джон Перді

4
@Billy ONeal: Це був мій погляд.
Джон Перді

2
@MariusSchulz: О так, я згоден з вами :) Просто подумав, що це не така жахливо непрозора абревіатура.
amara

9

Я часто стикаюся з тим, що взагалі не використовую жодного шаблону імен. Як правило, це вказує на незнання розробника (що іменування моделей - це добре ), а також цей антидіапазон має тенденцію до грубого порушення SRP шляхом введення в цей клас самих різних способів, які пов'язані з класом, таким чином, наприклад, клієнт клас має властивості, методи CRUD, все, що віддалено пов’язане із замовником, якого потребує частина програми.

Додам також, що використовувати "Engine" як суфікс - це приблизно те саме, що використовувати "Manager". Це дуже розпливчасто, і клас, який називається, XxxEngineмає тенденцію до того, що становить модуль у стилі VB, що містить безліч методів, тому він знаходиться в одному "простому у використанні" місці, без будь-якого знання та ідеї об'єктно-орієнтованого програмування.


7

Ну, найпростіші відповіді спочатку: введіть угорський ( http://mindprod.com/jgloss/unmainnaming.html , також є чудові інші ідеї. Більш збалансований погляд на те, коли угорщина не є злою, http://www.joelonsoftware.com /articles/Wrong.html )


7
Угорська нотація ЗАВЖДИ зла :)
Уейн Моліна

12
@Wayne: Насправді це не завжди зло. Я працював у Чарльза в Xerox наприкінці 70-х, і первісна система імен була рятівницею. Ми працювали в BCPL, який має 1 тип: ціле число. Все інше про тип передавались із використанням конвенцій про використання та іменування. У нас було 7 програмістів + ​​Чарльз, і будь-хто з нас міг зайти в чужий код і відразу бути продуктивним. Це не означає, що це не може бути жахливо скрученим / неправильно застосованим (навіть Чарльзом), лише те, що в правильному контексті це було правильним рішенням.
Пітер Роуелл

3
@Marius: Прочитайте статтю Джоеля. Система типів не завжди може застосовувати всі смислові відмінності між змінними. Intellisense також не допомагає в таких випадках.
Біллі ONeal

4
Тип простіше зробити, ніж використовувати, особливо з сучасними редакторами. Однак для цього потрібна дисципліна. Не потрібно все префіксувати . Я працюю на Java, і в більшості випадків додатки угорської мови не потрібні, але коли я роблю щось, що вимагає декількох однотипних змінних (наприклад, відX і toX) в системах координат, це рятувальник.
Майкл К

3
Що було б добре - це загальна здатність легко створювати нові типи. "Цей схожий на int, за винятком того, що він стосується номерів рядків."
Девід Торнлі

6

Префіксація "Я" до імені інтерфейсу, або "Анотація" до імені абстрактного класу. Це може бути виправданим у мовах, які не мають поняття абстрактних класів або не розрізняють інтерфейси та абстрактні класи - але, наприклад, у Java це завжди погана ідея.

Крім того, я не згоден з вами у справі менеджера. Я використовую цей шаблон іноді, і це просто означає, що якби я спробував назвати його чимось іншим, то ім'я не було б більш описовим, ніж XxxxxManager. Є деякі завдання (не обов'язково складні), які просто неможливо чітко узагальнити одним або двома словами.


@Mike: Я повністю не згоден з вашим твердженням, вибачте. На мою думку, XxxxManagerце найгірше можливе ім’я класу. Звичайно, він чимось керує! Ось чому це було написано. Managerце безглузде слово-заповнювач, яке не додає ніякого значення розумінню - за своєю назвою - за що відповідає клас.
Маріус Шульц

1
А як, скажімо TabManager,? Отримаєте кращу назву для класу, який керує механізмом вкладки JSP? Або задихайтеся TabController ... Що стосується префіксів Abstract, я вважаю, що це надто часто використовується, але часто є дійсним (див. Приклади бібліотек Java). Я думаю, що можу з упевненістю сказати, що я ніколи не бачив Iінтерфейсів у будь-якому місці, де хтось не намагався програмувати проти інтерфейсу, якого не повинно було бути. Мовляв, лише один клас реалізує інтерфейс.
Майкл К

1
@Darien (та інші): У будь-якому випадку - це не має значення. Жодне з цих імен не є анти-зразком (і тому вони поза темою для цього питання). Я не думаю, що ви можете нічого сказати про дизайн системи, незалежно від того, користуєтесь вона IXxxчи ні XxxImpl.
Біллі ONeal

2
Це просто цілком, абсолютно неправильно. Є дуже вагомі причини, щоб візуально відрізняти інтерфейси від класів: (а) вони не можуть бути ідентифіковані, (б) їх не можна звільнити / знешкодити, (в) їх не можна серіалізувати, (г) вони можуть бути прокси / перехоплення тощо, і т. д., і т. д. Ви тільки що викинули щось, що особисто вам не подобається (з якоїсь химерної та незрозумілої причини) як приклад антидіаграму без будь-якого обґрунтування.
Aaronaught

1
По можливості інтерфейси слід віддавати перевагу конкретним класам для типів аргументів та типів повернення. Тому інтерфейси мають сенс отримувати "чисті" імена, а конкретні реалізації (фактичний тип яких абонент може навіть не знати і не піклуватися про них) для отримання бородавок.
Кевін Крумвіде

6

Speeling:

У мене схильна інвалідність і не можу писати. За допомогою перевірки орфографії я безсилий, я намагаюся скопіювати всі імена, які я створюю, в текстовий процесор для перевірки, але я завжди пропускаю їх. У своєму останньому проекті я написав значну частину api, і, мабуть, я не перевірив правопис, коли я вперше застосував слово відповідь, і я припустив, що це правильно, тому що ніхто мені не сказав. У нас було щонайменше 50 функцій з відповіддю на неї. Нова команда прийшла в команду і запитала, чому ми використовуємо реакцію, я відчував себе справді німим.


2
Я коротко використовував плагін jQuery, де був один із параметрів affect(замість ефекту). Це зводило мене з розуму, і я швидко знайшов інший плагін, щоб зробити те саме.
zzzzBov

4
Найгірша проблема, яку я маю з цим, полягає в тому, що, коли я бачу неправильне написане ім’я, це дійсно шкодить моїй здатності запам’ятовувати, що таке імена.
Девід Торнлі

1
Погіршується, коли однакові речі написані по-різному в різних частинах коду. Як і коли у вас є напруженість поля класу Srtength, доступ до якого здійснюється методом getStrenth ().
Єва

5

Ну боюся, мої думки трохи суперечливі. Але давайте спробуємо ...

Що стосується мене, я маю згоду з Майком Баранчаком, такі імена, як XxxController, XxxHandler - це те, що ми справді часто використовуємо. Для нас Контролер - це щось на кшталт вхідної точки для чогось "інкапсольованого", наприклад управління транзакціями, боротьба з несподіваними помилками, виклик XxxHandler для виконання фактичної роботи. Я б сказав, що XxxManager - синонім контролера. Я думаю, що важливо не використовувати Менеджер в одному випадку, а Контролер в іншому. Бути послідовним дуже важливо, якщо ти працюєш у команді.

Було б дуже важко або, можливо, навіть неможливо знайти кращі назви таких предметів. Xxx слід правильно вибрати, щоб зробити ситуацію більш зрозумілою.

Мені особисто не подобається, коли метод, який називається get ... or set ..., є більш ніж простим аксесуаром. Мені подобається det ... для визначення.

Інша річ, що спадає мені на думку: за словами дядька Боба. Значення "І" у назві методу є ознакою того, що потрібно робити багато. Але життя не завжди є просто чорно-білим - бувають ситуації, коли я думаю, що це нормально - наприклад. через проблеми з ефективністю (коли у вас уже є дані, щоб перевірити, чому їх не обробити) ...

Я особисто також великий фанат системних угорських позначень - більшу частину часу ви маєте справу з вихідним кодом в IDE. Але часто ви використовуєте лише редактор або переглядаєте репо в браузері. Одним з недоліків може бути підтримка інструментів через префікси типу ...

Я думаю, що найважливіше - це для мене незмінність - субоптимальна умова - це краще, ніж відсутність умовності ...


1
"Контролер" має іншу семантику, ніж "Менеджер". Особисто мені це не подобається, але "Controller" отримує повний, оскільки це загальний компонент багатьох моделей, особливо MVC. XxxHandler так само погано. Якщо клас просто "обробляє" щось - то або клас занадто великий, або його слід просто називати "Xxx" частиною.
Біллі ONeal

3
"Було б дуже важко або, можливо, навіть неможливо знайти кращі назви таких предметів" - якщо б ви не спроектували належну ієрархію свого типу з чітко визначеними залежностями та обов'язками. Звичайно, якщо ви використовуєте "Controller" як частину MVC або "Handler" для загального обробника події / повідомлення, то це інакше - це приклади жаргону, - але якщо вони просто використовуються як загальні назви недоброзичливців, визначені класи, то це головний червоний прапор.
Aaronaught

5

Мабуть, найгірший іменний анти-шаблон - це такий:

create table stuff(..., foo1 string, bar1 string,
                        foo2 string, bar2 string, 
                        foo3 string, bar3 string, ...)

У нас є триелементний список [foo, bar] пар. Якщо нам потрібен четвертий, нам доведеться додати нові таблиці до таблиці.

Ведучий до такого коду:

'SELECT foo' + i + ', bar' + i + ' FROM stuff'

Слід створити окрему таблицю із стовпчиками foo та bar та пов’язати з таблицею матеріалів

create table fubar(foo string, bar string, stuff_id long)

Друге найгірше - це:

class Student {
  ...
  String homeStreet;
  String homeCity;
  String homeState;
  String permStreet;
  String permCity;    
  String permState;
  ...
}

Тут ми маємо шість полів замість двох примірників класу Адреса.

Цей антидіапазон позначений низкою імен з двох частин, у яких перераховано кожну комбінацію двох наборів, наприклад [foo, bar] x [1,2,3] або [home, perm] x [вулиця, місто, штат]


-1 - це взагалі не згадує назву.
Біллі ONeal

Анти-шаблон для імен не може містити більше одного імені?
Кевін Клайн

Як надто багато аргументів, які ==називають антипатерн? Я збентежений.
Біллі ONeal

1
наскільки я його розумію, конвенція є такою, яка дозволяє номери, де потрібно взяти фактичну назву. Ці цифри призводять до помилкового враження, що елементи є деяким списком або масивом
keppla

3
@Billy ONeal: Так. Проблема дизайну полягає у відсутності нормалізації, а числові суфікси - це назви, що вказують на нього.
reinierpost

3

Будь-яке іменування класу чи інтерфейсу, яке є тавтологією, є поганим, не тільки на Java, про яке йдеться в посиланні, але й будь-якою мовою.

Тавтологія (риторика), використовуючи різні слова, щоб сказати одне і те ж, навіть якщо повторення не забезпечує ясності.


2
Цікаво. Будь-які приклади?
Майк Баранчак

2
Я читаю посилання, там написано "тавтологія" ...;)
Benjol

10
Перше правило тавтологічного клубу - це перше правило клубу тавтології.
Cercerilla

Я прочитав посилання (добре, вміст посилання) і не знайшов прикладів
barjak

гаразд, відповідно до цього посилання, ми повинні припинити використання I <InterfaceName> ... правильно.
Дал,

3

Я часто зустрічаю бібліотеки програм із загальними назвами, такими як Libraryабо Common. Вони вказують на неоптимальний дизайн: розробники докладають зусиль, щоб уникнути дублювання коду, але без будь-якої спроби створити дизайн, розкладений на основі функціональності.


+1 - Я бачу "Загальне" весь час.
Морган Херлокер

1

Від корпорації Майкрософт щодо іменування я можу надати цей список для невірних імен:

  1. Вони не семантичні, це означає, що вони мають імена, які замість того, щоб робити акцент на тому, що він робить, роблять акцент на технології, яку він використовує, або на основі структури .
  2. Вони не дотримуються синтаксичної послідовності. Наприклад, частина імен розміщена на верблюдах, а інша частина - у паскалі.
  3. Вони є абревіатурами, які важко зрозуміти, як ScrollableX замість CanScrollHorizontally
  4. Вони вибрані такими, що вони возиться з ключовими словами того середовища.

2
Мені насправді подобається "ScrollableX" принаймні стільки ж, скільки "CanScrollHorizontally". "X" насправді не є абревіатурою.
user1172763
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.