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

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

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

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

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

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

Любые предложения для коротких и лаконичных имен методов?


Редактировать: кажется, что общая тенденция заключается в том, что метод с перегрузками является наиболее распространенным, он будет работать для большинства моих фабричных методов, но в настоящее время существует четыре createXXXWrapper(...) с идентичными сигнатурами, которые создают оболочки с различным поведением (но того же общего типа). Поэтому, чтобы быть последовательным для всех типов, в настоящее время я предпочитаю префикс XXX(). Какой префикс был бы лучшим (wrap не является одним из моих любимых, есть другие фабрики, которые создают разные объекты, которые функционально не являются обертками). Поэтому я хотел бы иметь общий префикс, например newX(...), createX(...) или getX( ...).


person Durandal    schedule 26.11.2010    source источник


Ответы (4)


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

person Stephen C    schedule 26.11.2010

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

Так что, если вам нужно что-то общее, я бы выбрал wrap().

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

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

Источник: Учебники по Java > Изучение языка 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());
}

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

byte
int
short
Object
boolean
char
float
double

person Sean Patrick Floyd    schedule 26.11.2010
comment
+1, хотя они не могут просто повторно использовать wrap, потому что подписи методов для разных типов могут быть одинаковыми, и в этом случае я бы выбрал wrapByte, wrapInt и т. д. - person LukeH; 26.11.2010
comment
Как насчет такого прилагательного, как new. Если у меня Bar baz = Foo.new(Bazil);? Я думаю, я должен сказать createNew() :) - person Buhake Sindi; 26.11.2010
comment
новый был бы хорош, но это зарезервированное слово - person Sean Patrick Floyd; 26.11.2010
comment
newByte и newInt не являются зарезервированными словами ;-) - person Neeme Praks; 26.11.2010
comment
@Neeme Я согласен, но я понял, что ОП не хотел, чтобы тип был частью имени метода. Хотя он, кажется, изменил это требование. - person Sean Patrick Floyd; 26.11.2010

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

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

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

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

person Christoffer    schedule 26.11.2010
comment
Я согласен, это отличный выбор для имен фабричных методов. Но чтобы улучшить семантику, это должен быть метод (возможно, абстрактного) класса Wrapper, а не отдельный класс Factory, например. Wrapper.from(...) вместо WrapperFactory.from(...) - person Sean Patrick Floyd; 26.11.2010

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

person khachik    schedule 26.11.2010