Семантично більш відповідна назва пакета, ніж `util` для наступних речей?


18

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

Як один із прикладів: візьміть клас, UUIDщо було б семантично правильним назвою пакета для цього класу?

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

Я вважав, me.myproject.rfc4122.UUIDале це не передбачає семантичності використання UUID.

Я також вважав, me.myproject.uuid.UUIDале мені не подобається тавтологія в цьому, хоча популярний підхід в Python ставити клас в модуль з тим же ім'ям, а packagesв Java не семантично еквівалентний modulesPython.

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

Я також вважав, me.myproject.lib.UUIDале це не має більше смислового значення, ніж .utilі просто перейменує проблему.

semantics: галузь лінгвістики та логіки, що стосується значення .


Як щодо me.myproject.UUID? Абоme.UUID
Роберт Харві

Для мене щось схоже from me.myproject.uuid import UUID, GetUUIDInfoвиглядає нормально. У модулі може бути більше однієї експортованої речі.
9000 р

2
У JXTA є пакети "id", що стосуються ідентифікаторів.
greg-449

@ greg-449 - Я схиляюся identityабо identifiersвикладаю вашу пропозицію з трохи більше пояснень, оскільки відповідь, ймовірно, буде прийнята.

Відповіді:


11

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

Більш прагматичний підхід до іменування пакунків - це просто допомогти вам знайти речі. Зберігання часто використовуваних речей, які ви завжди знаєте, де знайти всі згустовані в одному місці, не відволікає їх від дороги, а тому полегшує пошук рідше використовуваних речей. Отже, вам не потрібні назви пакетів, які семантично правильні для кожного класу, який вони містять, вам просто потрібні імена пакетів, які не є семантично неправильними. Очевидно, що «Util» ім'я пакета був обраний в відповідно до цієї лінії мислення: чи не семантично правильна назва для класів , які він містить, але це також не семантично невірно, і це досить добре.

Отже, якщо цей тип вашого UUID призначений для використання тільки в цій конкретній програмі (про що свідчить той факт, що ви плануєте помістити його під "мій проект",), ймовірно, це частина "моделі" вашої проект. Ви вже повинні мати "модельний" пакет, що містить набір усіх класів, які відповідають вашим стійким сутностям, багато з яких, ймовірно, мають зв'язки між ними, причому UUID, ймовірно, є засобом реалізації цих відносин. Крім того, ваші UUID, напевно, знають, як зберігати себе, правда? А також ваші UUID, ймовірно, можуть бути знайдені лише як члени ваших модельних структур, правда? Отже, ваш модельний пакет, мабуть, найкраще місце для нього.

Інакше, якщо цей тип вашого UUID може використовуватися і в інших проектах, його потрібно розглядати як частину якоїсь основи. Отже, він може міститись у папці кореневого джерела цього фрейму, або в деякому підпакеті «типів», як запропонував MainMax, або навіть у деякому підпакеті цієї рамки, який називається «util» або «misc». Нічого поганого в цьому немає.


2
Спробуйте обмежити коментарі у відповідях, які насправді не додають корисності відповіді. Розділ коментарів зарезервований для таких відмов. Дякую.
maple_shaft

1

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

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

У цьому випадку у мене не виникне проблем із введенням цього класу UUID в пакет "util". Якщо будуть ще які-небудь утиліти, пов'язані з UUID-класами (наприклад, окремий клас для генерації UUID), легко переробити і створити пакет "util.uuid" для них (якщо ви не створюєте бібліотеку, і UUID буде частиною відкритого інтерфейсу , тоді вам потрібно бути трохи "вперед-мисленням").


1
Це мій підхід. Немає сенсу створювати пакет, який не має чіткої мети. Якщо клас не може бути легко присвоєний значущому пакету, тоді "util" є нормальним і, можливо, навіть кращим. Зазвичай те, що відбувається під час продовження, полягає в тому, що достатня кількість класів в кінцевому підсумку пов'язана з утилітами, які пов'язані, і їх легко переробити з утиліту (принаймні під час розробки) у значущі пакети. Якщо ви спробували створити унікальні пакети для кожного класу, які не знаєте, куди він іде, то ви можете легко пропустити ці стосунки та можливість перетворитись на більш чисту архітектуру.
Данк

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

1

Дядько Боб має деякі вказівки щодо розділення пакунків

Перші три принципи пакета стосуються згуртованості пакунків, і вони говорять нам про те, що потрібно помістити всередину пакунків:

  1. Гранула повторного використання - це гранула вивільнення
  2. Класи, що змінюються разом, пакуються разом
  3. Класи, які використовуються разом, пакуються разом

Отже, відповідаючи на ваше запитання, хто / для чого буде використовувати клас UUID, має це як атрибут або викликає в ньому операції? Як складається графік залежності ? UUID буде використовуватися разом з іншими класами ?

В залежності від вашої відповіді, може бути , ви повинні назвати це me.myproject.identity пакет, me.myproject.serialization пакет, me.myproject. DTO або навіть щось інше цілком. Можливо, клас UUID повинен зберігатися разом з вашими моделями, і ви помістите його в пакет, який у вас вже є, як-от me.myproject.models .


1
dtoприблизно так само марно , як семантично libабо utilsвся dtoконцепція є наївним антішаблоном з середини 90-х років, modelпотрапляє в ту ж даремний генералізації категорії , а також

Ми недостатньо знаємо ваш проект, щоб дати вам більше корисних імен
Hbas

-2

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

  • ви можете розділити класи, наприклад, за їх значенням бізнесу com.example.identifier;
  • або, наприклад, за їх технічною цінністю com.example.uuid.

Зберігайте ІТ просто


2
Приклади класів ALLCAPS в Java: java.util.UUID, java.net.URL, java.util.zip.CRC32і т.д.
scriptin

@scriptin Не було б легше для розробника, якби він міг відрізняти лише від стилю шапки клас від "константа", член від назви пакета тощо? Чому ви вважаєте, що CRC32, UUID - це гарне ім’я для класу, лише тому, що це зробив java? Або тому, що це абревіатура від "Універсально унікального ідентифікатора" або "циклічної перевірки надмірності" ... але трохи почекайте! Що з цим java.util.zip.GZIPOutputStreamкласом? GZIPвиступає за ... ? there is also a java.util.zip.ZipOutputStream`
Тіберіу С.

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

Якщо ви бачите / майн-код щодня, його стиль відрізняє "легкий для читання" та "повернення вперед" вперед, виділяючи тут лише стиль шапки, я вважаю, що цінніше висловити через літери, тип члена (клас, константа, пакет тощо), ніж факт, що є абревіатурою.
Тіберіу С.

1
Оригінальне запитання не мало нічого спільного з тим, яку літеру слід використовувати при написанні назви пакета. Семантично UUID нічим не відрізняється від Uuid, uuid, UuId, UuID або будь-якої іншої довільної схеми капіталізації, яку, на вашу думку, вважаєте "найкращою".
Брандін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.