Конвенція про іменування класів корисних програм на Java


115

Коли ви пишете курси корисних програм на Java, які корисні рекомендації слід дотримуватися?

Чи повинні упаковки бути "util" чи "utils"? Це ClassUtil чи ClassUtils? Коли клас "помічник" чи "утиліта"? Утиліта чи комунальні послуги? Або ви використовуєте їх суміш?

Стандартна бібліотека Java використовує і утиліти, і утиліти:

  • javax.swing.Утиліти
  • javax.print.attribute.AttributeSetUtilities
  • javax.swing.plaf.basic.BasicGraphicsUtils

Apache використовує різноманітні Util та Utils, хоча в основному це:

  • org.apache.commons.modeler.util.DomUtil
  • org.apache.commons.modeler.util.IntrospectionUtils
  • org.apache.commons.io.FileSystemUtils
  • org.apache.lucene.wordnet.AnalyzerUtil
  • org.apache.lucene.util.ArrayUtil
  • org.apache.lucene.xmlparser.DOMUtils

Spring використовує багато класів Helper і Utils:

  • org.springframework.web.util.UrlPathHelper
  • org.springframework.core.ReflectiveVisitorHelper
  • org.springframework.core.NestedExceptionUtils
  • org.springframework.util.NumberUtils

Отже, як ви називаєте свої корисні класи?

Відповіді:


82

Як і для багатьох подібних конвенцій, важливо не стільки конвенцію, якою ви користуєтесь, скільки її послідовне використання. Наприклад, якщо у вас є три класи утиліти, і ви називаєте їх CustomerUtil, ProductUtils і StoreUtility, інші люди, які намагаються використовувати ваші класи, будуть постійно плутатись і вводити CustomerUtils помилково, доведеться їх шукати, кілька разів проклинати, і т. д. (Я почув лекцію про послідовність одного разу, коли оратор виставив слайд, на якому було викладено контур своєї промови з трьома основними пунктами, позначеними "1", "2-е" та "С".)

Ніколи ніколи не складайте двох імен, які відрізняються лише певною тонкістю написання, як, наприклад, наявність CustomerUtil та CustomerUtility. Якщо були два вагомі причини зробити два заняття, то в них повинно бути щось інше, а ім’я має принаймні дати нам поняття, у чому полягає ця різниця. Якщо одна містить утилітні функції, пов’язані з іменем та адресою, а інша містить утилітні функції, пов’язані із замовленнями, тоді називайте їх CustomerNameAndAddressUtil та CustomerOrderUtil або деякі подібні. Я регулярно збиваюся, коли бачу безглузді тонкі відмінності в назвах. Як і вчора, я працював над програмою, яка мала три поля для витрат на фрахт, названі "фрахт", "вантажовитрати" та "фрийт". Мені довелося вивчити код, щоб зрозуміти, в чому різниця між ними.


9
І IV за номером 4 :-) - Але що було відмінність між вантажним , freightcost і frght ?
KajMagnus

4
@KayMagnus Ця посада була понад рік тому, але, як я пам’ятаю, однією з них були поточні витрати на фрахт, записані до зміни змісту замовлення, і, таким чином, потенційно вартість фрахту; інша - стандартна вартість фрахту, взята з таблиці; третій - це розрахункова вартість, яка використовується в деяких спеціальних випадках, наприклад, заморські поставки. Як і чому вони не могли принаймні назвати їх, скажімо, "currFreight", "stdFreight" та "calcFreight". Це принаймні дало б підказку.
Джей

Добре, дякую за пояснення :-) Цікавий приклад дивного коду, я думаю
KajMagnus

31

Для цього не існує стандартних правил / конвенцій у світі Java. Однак я вважаю за краще додавати "s" в кінці назви класу, як згадував @colinD.

Це здається досить стандартним для того, що робить дизайнер API API Java Josh Bloch (колекція java, а також колекція google)

Поки Helper і Util будуть називати щось Helper, коли у нього є API, які допомагають досягти певної функціональності пакета (розглядаючи пакет як реалізацію модуля); означає, поки Util може викликатися в будь-якому контексті.

Наприклад, у додатку, пов’язаному з банківськими рахунками, переходитимуть усі статичні API-коди, що стосуються певної кількості org.mycompany.util.Numbers

Усі API, що допомагають API, що допомагають діловим правилам, перейдуть на сторінку

org.mycompany.account.AccountHelper

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


5
Це здається розумним, що Helper був би більш конкретним, ніж Utils.
KajMagnus

1
Так, мені подобається такий підхід, це більш логічно.
Конан

3
Посилання розірвано. Я знайшов ще одну .
Chavjoh

22

Мені подобається умова просто додавати "s" до імені типу, коли тип - це інтерфейс або клас, яким ви не керуєте. Приклади цього в JDK включають Collectionsі Executors. Це також умова, що використовується в колекціях Google.

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


2
Google Guava також використовує цей зразок
Jherico

11

Я думаю, що "utils" має бути назвою пакета. Імена класів повинні визначати мету логіки всередині нього. Додавання суфікса -util (s) є зайвим.


2
Це не було б правильним в підході "пакет за характеристикою" .
jpangamarca

1
@jpangamarca У статті, яку ви пов’язали, є приклад "util" у прикладі для "пакет за функцією". Я думаю, що на практиці часто не уникнути якоїсь функції / шару утиліти.
капекс

1
@kapex Нагадка від автора, я думаю. tld.organization.app.utilПакет не повинен існувати (може, але не зобов'язаний), будь-яку кількість tld.organization.app.feature.utilупаковок прекрасно.
jpangamarca

3

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

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

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