Как кратко назвать методы / переменные, когда интуитивное имя является зарезервированным ключевым словом? - PullRequest
0 голосов
/ 26 ноября 2010

Я ищу хорошее соглашение об именах для методов (и переменных в меньшей степени).Допустим, у вас есть некоторый фабричный класс в среде метапрограммирования или отражения, и методы связаны с примитивными типами java.

// dumb example
public class WrapperFactory {
    // create byte wrapper
    public MyWrapper byte(byte param) { ... }

    // create int wrapper
    public MyWrapper int(int param) { ... }
}

С точки зрения читабельности, я бы хотел, чтобы short имен методов.В отличие от показанного примера, сигнатуры методов для разных типов могут быть одинаковыми , поэтому использование только метода create (...) - с кучей перегрузок невозможно.

Из контекстаиз методов (они в конце концов находятся в WrapperFactory) ясно, что они будут производить Wrapper.Таким образом, что-то вроде byteWrapper () (или даже более подробного createByteWrapper ()) представляется полностью избыточным.

Есть предложения для кратких и кратких имен методов?


Редактировать: Общая тенденцияКажется, что метод с перегрузками является наиболее распространенным, он будет работать для большинства моих фабричных методов, но в настоящее время существует четыре createXXXWrapper (...) с идентичными сигнатурами, которые создают оболочки различного поведения (но того же общего типа).Таким образом, чтобы быть последовательным для всех типов, в настоящее время я предпочитаю предложение именования prefixXXX ().Какой префикс был бы лучшим (обертка не из моих любимых, есть другие фабрики, которые создают разные объекты, которые функционально не являются обертками).Поэтому я хотел бы иметь общий префикс, например new X (...), create X (...) или get X (...).

Ответы [ 4 ]

3 голосов
/ 26 ноября 2010

Имена методов должны быть глаголами, а не существительными.

Так что, если вы хотите что-то общее, я бы просто пошел с wrap()

Наименование метода

Хотя имя метода может быть любым допустимым идентификатором, условные обозначения кода ограничивают имена методов. По соглашению, имена методов должны быть глаголом в нижнем регистре или именем из нескольких слов, которое начинается с глагола в нижнем регистре, за которым следуют прилагательные, существительные и т. Д. В именах из нескольких слов первая буква каждого второго и следующих слов должны быть написаны заглавными буквами. Вот несколько примеров:
run
runFast
getBackground
getFinalData
compareTo
setX
isEmpty

Источник: Java & trade; Учебники > Изучение языка Java > Классы > Определение методов


И о повторном использовании имен методов. Это работает, но требует некоторой осторожности. Вот пример:

Объект с множеством конструкторов:

public class Wrapper{
    private final String type;
    public Wrapper(final byte inner){ type = "byte"; }
    public Wrapper(final short inner){ type = "short"; }
    public Wrapper(final int inner){ type = "int"; }
    public Wrapper(final char inner){ type = "char"; }
    public Wrapper(final Object inner){ type = "Object"; }
    public Wrapper(final float inner){ type = "float"; }
    public Wrapper(final double inner){ type = "double"; }
    public Wrapper(final boolean inner){ type = "boolean"; }
    public String getType(){ return type; }
}

Некоторые фабричные методы для получения таких объектов:

public static Wrapper wrap(final byte inner){ return new Wrapper(inner); }
public static Wrapper wrap(final int inner){ return new Wrapper(inner); }
public static Wrapper wrap(final short inner){ return new Wrapper(inner); }
public static Wrapper wrap(final Object inner){ return new Wrapper(inner); }
public static Wrapper wrap(final boolean inner){ return new Wrapper(inner); }
public static Wrapper wrap(final char inner){ return new Wrapper(inner); }
public static Wrapper wrap(final float inner){ return new Wrapper(inner); }
public static Wrapper wrap(final double inner){ return new Wrapper(inner); }

Тестовый код:

public static void main(final String[] args){
    final byte byteValue = (byte) 0x12;
    final short shortValue = (short) 10;
    System.out.println(wrap(byteValue).getType());
    System.out.println(wrap(10).getType());
    System.out.println(wrap(shortValue).getType());
    System.out.println(wrap("").getType());
    System.out.println(wrap(true).getType());
    System.out.println(wrap('a').getType());
    System.out.println(wrap(13.1f).getType());
    System.out.println(wrap(13.1d).getType());
}

Выход (как и ожидалось):

байт
INT
короткий
Объект
булево
символ
плавать
двойной

2 голосов
/ 26 ноября 2010

В этом случае я бы порекомендовал wrapByte и wrapInt, или, может быть, просто перегружены create методы.

1 голос
/ 26 ноября 2010

Как насчет использования префикса "from"?

public class WrapperFactory {
    // create byte wrapper
    public MyWrapper fromByte(byte param) { ... }

    // create int wrapper
    public MyWrapper fromInt(int param) { ... }
}

Это не соответствует стандартным соглашениям об именах Java, но может быть достаточно интуитивно понятным, чтобы быть прощенным.

0 голосов
/ 26 ноября 2010

В вашем случае методы newWrapper(byte...), newWrapper(int...) будут лучше. Или create, или что-то еще, что одним словом описывает, что делает этот метод.

...