В чем выгода явного именования методов получения и установки как «get ...» и «set ...»? - PullRequest
3 голосов
/ 05 августа 2009

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

 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" не были разбросаны повсюду? Подумайте, сколько еще кода мы могли бы напечатать, если бы нам не приходилось набирать эти три буквы снова и снова ?! (язык немного в щеке)

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

Ответы [ 11 ]

4 голосов
/ 05 августа 2009

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

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

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

3 голосов
/ 05 августа 2009

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

Например, в шаблонизаторе Velocity вы можете написать что-то вроде:

The answer is $block.key

Выше будет попытаться вызвать:

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

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

3 голосов
/ 05 августа 2009

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

2 голосов
/ 05 августа 2009

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

2 голосов
/ 05 августа 2009

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

int parameter() const { return m_param }
void parameter(int param) { m_param = param; }
2 голосов
/ 05 августа 2009

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

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

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

1 голос
/ 05 августа 2009

Да, get / set в java, по сути, является решением проблемы в языке.

Сравнение с c #ропринадлежностями

http://www.csharp -station.com / Учебники / Lesson10.aspx

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

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

0 голосов
/ 05 августа 2009

Слушай, слушай.

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

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

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

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

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

0 голосов
/ 05 августа 2009

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

...