2013-09-28 3 views
0

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

Ex:

void setShowFPS(boolean b){ 
    this.showFps = b; 
} 

против просто вызов переменной

showFps = false; 
+3

Это называется [инкапсуляция] (http://en.wikipedia.org/wiki/Encapsulation_ (объект-oriented_programming)) –

+0

@LuiggiMendoza: Нет, это называется "бесполезная работа". Правильная инкапсуляция означает, что вызывающему абоненту вообще не нужно устанавливать свойство. – cHao

ответ

1

Как правило, это хорошая практика для ваших переменных класса, которые должны быть частными, а это означает, что они не могут быть установлены только путем методы и конструкторы класса, к которым принадлежат переменные. Преимущество использования методов для установки переменных (эти методы называются setters) заключается в том, что вы можете предоставить логику проверки в рамках метода.

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

+0

Исправлено? Если нет, пожалуйста, уточните, что неправильно. – nhgrif

+0

Лучше, но вы также можете уточнить, что класс может устанавливать собственные частные члены (напрямую). – keyser

0
void setShowFPS(boolean b){ this.showFps = b; } 

Это относительно простая процедура. Представьте, что у вас было поле типа double, например, где он должен был иметь нечетную целую часть. Вы бы установить showFps быть частными, а затем получить доступ к нему через прямой геттер и сеттер валидации (показано здесь в синтаксисе Java):

void setF(double f_) throws IllegalArgumentException { 
    int ip=(int) f; 
    if(ip%2!=1) throw new IllegalArgumentException(); 
    this.f = f_; 
} 

сеттера могут делать такие вещи, как обновление других полей косвенно пострадавший (например, временная метка последнего изменения, например). Во всяком случае, если вам когда-либо приходилось обновлять внутренний код для использования BigInteger, например, возможность получить и установить через двойники извне заставит пользователей вашего класса нарушать ваши изменения.

C# будет использовать свойства для этого, возможно.

1

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

void setShowFPS(boolean b) { 
    this.showFps = b; 
    // Trigger the event 
    if (b) { 
     OnFpsSet(); 
    } 
} 

Кроме того, C# предлагает вам свойства, которые дают вам больше контроля и инкапсуляции, как это делает метод, и они выглядят как переменные снаружи. Это более идиоматическое использовать свойство вместо сеттеров с одним аргумента:

bool _ showFps; 
bool showFps { 
    get { 
     return _showFps; 
    } 
    set { 
     _showFps = value; 
    } 
} 
0

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

0

Я предполагаю, что вы имеете в виду, почему инкапсулировать приватную переменную?

Есть несколько причин:

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

  2. Скрыть, как объект реализует свой контракт. Это позволяет вам изменить способ работы вашего класса, не нарушая при этом другой код, основанный на вашей реализации.

  3. Произвести несколько обновлений атомарно. Более сложные операции, возможно, не смогут быть выполнены «одновременно». Используя механизмы синхронизации и блокировки, вы можете разрешить безопасную публикацию в многопоточной среде.