В чем преимущество явного присвоения имен получателям и установщикам как “get ...” и “set ...”?

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

Вопрос

Это раздражает кого-нибудь еще там?Я бы гораздо предпочел увидеть:

 block.key(newKey);  // set the key for this block

и

 testKey = block.key();  // look up the key for this block

чем

 block.setKey(newKey); // set the key for this block
 testKey = block.getKey(); // look up the key for this block

Во-первых, "set" и "get" являются избыточными (и, следовательно, добавляют шум, снижающий читабельность).Действие (set /get) определяется синтаксисом каждого оператора.Я понимаю эту перегрузку.Фактически, использование одного и того же точного идентификатора подтверждает, что это одно и то же свойство объекта.Когда я читаю "getKey()" и "setKey()" Возможно, я не так уверен.

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

Я полагаю, что это предубеждение проистекает из моего опыта работы с Smalltalk, но в мире, где полиморфизм работает просто отлично, не было бы ли бы нам лучше без "get" и "set", разбросанных повсюду?Только подумайте, сколько еще кода мы могли бы ввести, если бы нам не приходилось набирать эти три буквы снова и снова ?!(слегка насмешливо)

Кто-нибудь там чувствует то же самое?

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

Решение

Добавление префиксов к средствам доступа с помощью "get" и мутаторов с помощью "set" - это практика, которая варьируется от языка к языку и, по-видимому, в основном распространена в Java.Например:

  • В Python у вас есть концепция свойств, и поэтому средство доступа может выглядеть следующим образом obj.foo и мутатор может выглядеть как obj.foo = bar (даже несмотря на то, что методы вызываются за кулисами).Аналогичные концепции существуют в таких языках, как Ruby.Таким образом, во многих языках вызовы средств доступа и мутаторов выглядят как прямые "вызовы" переменных экземпляра, и вы никогда не увидите ничего подобного "setFoo" или "getFoo".
  • Такие языки, как Objective-C, не поощряют практику добавления к средствам доступа префикса "get", поэтому в Objective-C вы увидите вызовы типа [obj foo] и [obj setFoo:bar].

Мне также никогда не нравилась практика префикса средств доступа в Java с помощью "get", но я вижу преимущество в префиксе мутаторов с помощью "set".Тем не менее, поскольку преобладающей практикой в Java является использование префикса "get" / "set", я продолжаю эту тенденцию в своем собственном коде.

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

Разработчики C #, по-видимому, согласны, и тег 'C #' превосходит следующий по популярности язык в StackOverflow в 2: 1.Поэтому я подозреваю, что вы проповедуете перед хором.

В нескольких языках существуют разные способы обработки геттеров и сеттеров.В Java у вас есть getName и setName, в Qt у вас есть name и setName.Я предпочитаю Java-способ по этим причинам:

  1. Что делать, если у вас есть функция, которая называется drive?Заставляет ли это ваш класс ездить, или он устанавливает / получает диск?
  2. Включив предложения, вы можете ввести get, а затем получить все получатели.Это очень полезно, если вы не помните имя нужного вам средства получения.
  3. Основываясь на причине номер один, он разделяет функции на разные группы.У вас есть функции, которые что-то делают, они не начинаются с get или set (хотя, возможно, они должны начинаться с do?).Затем у вас есть функции, которые получают свойство, и все они начинаются с get .Затем у вас есть функции, которые задают свойство, и все они начинаются с set .

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

Язык Java в настоящее время не имеет свойств, поэтому синтаксис getter / setter стал стандартом де-факто.Если вы пишете Java-код, вам будет удобно использовать Java convention.Это делается не только для того, чтобы другие программисты могли прочитать ваш код, но, что более важно, сотни других фреймворков Java созданы для обработки объектов, поддерживающих Java - боб получатели / установщики стилей.

Например, в Механизм создания шаблонов скоростей, вы могли бы написать что - то вроде:

The answer is $block.key

Приведенное выше действие попытается вызвать:

block.getkey();
block.getKey();

Если вы определили block.getKey(), то все будет работать нормально.Как правило, лучше всего следовать условностям языка.

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

В C ++ я просто использую перегрузку

int parameter() const { return m_param }
void parameter(int param) { m_param = param; }

Да, get / set в java - это, по сути, обходной путь проблемы в языке.

Сравнивая это с c # properites

http://www.csharp-station.com/Tutorials/Lesson10.aspx

Или python http://blog.fedecarg.com/2008/08/17/no-need-for-setget-methods-in-python/

Я думаю, что это один из самых больших недостатков java.

Получатели и установщики C # являются объектами "первого класса" и синтаксически не похожи на вызовы функций (хотя любой произвольный код может выполняться в контексте средства доступа).

Я использую get / set только на языках, которые заставляют меня это делать, например Objective-C.

Вы можете легко выполнить поиск в вашей кодовой базе ссылок на getDrive() или setDrive().Если ваш метод называется просто "drive", вы получите гораздо больше ложных срабатываний при поиске.

Слышу, слышу.

Мне действительно нравятся специальные обозначения для геттеров и сеттеров.КЛУ сделал это лучше всех:

  • Используя p.x в выражении было эквивалентно вызову get_x(p).

  • Используя p.x := e (назначение) было эквивалентно вызову set_x(p, e).

Если интерфейс для объекта p не экспортировал get_x или set_x, вам не позволили выполнить соответствующую операцию.Просто.

Давайте послушаем, что это за синтаксический сахар!

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