Припустимо, у мене є абстрактний клас на ім'я Task
.
Чи існує стандарт чи конвенція, яка б запропонувала мені його AbstractTask
замість назвати ?
Припустимо, у мене є абстрактний клас на ім'я Task
.
Чи існує стандарт чи конвенція, яка б запропонувала мені його AbstractTask
замість назвати ?
Відповіді:
Відповідно до Ефективної Java від Bloch (Пункт 18), префікс "Анотація" - це умовна умова, що використовується в окремому випадку.
Ви можете комбінувати достоїнства інтерфейсів та абстрактних класів, надаючи абстрактний скелетний клас реалізації для кожного нетривіального інтерфейсу, який ви експортуєте. ... За умовою, скелетні реалізації називаються AbstractInterface, де Interface - це назва інтерфейсу, який вони реалізують.
Але Блох також вказує, що ім'я SkeletalInterface мало б сенс, але робить висновок про це
Зараз абстрактна конвенція міцно встановлена.
Як вказували інші відповіді, загалом немає підстав застосовувати цю конвенцію про іменування до всіх абстрактних класів.
Конвенції немає. Вся справа в тому, що допоможе вам як розробнику кодувати швидше та краще та допоможе іншим зрозуміти ваш код.
Запитайте людей, які будуть бачити та підтримувати код. Що вони краще побачать? Що полегшить їм? Потім назвіть його, виходячи з того, що вони хотіли.
Ще одна примітка: Конвенції про кодекси для мови програмування Java: 9. Названня конвенцій не передбачає жодних вимог:
Назви класів мають бути іменниками, у змішаному відмінку з першою літерою кожного внутрішнього слова з великої літери. Намагайтеся, щоб назви класу були простими та описовими. Використовуйте цілі слова, уникайте абревіатур і скорочень (якщо тільки абревіатура не використовується набагато ширше, ніж довга форма, наприклад, URL або HTML).
Ні. Intellisense тривіально скаже мені, чи це абстрактно, тож ви просто порушуєте тут DRY.
abstract
до імені класу не порушує DRY, і не всі використовують інтелігенцію. Наприклад, що ви робите, якщо читаєте код на веб-сторінці або якщо він є частиною патча, який ви шукаєте в простому текстовому редакторі або зовнішньому інструменті diff?
abstract class AbstractName
? Очевидно, що "абстрактно" двічі. І якщо ви не використовуєте Intellisense, то це ваша проблема, всі інші користуються здоровими інструментами для перегляду коду.
Це дещо питання переваги (але прикордонної поганої практики), але більшості людей не подобається бачити частину кваліфікаторів в імені класу.
Більшість IDE зроблять цю інформацію легко доступною для вас у будь-якому випадку, тому вводити її в ім’я не потрібно, і буде простіше опустити її. Це нагадує угорське позначення змінних імен, і це, безумовно, вважається поганою формою зараз-у-дні. Рекомендую просто зателефонувати Task
.
У .NET часто спостерігається використання "Base" як суфікса для позначення абстрактного базового класу. Я б відмовився від інших відповідей на те, чи є це звичайною практикою на Java.
На мою думку, назва суб’єкта господарювання не повинна передавати інформацію про його тип структури, а про його семантику. Тому немає сенсу визначати свій клас як "AbstractSomething", якщо абстракція не є частиною його мети виконання. Те, що це базовий абстрактний клас, видно програмісту, і його не потрібно відображати в імені.
Однак, якщо ідеально називати реалізацію абстрактної фабрики абстрактною факторною, тому що це стосується наміру класу.
Загалом, прихильно називати конвенцію, яка допомагає передати максимум інформації про мету вашого класу.
Аналогічно, будьте осторонь від SomethingImpl
. Нас не хвилює, що це реалізація, а не базовий клас. Якщо ваша ієрархія класів розроблена належним чином для спадкування, то хтось міг би успадкувати її. Напевно, не було б значення в них додавати більше "Impl" суфіксів чи інших артефактів. Немає значення також додавати суфікс "Інтерфейс" або префікс "Я".
Поміркуйте:
IVehicle <-- IMotoredVehicle <-- AbstractCar <-- CarImpl
На відміну від:
Vehicle <-- MotoredVehicle <-- Car <-- DefaultCar
<-- Ferrari
<-- Trabi
Останній я віддаю перевагу останньому.
Це, в деякому відношенні, подібно волаючого зловживання в угорській нотації , що останній дав йому свою погану репутацію , так як люди помилково почали інтерпретувати це як вимогу розробникам префікс їх змінних з індикатором типу змінної. Хоча іноді це може мати свою користь (здебільшого, якщо вам лінь шукати визначення типу), це здебільшого марно. Первісна ідея Сімоні з угорською нотацією полягала в тому, щоб використовувати його як мнемонічне, щоб нагадати розробникові про можливості організації, а не про його тип.
Хорошим правилом є не включати властивості в ім’я, очевидні з синтаксису. Оскільки в Java вам потрібно позначати абстрактний клас abstract
ключовим словом, який я влучив , я б його не включав до імені. Наприклад, у програмі C ++ справа не настільки чітка, але принаймні компілятор скаже вам, коли ви неправильно використали абстрактний клас. Знову на кшталт Python, чітко називати абстрактний клас як такий не є поганою ідеєю.
Звичайним винятком з правила є те, коли назва неоднозначне. Якщо з будь-якої причини є конкретний підклас Task
(в інших прикладах це може бути більш розумним, але все, що завгодно), тоді обов'язково використовуйте AbstractTask
.
protected abstract SomeClass { }
Це говорить мені, що це абстрактний клас. Додавання префікса є тавтологією та антидіаграмою, а в більшості випадків не підходить, див. Посилання, де йдеться про package local
те, що, наприклад, є винятком.
У більшості випадків Abstract
класи не повинні входити до API, що стоїть на публіці, якщо він дійсно має бути вагомою причиною, а хороша причина повинна містити явно хороше ім'я, окрім як AbstractSomeClass
.
У більшості випадків, якщо ви не можете придумати більш описову назву, вам, мабуть, потрібно зробити щось перероблення.
Мої п’ять центів, ймовірно, у вас будуть реалізації цього абстрактного класу, і вони будуть названі "SomeSpecificTask", "TaskWithBubbles", "StrangeTask" тощо. Отже, між вашим абстрактним "Завданням" та ними не буде зіткнення імен.
Крім того, "абстрактне" слово стосується синтаксису мови, а не сутності бізнес-домену, тому я вважаю за краще не використовувати його як частину назви.
З іншого боку, в одній відповіді тут я побачив уривок J.Bloch Effective Java, який говорить про те, що використання "абстрактного" як частини імені є усталеною практикою. Це може бути так. Але в будь-якому випадку в офіційних конвенціях Java-коду нічого про це немає.
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>
- не можна використовувати List
як ім'я для AbstractList
класу, оскільки це ім'я інтерфейсу. Це усталена практика та частина офіційного коду Java, який використовується там, де те, що реалізує інтерфейс, може або не може поширювати абстрактний клас (який також реалізує (деякий) інтерфейс).
Я не розробник Java (INAJD?) І не знаю стандартної номенклатури для таких речей, але я думаю Task
, що це звучить достатньо абстрактно, щоб вона могла окремо стояти такою, якою є.
Я це зробив. Я додав 'Анотація' як префікс до мого абстрактного класу під назвою AbstractOperation. Причиною того, що я це зробив, був ще один пакет, який мав неабразований клас під назвою Operation, і це допомогло моїй команді та програмістам, які взяли на себе згодом уникнути будь-якої плутанини між ними.