Загальна умова іменування параметрів типу для Java (з кількома символами)?


125

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

Щось на зразок....

Map<Key,Value>

Замість цього ...

Map<K,V>

Але якщо мова йде про методи, параметри типу виглядають як java-класи, що також заплутано.

public void put(Key key, Value value)

Схоже, Key and Value - це класи. Я знайшов або подумав про деякі позначення, але нічого подібного до конвенції від НД чи загальної найкращої практики.

Альтернативи я здогадався чи знайшов ...

Map<KEY,VALUE>
Map<TKey,TValue>

9
Чому ви хочете створити нову конвенцію?
Амір Афгані

13
@AmirAfghani З питання: зробити код більш читабельним.
SantiBailors

Технічно різний відтінок дженериків в IDE повинен слугувати досить хорошим показником
Sudix

Відповіді:


182

Oracle рекомендує в навчальних програмах Java> Загальні тексти> Загальні типи :

Введіть параметри іменування умов

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

Найбільш часто використовувані назви параметрів типу:

  • Е - Елемент (широко використовується рамками колекцій Java)
  • К - Ключ
  • N - номер
  • T - Тип
  • V - значення
  • S, U, V тощо - 2-й, 3-й, 4-й типи

Ви побачите ці назви, які використовуються в API Java SE та в решті цього уроку.

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


14
Новий фреймворк потоку також використовує Rдля результатів і Aдля акумулятора.
vandale

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

4
@warbaker: Я вважаю хорошим способом відрізнити параметризовані типи від реальних класів. Як би ви в іншому випадку сказали, якщо, наприклад, Elementв List<Element>параметризований тип або клас?
BalusC

1
Це не схоже на BiFunction<T, U, R>цю конвенцію. Якби це було, то було б BiFunction<T, S, R>.
michaelsnowden

4
Чому турбуєтесь про відмежування параметризованих типів від фактичних класів? Вони - заняття. Незважаючи ні на що, вам потрібно прокрутити десь у файлі, щоб дізнатися, як вони визначені. І це буде або імпорт, або параметризований тип.
Vectorjohn

47

Додавати Type

Гарне обговорення можна знайти у коментарях на сторінці DZone, називаючи конвенції для параметризованих типів .

Дивіться коментар Ервіна Мюллера. Його пропозиція має для мене ідеальний очевидний сенс: Додайте словоType .

Назвіть яблуко яблуко, машину автомобіль. Ім'я, про яке йдеться, - це назва типу даних, правда? (В OOP клас по суті визначає новий тип даних.) Тому називаємо його "Тип".

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

public interface ResourceAccessor < ResourceType , ArgumentType , ResultType > {
    public ResultType run ( ResourceType resource , ArgumentType argument );
}

Додавати T

Повторне запитання надає цю відповідь Енді Томас. Зверніть увагу на уривок із посібника зі стилів Google, який передбачає, що ім’я типу багато символів має закінчуватися однією великою літерою T.


3
Мені подобається ця відповідь. Додавання "Тип" настільки зрозуміле і дозволяє вам мати описові назви. Мені нудно, що люди говорять: "роби це, тому що це конвенція", без іншого виправдання. Якщо це погана умова, можливо, нам потрібна нова.
Дрю

16

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

Без цієї конвенції було б важко визначити різницю між змінною типу та звичайним іменем класу чи інтерфейсу.

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

Код із загальним типом, як відображено в IntelliJ Idea 2016.1 Код із загальним типом, як відображено в IntelliJ Idea 2016.1

Через цю відмінність я використовую довші описові назви для моїх родових типів з такою ж умовою, як і звичайні типи. Я уникаю додавання префіксів і суфіксів, таких як T або Type, оскільки вважаю їх непотрібним шумом і більше не потрібен для візуального розрізнення загальних типів.

Примітка: Оскільки я не є користувачем Eclipse або Netbeans, я не знаю, чи пропонують вони подібну функцію.


Я не буду базувати умови іменування на основі припущених можливостей інструментів, які матиме кожна людина, яка коли-небудь читає / змінює той самий файл. Мені особисто подобається використовувати текстовий редактор для свого кодування (Sublime Text), який не є IDE. Текстові редактори в наш час зазвичай мають синтаксичне забарвлення, але не мають глибокого розуміння основної структури коду, які, на мою думку, знадобляться, щоб правильно вказати кольори імен змінних. І цей аргумент ґрунтується на кольорі властиво виключно людям із поганим кольоровим зором (я є частиною 8% чоловіків із червоно-зеленою кольоровою сліпотою)
joonas.fi

1
Хороший момент щодо людей із поганим кольоровим зором. Що стосується не використання IDE - якщо люди вважають за краще користуватися простими текстовими редакторами, це добре, але вони добровільно жертвують функціями, які IDE пропонують їм на користь більш легкого інструменту. Це може бути лише одна з цих функцій, яка відсутня. Зрештою, якщо замість однієї літери використовується описове ім'я, ви повинні мати змогу сказати значення, засноване на імені, без IDE та без кодування кольорів. Кольорове кодування просто робить це швидше.
Войтех Рузичка

16

Так, ви можете використовувати імена з кількома символами для змінних типів, якщо вони чітко відрізняються від імен класів.

Це відрізняється від конвенції, запропонованої Sun, щодо впровадження дженериків у 2004 році. Однак:

  • Існує більше однієї конвенції.
  • Імена з кількома символами відповідають іншим стилям Java, наприклад стилю Google для Java .
  • Читані назви (здивовано!) Легше читати.

Читабельність

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

Читання - це добре.

Порівняйте:

    public final class EventProducer<L extends IEventListener<E>,E> 
            implements IEventProducer<L,E> {

до:

    public final class EventProducer<LISTENER extends IEventListener<EVENT>,EVENT> 
           implements IEventProducer<LISTENER, EVENT> {

або, за умовами Google про багато символів:

    public final class EventProducer<ListenerT extends IEventListener<EventT>,EventT> 
           implements IEventProducer<ListenerT, EventT> {

    public final class EventProducer<ListenerT extends IEventListener<EventT>,EventT> 
           implements IEventProducer<ListenerT, EventT> {

Стиль Google

Керівництво Стиль Google Java дозволяє обидві назви однієї літери і мульти-символьний клас , як імена , що закінчуються в T.

5.2.8 Введіть імена змінних

Кожна змінна типу названа в одному з двох стилів:

  • Одна буква, необов'язково з подальшим однією цифрою (наприклад E, T, X, T2)

  • Ім'я в формі , використовуваної для класів (дивіться Розділ 5.2.2, імена класів ), а потім букви Т (приклади: RequestT, FooBarT).

Випуски

"Без цієї конвенції було б важко визначити різницю між типовою змінною та звичайною назвою класу чи інтерфейсу". - з навчальних посібників Oracle, "Загальні типи"

Імена з одним символом - не єдиний спосіб відрізнити параметри типу від імен класів, як ми бачили вище.

Чому б просто не задокументувати значення параметра типу у JavaDoc?

Це правда, що @paramелементи JavaDoc можуть дати більш довгий опис. Але також правда, що JavaDocs не обов'язково видно. (Наприклад, у програмі Eclipse є допомога щодо вмісту, яка показує назви параметрів типу.)

Імена параметрів типу "багато символів" не відповідають умовам Oracle!

Багато програм оригінальних конвенцій Sun дотримуються майже повсюдно в програмуванні Java.

Однак цієї конкретної конвенції немає.

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


15

Ви можете використовувати javadoc, щоб принаймні дати зрозуміти користувачам вашого загального класу. Мені це все ще не подобається (я згоден з @ chaper29), але документи допомагають.

наприклад,

/**
 * 
 * @param <R> - row
 * @param <C> - column
 * @param <E> - cell element
 */
public class GenericTable<R, C, E> {

}

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


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