Как лучше всего использовать «get» в именах методов?

StackOverflow https://stackoverflow.com/questions/261387

  •  06-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

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

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

но как насчет этого?

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

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

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

Другие советы

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

В 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.

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

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

obj.setX(10);

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

obj.X = 10;

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

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

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

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

Примеры:

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

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

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

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

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

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

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

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

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

value = [obj attr];

[obj setAttr:value];

[obj getAttr:&value];

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

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

Просто короткое дополнение. Еще одно соглашение заключается в том, что для получателей булевых полей следует добавлять префикс " is " вместо "получить", например, bool isEnabled () {возврат включен; }

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top