Який найкращий підхід до іменування класів?


92

Придумати гарні, точні назви класів, як відомо, складно. Зроблено правильно, це робить код більш самодокументованим і забезпечує словниковий запас для міркувань щодо коду на вищому рівні абстракції.

Класам, що реалізують певний шаблон дизайну, може бути присвоєно ім'я на основі відомого імені шаблону (наприклад, FooFactory, FooFacade), а класи, які безпосередньо моделюють концепції доменів, можуть взяти свої імена із проблемного домену, а як щодо інших класів? Чи є щось подібне до тезаурусу програміста, до якого я можу звернутися, коли мені не вистачає натхнення, і хочу уникати використання загальних назв класів (таких як FooHandler, FooProcessor, FooUtils та FooManager)?


6
це чудове питання! Його закриття є невиправданим, краще було б перенести сайт програмістів.
Тимофій

1
Погоджуюсь, слід відкрити або перенести
ftl


Я бачив багато цих чудових питань, "закритих casperOne". Може, він міг би служити делеціоністом у Вікіпедії?
Перлатор

Відповіді:


59

Я наведу кілька уривків із «Шаблонів реалізації» Кента Бека:

Просте ім'я суперкласу

"[...] Імена повинні бути короткими і проникливими. Однак для точності імен іноді, здається, потрібно кілька слів. Виходом з цієї дилеми є вибір сильної метафори для обчислення. З урахуванням метафори навіть окремі слова приносять із собою багату мережу асоціацій, зв’язків та наслідків. Наприклад, у рамках малювання HotDraw моє перше ім’я для об’єкта на малюнку було DrawingObject . Уорд Каннінгем прийшов разом із метафорою типографіки: малюнок схожий на роздрукована, викладена сторінка. Графічні елементи на сторінці - це цифри, тому клас став малюнком . У контексті метафори малюнок одночасно коротший, багатший і точніший, ніж DrawingObject . "

Назва кваліфікованого підкласу

"Імена підкласів мають дві роботи. Вони повинні повідомляти, яким вони є класом, і чим вони відрізняються. [...] На відміну від імен у коренях ієрархій, імена підкласів використовуються майже не так часто в розмові, тому вони можуть бути виразними ціною стислості. [...]

Дайте підкласам, що служать корінням ієрархій, власні прості імена. Наприклад, HotDraw має клас Handle, який представляє операції редагування малюнків, коли вибрано фігуру. Це називається, просто, Handle, незважаючи на розширення малюнка . Існує ціле сімейство ручок, і вони найбільш доречно мають такі назви, як StretchyHandle та TransparencyHandle . Оскільки Handle є коренем власної ієрархії, він заслуговує простого імені суперкласу більше, ніж імені кваліфікованого підкласу.

Ще однією складкою при іменуванні підкласів є багаторівневі ієрархії. [...] Замість того, щоб наосліп додавати модифікатори до безпосереднього суперкласу, подумайте про назву з точки зору читача. До якого класу він повинен знати, що це за клас? Використовуйте цей суперклас як основу для назви підкласу. "

Інтерфейс

Два стилі імен інтерфейсів залежать від того, як ви думаєте про інтерфейси. Інтерфейси як класи без реалізації повинні бути названі , як якщо б вони були класи ( Simple суперклас , Кваліфіковані Підклас Ім'я ). Однією з проблем цього стилю імен є те, що добрі імена витрачаються до того, як перейти до класів іменування. Інтерфейсу під назвою File потрібен клас реалізації, який називається щось на зразок ActualFile , ConcreteFile або (yuck!) FileImpl(як суфікс, так і абревіатура). Взагалі, важлива інформація про те, чи маєш справу з конкретним або абстрактним об’єктом, чи реалізований абстрактний об’єкт як інтерфейс чи суперклас, менш важливий. Відкладання відмінностей між інтерфейсами та суперкласами добре> підтримується цим стилем іменування, дозволяючи вам змінити свою думку згодом, якщо це> стане необхідним.

Іноді найменування конкретних класів просто важливіше для спілкування, ніж приховування використання інтерфейсів. У цьому випадку префікс назв інтерфейсів слід вводити з “I”. Якщо інтерфейс називається IFile , клас можна просто назвати File .

Для більш детального обговорення придбайте книгу! Воно того варте! :)


1
"Іноді просто називати конкретні класи важливіше для спілкування, ніж приховувати використання інтерфейсів. У цьому випадку префікс імен інтерфейсів слід вводити як" I ". Якщо інтерфейс називається IFile, клас можна просто назвати" Файл ". Це так смішно, тому що в книзі «Чистий код» Роберта К. Мартіна я з’ясував, що ми воліли б ім’я реалізації називати FileImpl, а не називати інтерфейс як IFile, оскільки ми не хочемо, щоб клієнт знав, що ми обслуговуємо їх. інтерфейс. А в книзі ^ є цитати з книги, на яку ви посилаєтесь :)
Крістіан Чоботея

38

Завжди вибирайте MyClassA, MyClassB - Це дозволяє отримати хороший альфа-сорт ..

Я жартую!

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

Реальна проблема?

У мене було багато занять. Якщо ви спробуєте дотримуватися принципу єдиної відповідальності, це зробить все набагато приємнішим .. Замість одного монолітного класу PrintHandler , ви можете розбити його на PageHandler , PageFormatter (і так далі), а потім мати майстер- клас Printer, який об’єднує все це разом.

Під час моєї реорганізації це зайняло у мене час, але в підсумку я зібрав багато дублікатів коду, отримав свою базу коду набагато логічнішим і навчився біса, коли йдеться про роздуми, перш ніж кидати зайвий метод у клас: D

Однак я б не рекомендував вводити такі речі, як імена шаблонів, до імені класу. Інтерфейс класів повинен зробити це очевидним (наприклад, приховування конструктора для синглтона). У загальному назві немає нічого поганого, якщо клас виконує загальну мету.

Удачі!


Погодьтеся, не вводячи імена шаблонів в назву класу. Що робити, якщо шаблон змінюється пізніше, коли змінюється реалізація?
thegreendroid

2
Краще в імені вкладу назву шаблону. Чому? Тому що якщо мені доведеться розглянути деталі реалізації (наприклад, приватний конструктор), щоб з’ясувати, що це синглтон, це сповільнює мене як читача, і залежно від мого рівня майстерності, я можу не зрозуміти, що це насправді частина класу загальної закономірності. Синглтон і приватний конструктор є сумнівним прикладом, але для більш складних шаблонів (Visitor, Adapter тощо) це стає досить складним. Якщо шаблон зміниться, існує ймовірність того, що ці класи більше не існуватимуть ...
dragan.stepanovic

28

Відмінна розмова Джоша Блока про хороший дизайн API має кілька корисних порад:

  • На заняттях слід робити одне і робити це добре.
  • Якщо клас важко назвати чи пояснити, то, мабуть, він не дотримується порад у попередньому пункті.
  • Назва класу повинна негайно повідомляти, що це за клас.
  • Гарні імена обумовлюють хороший дизайн.

Якщо ваша проблема полягає в тому, як назвати відкриті внутрішні класи, можливо, вам слід об’єднати їх у більший клас.

Якщо ваша проблема полягає у назві класу, який виконує багато різних речей, вам слід подумати про розбиття його на кілька класів.

Якщо це хороша порада для публічного API, то це не може зашкодити будь-якому іншому класу.


1
посилання на відео на youtube youtube.com/watch?v=aAb7hSCtvGw
Ендрю Гаррі

12

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

Не отримуйте паралічу імен. Так, імена дуже важливі, але вони недостатньо важливі, щоб витрачати на них величезну кількість часу. Якщо ви не можете придумати гарне ім’я за 10 хвилин, рухайтесь далі.


9

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


3

Якщо ваш "FooProcessor" дійсно обробляє foos, то не соромтеся давати йому таку назву лише тому, що у вас вже є BarProcessor, BazProcessor тощо. Якщо ви сумніваєтеся, найкраще очевидне. Інші розробники, яким доведеться прочитати ваш код, можуть не використовувати той самий тезаурус, що і ви.

Тим не менш, більше конкретності не завадило б для цього конкретного прикладу. "Процес" - досить широке слово. Це справді "FooUpdateProcessor" (який може стати "FooUpdater"), наприклад? Вам не потрібно надто «креативно» займатися іменуванням, але якщо ви написали код, ви, мабуть, досить добре уявляєте, що він робить, а що не робить.

Нарешті, пам’ятайте, що оголена назва класу - це не все, що вам і читачам вашого коду потрібно продовжувати - зазвичай у програмі також є простори імен. Вони часто можуть дати читачам достатньо контексту, щоб чітко побачити, для чого ваш клас, якщо він насправді, навіть якщо його гола назва досить загальна.

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