Какое определение для "accessor method"? - PullRequest
14 голосов
/ 08 марта 2009

У меня был спор об использовании слова «accessor» (контекст - Java-программирование). Я склонен считать, что методы доступа неявно являются «средствами доступа к свойствам», то есть термин подразумевает, что он более или менее предназначен для обеспечения прямого доступа к внутреннему состоянию объекта. Другая сторона настаивает на том, что любой метод, который каким-либо образом касается состояния объекта, является средством доступа.

Я знаю, что вы, ребята, не можете выиграть спор за меня, но мне любопытно узнать, как вы определите этот термин. :)

Ответы [ 8 ]

16 голосов
/ 08 марта 2009

При работе с аксессорами я склонен думать о геттерах и сеттерах.

Настаивая на том, что все методы, которые касаются внутреннего состояния объекта, являются аксессорами, кажется, что любой метод экземпляра, который фактически использует состояние объекта, будет аксессором, и это просто не кажется правильным. Какой метод экземпляра не будет использовать состояние объекта? Другими словами, метод экземпляра, который каким-либо образом не использует состояние объекта, не должен начинаться с метода экземпляра - это должен быть метод класса .

Например, должен ли метод BigDecimal.add считаться средством доступа? Это метод, который считывает значение экземпляра, для которого был вызван метод add, а затем возвращает результат после добавления значения другого BigInteger. Вполне очевидно, что метод экземпляра add не является ни получателем, ни установщиком.

8 голосов
/ 08 марта 2009

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

private int _age;

public int getAge()
{
    return _age;
}

Методы, которые изменяют состояние, более полезны (на мой взгляд) как мутаторы.

3 голосов
/ 25 апреля 2013

Методы доступа: getRed, getGreen и getBlue

Эти методы обычно получают доступ к значению.

Методы мутации: setRed, setGreen, setBlue

Мутатор изменит значение

3 голосов
/ 08 марта 2009

Помимо googling и wikipedia, Спецификация языка Java показывает это как пример метода доступа:

private static int N;
public static int getN() { return N; }

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

1 голос
/ 16 октября 2014

Методы доступа используются для доступа к полям объекта. Таким образом, методы получения и установки являются методами доступа. Метод наблюдателя - правильный термин для метода, который делает более общее наблюдение за объектом, не вызывая внешне наблюдаемых побочных эффектов. Метод, основной целью которого является побочные эффекты, - это метод мутатор . Поэтому сеттеры являются примером метода мутатора. В целях хорошей инженерной практики следует избегать общедоступных сеттеров, поскольку они не позволяют классу принудительно применять инварианты к своим данным: они нарушают барьер абстракции, который класс обычно должен применять.

1 голос
/ 08 марта 2009

Я всегда следовал первому определению. Итак, как правило, это относится только к геттерам и сеттерам. Если мы пойдем вторым методом, то это гораздо менее полезное различие, поскольку оно охватывает почти все методы.

0 голосов
/ 16 июня 2015

Метод, который обеспечивает доступ (может быть «доступ на чтение» или «доступ на запись») к внутренним объектам, является «методом доступа».

Авторы здесь, безусловно, используют это следующим образом:

  1. http://www.javaworld.com/article/2073723/core-java/why-getter-and-setter-methods-are-evil.html

  2. http://c2.com/cgi/wiki?AccessorsAreEvil

Я думаю, что термин может происходить из Common Lisp (не все?) - с помощью setf, используемого для изменения значения слотов доступа.

0 голосов
/ 08 июля 2009

Хорошо иметь возможность различать геттеры и сеттеры в техническом разговоре. Accessor методы являются партнерами modifier методов. Accessor s читает состояние объекта (getA()), а modifier s записывает состояние (setA(Object)).

...