У меня возникают проблемы с разграничением между аксессорами/геттерами, которые представляют свойства объекта и обычные методы. В C++ соглашения об именах для методов доступа и обычных методов различаются (например, руководство по стилю Google предлагает строчные буквы для методов доступа и PascalCase для обычных методов). Более того, порядок обычных методов и методов доступа/геттеров (до или после) также подлежит соглашениям. В Java может возникнуть дилемма, должен ли метод начинаться с «получить» или «вычислить»/«найти», чтобы указать геттер и обычный метод соответственно. В C# существует дилемма, что должно быть свойством, а что методом. Всякий раз, когда я создаю новый класс, я не знаю, как классифицировать методы на обычные методы и геттеры.
Есть ли простой способ определить, что является свойством объекта/аксессора/геттера и что должно быть обычным методом?
И имеет ли что-либо из следующего какое-то отношение к различию между аксессором/геттером и обычным методом:
- Вычисление дешево
- Возвращается новый объект (или его копия) вместо (константной) ссылки
- нет сеттера
- Есть способ повлиять на это «свойство», но косвенно.
Чтобы проиллюстрировать это, вот пример (на C++): Предположим, я хочу создать структуру данных, которая может содержать фиксированное количество элементов, и помимо операций вставки/удаления она предлагает ряд методов, которые работают с содержащимися элементами ( т.е. среднее, медиана, минимум, максимум и т.д.). Теперь возьмем, например, функцию, которая вычисляет среднее значение; можно сказать, что это свойство объекта, и пересчитывать его всякий раз, когда элемент вставляется/удаляется, и, таким образом, рассматривать его как геттер, такой как const double& average()
. Другой способ — вычислить его по запросу и рассматривать как обычный метод, т. е. double ComputeAverage()
. Кроме того, предположим, что есть метод, который возвращает набор содержащихся элементов; его можно рассматривать как геттер const set<int>& unique_elements()
, если нет необходимости вычислять его каждый раз, но если класс вычисляет его каждый раз, то set<int> ComputeUniqueElements()
будет более подходящим.