Как лучше всего использовать «get» в именах методов? - PullRequest
5 голосов
/ 04 ноября 2008

Я заметил во многих местах в Java (включая C #), что многие методы «getter» имеют префикс «get», а многие другие - нет. Я никогда не замечал какой-либо закономерности, которым следуют Солнце. Каковы некоторые рекомендации или правила использования «get» в именах методов получения?

Ответы [ 9 ]

5 голосов
/ 04 ноября 2008

Все сводится к семантике. Да, в C # есть «свойства», которые дают вам заглушку «метод» get / set ... но функции (... "методы" ...) в .NET Framework, которые начинаются с "Get", должны помочь Разработчик в том, что какая-то операция происходит с единственной целью получения некоторых результатов.

Вы можете подумать, что это странно, и сказать: «Почему бы просто не использовать тип возврата, чтобы подсказывать людям?», И ответ прост. Подумайте о следующих методах:

public Person CreatePerson(string firstName, string lastName) {...}

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

но что по этому поводу:

public Person GetPerson(string firstName, string lastName) {...}

Просто по названию метода вы, вероятно, можете предположить, что выполняется 100% «безопасный» поиск человека из базы данных.

Вы бы никогда не вызвали «CreatePerson» несколько раз ... но вы должны чувствовать себя в безопасности, чтобы постоянно вызывать «GetPerson». (это не должно влиять на «состояние» приложения).

4 голосов
/ 04 ноября 2008

В Java рекомендуется использовать префиксы get и set для свойств.

Каркасы, библиотеки тегов и т. Д. Будут искать методы с этими префиксами и использовать их в качестве свойств.

Итак, если у вас есть такой класс Java ...

public class User{
    private String name;
    public String getName(){ return name;}
    public void setName(String name){ this.name = name; }
}

.. с помощью Struts-тегов (или любой другой библиотеки тегов на основе ognl) вы получите доступ к свойству name с помощью user.name.

Платформа Spring также использует это соглашение в файлах конфигурации xml.

4 голосов
/ 04 ноября 2008

Пара префиксов «get» и «set» в Java изначально использовалась в качестве соглашения для обозначения Java-бина. Позже это стало просто соглашением об инкапсуляции, поскольку Java, в отличие от C #, не имеет надлежащих свойств.

2 голосов
/ 13 мая 2012

Мне лично нравится следующее правило:

  • Используйте префикс get всякий раз, когда значение напрямую модифицируется с помощью соответствующего set метода
  • Удалите префикс get в ситуациях, когда значение является чем-то, что вы не можете установить непосредственно как свойство (т. Е. Нет эквивалентного метода setXXX)

Обоснование для второго случая состоит в том, что если значение на самом деле не является настраиваемым пользователем «свойством» как таковым, то ему не нужно иметь пару методов get / set. Подразумевается, что если соблюдается это соглашение и вы видите метод getXXX, вы также можете предположить существование метода setXXX.

Примеры:

  • String.length() - поскольку строки неизменяемы, длина доступна только для чтения
  • ArrayList.size() - размер изменяется при добавлении или удалении элементов, но вы не можете установить его напрямую
2 голосов
/ 04 ноября 2008

Java (пока) не поддерживает свойства. Геттеры и сеттеры - это обходной путь. Другие языки - включая C # - поддерживают свойства, и вы должны использовать их вместо этого. Это также не просто «лучшая практика»: сериализация в C # будет зависеть от свойств, а не от методов получения и установки, поэтому, если вы не хотите сериализовать ваши классы, в будущем использование свойств может привести к всевозможным проблемам.

Преимущество свойств в том, что они делают код более читабельным. Что-то вроде

obj.setX(10);

в Java, становится

obj.X = 10;

Тем не менее, негласно, X является методом, а не переменной, и поэтому может выполнять грязную проверку ввода и т. Д.

1 голос
/ 11 ноября 2008

Это зависит. Это часто избыточная информация, даже на языках без свойств.

В C ++ вместо пары getAttr () / setAttr () обычно предусмотрено две перегрузки функции Attr (): void Attr (Foo f); // Сеттер Foo Attr (); // Получатель

В Java обычной практикой является префикс get / set. Я должен сказать, что лучше всего придерживаться того, что является стандартом в вашем языке. В Java люди ожидают увидеть префиксы get / set, поэтому пропуск их может сбить людей с толку, даже если они не являются строго необходимыми.

1 голос
/ 04 ноября 2008

Конечно, раньше API часто выставляли свойства только для чтения без префикса get: String.length() и даже более новые Buffer.capacity(), являющиеся разумными примерами .

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

Конечно, в C # это в основном не имеет значения, так как в любом случае есть «реальные» свойства:)

0 голосов
/ 18 декабря 2008

Просто короткое дополнение: Другое соглашение заключается в том, чтобы получателям логических полей предшествовал префикс «is» вместо «get», например. bool isEnabled() { return enabled; }

0 голосов
/ 04 ноября 2008

Objective C 2.0 также использует свойства, используя тот же синтаксис точки.

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

value = [obj attr];

[obj setAttr:value];

[obj getAttr:&value];

То есть get используется по-другому. Он не возвращает значение, но сохраняет результат в переданной переменной.

Типичный getter имеет то же имя, что и атрибут, setter - это атрибут с префиксом set (согласно соглашению Java). Эти соглашения используются системой KVO (Key-Value Observation), поэтому их следует соблюдать.

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