Хтось ще вважає, як називати класи та методи однією з найскладніших частин програмування? [зачинено]


275

Тому я працюю над цим класом, який повинен запитати документацію про допомогу у постачальника через веб-сервіс. Я намагаюся , щоб назвати його DocumentRetriever, VendorDocRequester, DocGetter, але вони просто не здаються правильними. Я півгодини переглянув словник.com, намагаючись придумати відповідне слово.

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


2
Чому ви хочете клас, коли вам явно потрібна лише функція? Не забудьте перевірити steve-yegge.blogspot.com/2006/03/… на предмет дієслова як проблеми з назвою класу.
user51568

Або рухайтеся вперед & refactor, коли нарешті знаєте, як його слід викликати.
Естебан Арая

16
Що ви іменування?: Методи : використання дієслів , як Отримати, встановити, зберегти і т.д. класи і змінні : використання іменників , як документ, користувач, контекст і т.д. інтерфейси : використання прикметників , як для друку, клонують, ітерація і т.д. Прочитавши цю тему, мені подобається пропозиція Спольського щодо класів та змінних (в ній використовуються іменники) та пропозиція TravisO щодо методів (використовує дієслова). Також не робіть об’єктів, які закінчуються символом "er" .
Даніель Гасулл

5
"У комп'ютерній науці є дві важкі проблеми: вимкнення кешу, конвенції імен та безшумне переповнення".
Каракурі

6
@karakuri Версія, яку я чув, - це "2 важкі проблеми в інформатиці: називання і компенсація на 1 помилку".
Haoest

Відповіді:


121

Що ви зараз робите, це добре, і я настійно рекомендую вам дотримуватися свого поточного синтаксису:

контекст + дієслово + як

Я використовую цей метод для іменування функцій / методів, збережених у SQL програм тощо. Дотримуючись цього синтаксису, він буде зберігати ваші панелі Intellisense / Code набагато акуратніше. Отже, ви хочете EmployeeGetByID () EmployeeAdd (), EmployeeDeleteByID (). Коли ви використовуєте більш граматично правильний синтаксис, такий як GetEposleee (), AddE Employee (), ви побачите, що це стає справді безладним, якщо у вас є кілька Gets у тому ж класі, що непов'язані речі будуть згруповані разом.

Я порівнюю це з називанням файлів з датами, ви хочете сказати 2009-01-07.log не 1-7-2009.log, оскільки після того, як у вас є купа їх, замовлення стає абсолютно марним.


28
Я вважаю за краще, щоб контекст виводився з імені типу під час іменування методів ... клас EmployeeRepository {void Add (Співробітник співробітника); void Get (int id); недійсний GetAll (); недійсний GetAll (фільтр дії <FilterCriteria>); } Що ти думаєш?
В’яс Бхаргава

5
Також допомагає, якщо у вас є стандартний список дієслів "будинок". Тож завжди отримувати, а не завантажувати / читати / отримувати / вибирати / знаходити .... тощо.
Обліковий запис

2
Річард, ви правильні в сценаріях OOP, моя відповідь трохи відступила і була більш загальною пропозицією щодо кодування. Я думаю, що технічно це більше стосується мов, які не є OOP. Employee.Add () та Employee.GetByID () було б найкращим використанням у OOP.
TravisO

6
Мені подобається ефект Intellisense вашої пропозиції, але я віддаю перевагу дещо грамотнішому підходу. Тому я віддаю перевагу Employee.SetSupervisor () над Employee.SupervisorSet (), оскільки він читає (більше схоже на природну англійську мову.
Matthew Maravillas

12
Але @TravisO, це не добре звучить англійською. Ви не працюєте, ви отримуєте співробітника. Що робити, якщо у вас є складніші дії з прикметниками, наприклад InvalidateObsoleteQueries? QueriesInvalidateObsoleteважко читати і не має сенсу. Крім того, в C #, особливо з Resharper, алфавітний порядок не має значення. Якщо ви починаєте набирати «агов», Resharper дасть вам GetEmployee, SetEmployeeі навіть PopulateInactiveEmployeesList.
Ілля Коган

54

Один урок, який я засвоїв, полягає в тому, що якщо ви не можете знайти ім’я для класу, з цим класом майже завжди щось не так:

  • вам це не потрібно
  • це робить занадто багато

13
Або це занадто мало.
user51568

4
Дякую, це було насправді актуально для мене.
Haoest

52

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

Що стосується функцій та для одиночних класів, я ретельно вивчаю функцію, щоб побачити, чи є її основною функцією перетворення одного виду речі на інший. Я використовую цей термін дуже вільно, але ви виявите, що ВЕЛИЧЕЗНА кількість функцій, які ви пишете, по суті, займають щось в одній формі і створюють щось в іншій формі.

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

Коли я знаходжу цю закономірність, я завжди називаю функцію x Fromy .

Оскільки ваша функція перетворює URL-адресу в документ, я би назвав його

DocumentFromUrl

Ця закономірність надзвичайно поширена. Наприклад:

atoi -> IntFromString
GetWindowWidth -> WidthInPixelsFromHwnd // or DxFromWnd if you like Hungarian
CreateProcess -> ProcessFromCommandLine

Ви також можете користуватися, UrlToDocumentякщо вам більше зручно з цим замовленням. Якщо ви говорите x Fromy чи y Tox - це, мабуть, справа смаку, але я віддаю перевагу Fromпорядку, оскільки таким чином початок назви функції вже говорить про те, який тип він повертає.

Виберіть одну умову і дотримуйтесь її. Якщо ви обережно використовуєте ті самі імена, що імена ваших класів у своїх функціях x Fromy , вам буде набагато простіше запам'ятати, які імена ви використовували. Звичайно, цей шаблон працює не для всього, але він працює там, де ви пишете код, який можна вважати "функціональним".


Приємне нагадування про те, що в мовах OOP імена класів не завжди повинні бути іменниками, але це нормально, щоб вони були «дієслівними» при нагоді. Отже, чому практикуючі ООП часто потрапляють на службу (як, наприклад, людина, яка задає питання), оскільки занадто багато підкреслюють, що заняття повинні бути "річчю" у реальному світі.
Рей

7
XFromY-Convetion в основному повторює те, що знаходиться у списку типів та параметрів повернення: Foo fooFromBar (Bar bar). Це ви вирішите, якщо ви називатимете цю послідовність чи переплату.
Лена Шіммель

"У вашому випадку це здається, що ваш клас перетворює URL-адресу в документ". З якого часу класи повинні "робити" речі, а не представляти поняття?
user51568

6
@Brian: це зайве лише в одному місці ... під декларацією. Скрізь, де ви його використовуєте, приємно трохи нагадати про типи даних. Робить код більш читабельним, не повертаючись до декларації.
Джоель Спольський

3
@ stefan - У деяких мовах, таких як C # та Java, весь код повинен бути інкапсульований у класі, на відміну від C ++. Функції - це не зовсім першокласні громадяни цими мовами, якщо ви хочете модулювати код. Тому іноді ви закінчуєте клас, який може "робити" такі речі, як функція.
Рей

31

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


3
Дуже хороший момент, дійсно.
Каміло Мартін

27

Нитка 1:

function programming_job(){
    while (i make classes){
         Give each class a name quickly; always fairly long and descriptive.
         Implement and test each class to see what they really are. 
         while (not satisfied){
            Re-visit each class and make small adjustments 
         }
    }
}

Нитка 2:

while(true){
      if (any code smells bad){
           rework, rename until at least somewhat better
      }
}

Тут ніде немає Thread.sleep (...).


24

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

Для вашого класу я б запропонував VendorHelpDocRequester.


1
> Хороший VendorHelpDocRequester. Я фактично googled Requestor, а не Requester, обидва, здається, є законними англійськими словами.
Haoest

1
Я це робив і один раз або два рази :)
willcodejavaforfood

1
Мати дієслово у назві класу для мене завжди звучить неправильно. Плюс це завжди призводить до певного дублювання у використанні (тобто:) VendorHelpDocRequester.request(). Я вважаю за краще форму множини на зразок `VendorHelpDocs.request () '
Едсон Медіна


15

Я думаю, що це побічний ефект.

Це не справжнє називання, яке важко. Важко, що процес називання змушує вас зіткнутися з жахливим фактом, що ви не маєте уявлення про те, що чорт ви робите.


12

Я фактично щойно чув цю цитату вчора, через блог Signal vs. Noise в 37Signals, і я, безумовно, згоден з цим:

"У Комп'ютерній науці є лише дві важкі речі: недійсність кешу та іменування речей." - Філ Карлтон


simonwillison.net/2007/Jul/5/hard привів мене до tbray.org/ongoing/When/200x/2005/12/23/UPI, що призвело мене до karlton.hamilton.com та до karlton.hamilton.com/quotes /showallquotes.cgi , яка не включає цитату! (Але я впізнаю №5 з Scrum.)
Дарил Спітцер

1
"Дві важкі речі в комп'ютерній науці: недійсність кешу, іменування речей та помилки окремо."
Ден Лугг

7

Добре, що важко. Це змушує задуматися над проблемою та тим, що насправді повинен робити клас. Хороші імена можуть допомогти привести до гарного дизайну.


6

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

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


6

Я щойно писав про конвенції про іменування минулого місяця: http://caseysoftware.com/blog/useful-naming-conventions

Суть цього:

verbAdjectiveNounStructure - із структурою та прикметником як додаткові частини

Для дієслів я дотримуюся дієслівних дієслів: зберігати, видаляти, сповіщати, оновлювати чи генерувати. Час від часу я використовую "процес", але лише конкретно посилаюся на черги або робочі відставання.

Для іменників я використовую клас чи об’єкт, з яким взаємодію. У веб2проекті це часто завдання або проекти. Якщо це JavaScript взаємодіє зі сторінкою, це може бути тіло або таблиця. Справа в тому, що код чітко описує об'єкт, з яким він взаємодіє.

Структура НЕ є обов'язковим , тому що це унікальний для ситуації. Екран лістингу може запитати список або масив. Однією з основних функцій, що використовується у списку проектів для web2project, є просто getProjectList. Він не змінює основні дані, а лише представлення даних.

Ці прикметники є чим - то зовсім інше. Вони використовуються як модифікатори до іменника. Щось таке просте, як getOpenProjects, може бути легко реалізовано за допомогою getProjects та параметра перемикання, але це, як правило, генерує методи, які вимагають трохи розуміння базових даних та / або структури об'єкта ... не обов'язково щось, що ви хочете заохочувати. Маючи більш чіткі та конкретні функції, ви можете повністю обернути та приховати реалізацію від коду, використовуючи її. Хіба це не один із пунктів ОО?


4

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

Розгляньте макет вашої програми зараз:

  • Додаток
    • VendorDocRequester (читати з веб-сервісу та надавати дані)
    • VendorDocViewer (використання запитувача для надання документів постачальника)

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

  • Додаток
    • VendorDocs
      • Модель
        • Документ (звичайний об'єкт, що містить дані)
        • WebServiceConsumer (мати справу з азотною крупою у веб-сервісі)
      • Контролер
        • DatabaseAdapter (обробляти стійкість за допомогою ORM або іншого методу)
        • WebServiceAdapter (використовуйте споживача, щоб забрати документ і вставити його в базу даних)
      • Вид
        • HelpViewer (використовуйте DBAdapter, щоб виплюнути документацію)

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

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


4

У своїй книзі "Думаю далі" Лео Броді написав, що найважчим завданням для програміста є добре називати речі, і він заявив, що найважливішим інструментом програмування є тезаурус.

Спробуйте використовувати тезаурус на веб-сайті http://thesaurus.reference.com/ .

Крім цього, не використовуйте Угорське позначення НАБИГО, уникайте скорочень і будьте послідовними.

Найкращі побажання.


1
+1 із зазначенням, що не слід використовувати те, що називається угорською системою; Угорський додаток може бути корисним часом, особливо мовою програмування без гарної системи набору тексту.
користувач51568

Я ніколи не чув про угорські позначення щодо системи проти застосування, але жодна з них не є доброю ідеєю в будь-якому середовищі - ви завжди повинні називати, що базується на тому, ЩО, а не ЯК, і угорська мова йде повністю про те, як.
Роб Вільямс

@RobWilliams Я думаю, що вони мали на увазі статтю Джоела Спольського
Alois Mahdal

1
@RobWilliams Ви також впевнені в тому, що "я ніколи не чув про X vs Y, але ніколи не є доброю ідеєю ..." ...? :)
Алоїс Магдал

4

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

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

Довго:
Зазвичай часто не варто занадто довго думати над ім'ям, перш ніж впроваджувати. Якщо ви реалізуєте свій клас, називаючи його "Foo" або "Dsnfdkgx", під час реалізації ви бачите, що ви повинні його назвати.

Тим більше, що стосується Java + Eclipse, перейменування речей зовсім не є болем, оскільки воно ретельно обробляє всі посилання у всіх класах, попереджає про зіткнення імен тощо. І поки клас ще не знаходиться у сховищі контролю версій, я не хочу ' я думаю, що немає нічого поганого в тому, щоб перейменувати його 5 разів.

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


3

Чому б не HelpDocumentServiceClient набрид, або HelpDocumentClient ... неважливо, що це постачальник, справа в тому, що це клієнт веб-сервісу, який займається документами довідки.

І так називати важко.


3

Для цього класу існує лише одне розумне ім'я:

HelpRequest

Не дозволяйте деталям реалізації відволікати вас від сенсу.


Через півтора року я збирався запропонувати HelpLibraryклас, але це як мінімум так добре. Слід спочатку прочитати відповіді!
Jeff Sternal

2

Інвестуйте в хороший інструмент рефакторингу!


Лол. Іноді рефакторинг - це не найкращий варіант (великі проекти C ++), але я, безумовно, вдався до цього раніше. Іноді мені просто доводиться робити справи, а назви приходять до мене пізніше.
Стів S

2

Я дотримуюся основ: VerbNoun (аргументи). Приклади: GetDoc (docID).

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


Хоча це добре читається, він погано впорядковується, тому що є зворотним. Краще сказати DocGet (), тому що коли ви також створите DocAdd () DocRemove () тощо, вони всі з'являться разом у списку. Ваш метод дійсно показує, наскільки потворним він стає, коли у вас є десятки Gets чи що.
TravisO

Відмінна пропозиція, TravisO.
Джон Смок

Я б не використовував дієслово для класу нормально.
willcodejavaforfood

2

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

Intelisense існує для всіх основних мов. Тому, використовуючи сторонній API, я люблю використовувати його інтелектуальну інформацію для документації, а не використовувати "фактичну" документацію.

Маючи це на увазі, я добре створити назву методу типу

StevesPostOnMethodNamesBeingLongOrShort

Довго - але що ж. Хто не користується 24-дюймовими екранами в наші дні!


1

Я повинен погодитися, що називання - це мистецтво. Це стає трохи простіше, якщо ваш клас дотримується певного "зразка" (фабрика тощо).


1

Це одна з причин наявності стандарту кодування. Стандарт має тенденцію допомагати придумувати імена, коли потрібно. Це допомагає звільнити розум від використання інших цікавих речей! (-:

Я рекомендую ознайомитися з відповідною главою Кодексу Стіва МакКоннелла (За посиланням Amazon) ), яка декілька правил, що допомагають читати і навіть ремонтувати.

HTH

ура,

Роб


1

Ні, налагодження - це найскладніше для мене! :-)


налагодження зазвичай зводиться до правильного питання. Є гра з цим числом, де вам потрібно відгадати число від 1 до 1000. Якщо ваші здогадки занадто низькі або високі, консоль скаже вам це, і у вас є лише 10 спроб. Що ти робиш?
Haoest

1

DocumentFetcher? Важко сказати без контексту.

Це може допомогти діяти як математик і запозичити / винайти лексикон для вашого домену, коли ви йдете: зупиніться на коротких простих словах, які пропонують концепцію, не викладаючи її кожен раз. Занадто часто я бачу довгі латинізовані фрази, які перетворюються на абревіатури, і тому в будь-якому випадку вам потрібен словник для абревіатур .


1

Мова, яку ви використовуєте для опису проблеми, - це мова, яку ви повинні використовувати для змінних, методів, об'єктів, класів тощо. Сильно, іменники відповідають методам об'єктів та дієсловам, що відповідають методам. Якщо вам не вистачає слів для опису проблеми, ви також пропускаєте повне розуміння (специфікацію) проблеми.

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

Якщо ви сумніваєтесь, спати на ній, а наступного ранку вибирайте перше найбільш очевидне ім’я :-)

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

Пол.

BTW: Document.fetch () досить очевидний.


1

Я вважаю, що я маю найбільше проблем у локальних змінних. Наприклад, я хочу створити об’єкт типу DocGetter. Тому я знаю, що це DocGetter. Чому мені потрібно давати йому інше ім’я? Зазвичай я даю йому ім’я, наприклад, як dg (для DocGetter) або temp або щось не менш неописне.


1

Не забувайте дизайнерські зразки (не лише ті, що стосуються GoF) - це хороший спосіб надання загальної лексики, і їх назви слід використовувати, коли підходить для ситуації. Це навіть допоможе новачкам, знайомим з номенклатурою, швидко зрозуміти архітектуру. Цей клас, над яким ви працюєте, повинен діяти як проксі, або навіть фасад?


1

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


1

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

Одне із пропозицій - проконсультуватися із Тезаурусом. Слово має гарне, як і Mac OS X. Це дійсно може допомогти мені вийти з хмар, і дає мені гарне стартове місце, а також деяке натхнення.


0

Якщо ім'я пояснить себе непрофесійним програмістом, то, ймовірно, не потрібно його змінювати.

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