Соглашение об именовании параметров общего типа для Java (с несколькими символами)? - PullRequest
115 голосов
/ 25 мая 2010

В некоторых интерфейсах, которые я написал, я хотел бы назвать параметры универсального типа более чем одним символом, чтобы сделать код более читабельным.

Что-то вроде ....

Map<Key,Value>

Вместо этого ...

Map<K,V>

Но когда дело доходит до методов, параметры типа выглядят как java-классы, что также сбивает с толку.

public void put(Key key, Value value)

Кажется, что Key и Value являются классами. Я нашел или подумал о некоторых обозначениях, но ничего подобного соглашению от Sun или общей передовой практике.

Альтернативы, которые я угадал или нашел ...

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

Ответы [ 5 ]

168 голосов
/ 25 мая 2010

Oracle рекомендует следующее в Учебные руководства по Java> Общие> Типовые типы :

Соглашения об именовании параметров типа

По соглашению имена параметров типа состоят из одинарных прописных букв. Это резко контрастирует с соглашениями о переменной naming , о которых вы уже знаете, и на то есть веская причина: без этого соглашения было бы трудно определить разницу между переменной типа и обычным именем класса или интерфейса .

Наиболее часто используемые имена параметров типа:

  • E - Элемент (широко используется в Java Collections Framework)
  • К - Ключ
  • N - номер
  • T - Тип
  • V - значение
  • S, U, V и т. Д. - 2-й, 3-й, 4-й типы

Эти имена будут использоваться в API Java SE и в оставшейся части этого урока.

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

40 голосов
/ 10 мая 2015

Добавить Type

Хорошее обсуждение можно найти в комментариях на странице DZone, Соглашения об именах для параметризованных типов .

См. Комментарий Эрвина Мюллера. Его предложение совершенно очевидно для меня: Добавьте слово Type.

Зови яблоко, яблоко, машина, машина. Имя, о котором идет речь, - это имя типа данных, верно? (В ООП класс по существу определяет новый тип данных.) Так что назовите его «Тип».

Пример Мюллера, взятый из оригинальной статьи:

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

Добавить T

Повторяющийся вопрос дает этот ответ от Энди Томаса. Обратите внимание на отрывок из руководства по стилю Google, в котором предлагается, чтобы имя многосимвольного типа заканчивалось заглавными буквами T.

16 голосов
/ 28 октября 2015

Да, вы можете использовать многосимвольные имена для переменных типа, если они четко отличаются от имен классов.

Это отличается от соглашения, предложенного 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 style

Руководство по стилю Google Java допускает использование как однобуквенных, так и многосимвольных имен классов, оканчивающихся на T.

5.2.8 Тип имен переменных

Каждая переменная типа названа в одном из двух стилей:

  • Одна заглавная буква, за которой может следовать одна цифра (например, E, T, X, T2)

  • Имя в форме, используемой для классов (см. Раздел 5.2.2, Имена классов ), за которыми следует заглавная буква T (примеры: RequestT, FooBarT).

Вопросы

«Без этого соглашения было бы трудно определить разницу между переменной типа и обычным именем класса или интерфейса». - из руководств по Oracle, «Универсальные типы»

Односимвольные имена - не единственный способ отличить параметры типа от имен классов, как мы видели выше.

Почему бы просто не задокументировать значение параметра типа в JavaDoc?

Это правда, что @param элементы JavaDoc могут предоставить более подробное описание. Но также верно, что JavaDocs не обязательно видны. (Например, в Eclipse есть помощник по содержимому, который показывает имена параметров типа.)

Имена параметров многосимвольных типов не соответствуют соглашению Oracle!

Многие оригинальные соглашения Sun соблюдаются почти повсеместно в программировании на Java.

Однако это конкретное соглашение не является.

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

15 голосов
/ 27 марта 2013

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

например,

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

}

Другая вещь, о которой я знал, это использование моей IDE для рефакторинга класса, нарушающего соглашение. Затем поработайте над кодом и вернитесь к отдельным буквам. В любом случае мне легче, если используется много параметров типа.

14 голосов
/ 04 мая 2016

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

Без этого соглашения было бы трудно определить разницу между переменной типа и обычным именем класса или интерфейса.

Я думаю, что в современных IDE эта причина больше не действительна, как например. IntelliJ Idea показывает параметры универсального типа с цветами, отличными от обычных классов.

Код с универсальным типом, как показано в IntelliJ Idea 2016.1 Code with generic type as displayed in IntelliJ Idea 2016.1

Из-за этого различия Я использую более длинные описательные имена для моих универсальных типов, с тем же соглашением, что и для обычных типов. Я избегаю добавления префиксов и суффиксов, таких как T или Type, поскольку считаю их ненужным шумом и больше не нужен для визуального различения универсальных типов.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...