Классы: публичные переменные или публичные функции для изменения локальных переменных? - PullRequest
1 голос
/ 03 ноября 2008

Именно то, что говорит название темы,

В каких случаях вы бы предпочли использовать открытые функции для изменения локальных переменных, а не просто определять эту переменную как открытую и изменять ее напрямую?

Ответы [ 5 ]

4 голосов
/ 03 ноября 2008

Не открывать элементы данных напрямую : использование непрозрачных методов доступа означает, что вы можете изменить реализацию позднее, не меняя интерфейса.


Я должен знать. Время от времени я использую короткий путь, и мне приходилось сожалеть об этом.

2 голосов
/ 03 ноября 2008

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

Если возможно установить переменную в нечто такое, что переводит объект в недопустимое состояние, вам, вероятно, следует также использовать функцию мутатора. Таким образом, вы можете выбросить исключение (или вернуть ошибку, или просто проигнорировать), если что-то незаконное должно произойти. Это делает чудеса для отладки.

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

1 голос
/ 03 ноября 2008

Вы должны указать, с каким языком вы имеете дело, так как это повлияет на ответ.

Ваша первая мысль должна быть об API для вашего класса. Если вы хотите, чтобы этот API-интерфейс был стабильным (и вы должны это делать!), Подумайте, как можно позже преобразовать простую переменную в полноценный метод.

Во многих языках вы не можете изменить переменную на метод без изменения вызывающего кода. C, C ++ и Java попадают в эту категорию. Никогда не используйте публичные переменные в этих языках, потому что у вас не будет места для маневра в дальнейшем.

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

C # Я считаю, что имеет свойства, которые позволяют прозрачно изменять переменные в методы, но я не уверен.

1 голос
/ 03 ноября 2008

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

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

Итак:

  1. Не предоставляйте средства доступа или функции мутатора для каждого члена каждого написанного вами класса. Предоставляйте функции доступа / мутатора, только если методы доступа / мутатора являются разумной и полезной частью интерфейса класса (API).

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

0 голосов
/ 03 ноября 2008

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

Не рекомендуется изменять переменные снаружи.

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

...