Другое

Что такое геттеры и сеттеры: терминология и сравнение методов

Lorem ipsum dolor

Геттеры и сеттеры встречаются во многих популярных языках программирования:

  • Java,
  • JavaScript,
  • PHP,
  • C,
  • и др.

Где бы ни использовались геттеры и сеттеры, у них одна цель — защитить содержимое ваших скриптов, когда ими пользуется кто-нибудь другой.

 

Геттеры и сеттеры

Геттеры и сеттеры — это методы доступа, которые помогают вам управлять доступом к различным переменным в коде. В скриптах они пишутся так:

  • get (он же геттер) — применяется для чтения переменной;
  • set (он же сеттер) — применяется для записи переменной.

Чтобы лучше понять, как работают геттеры и сеттеры, нужно показать это на примере.

 

Геттеры и сеттеры для кваса

Итак, представим, что у нас есть собственная квас-машина наподобие кофе-машины, только с пивом:

function KvassMachine(power) {

//определяем, сколько кваса в нашей машине

this.kvassAmount = 0

...

}

 

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

//Наша квас-машина столько литров кваса не вместит!

kvassMachine.kvassAmount = 100000;

 

Но и это еще не все. Может получиться так, что кваса выпьют больше, чем вмещает наша квас-машина, например:

 

//никого не тревожит, что наша квас-машина вмещает всего 50 литров кваса, все просто подходят и пьют

kvassMachine.kvassAmount = -100000;

 

«Почему такой бардак с квасом происходит?» спросите вы. А все потому, что объем нашей квас-машины доступен снаружи и абсолютно всем. Абсолютно любой может к ней обратиться и добавить или взять кваса столько, сколько захочет. Для того чтобы такого не происходило, необходимо задать ограничение на использование нашей квас-машины со стороны остальных «любителей кваса».

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

function KvassMachine(power, volume) { // volume — это объем нашей квас-машины

var kvassAmount = 0;

 

var KVASS_COOL_VOLUME = 50;

 

function getTimeToBoil() {

return Amount * KVASS_HEAT_VOLUME * 40 / power;

}

 

// останавливаем квас-машину "с умом"

this.setkvassAmount = function(amount) {

if (amount< 0) {

throw new Error("Не может быть отрицательного значения");

}

if (amount > volume) {

throw new Error("Невозможно наливать большее количество кваса, чем " + volume);

}

 

kvassAmount = amount;

};

 

function onReady() {

alert( 'Охлажденный квас!' );

}

 

this.run = function() {

setTimeout(onReady, getTimeToBoil());

};

 

}

 

var kvassMachine = new KvassMachine(100, 50);

kvassMachine.setkvassAmount(500); // вот вам и ошибка!

 

Ошибка произошла, потому что «kvassAmount» это внутреннее свойство, которое можно «переписать», но пока невозможно «считать». Чтобы у внешних «любителей кваса» была возможность узнавать значение нашего свойства, нужно воссоздать особую функцию — геттер. В нашем случае это будет getKvassAmount. Например:

function KvassMachine(power, volume) {

//...

this.setKvassAmount = function(amount) {

if (amount< 0) {

throw new Error("Не может быть отрицательного значения");

}

if (amount > volume) {

throw new Error("Невозможно наливать большее количество кваса, чем " + volume);

}

 

kvassAmount = amount;

};

 

this.getKvassAmount = function() {

return kvassAmount;

};

}

 

var kvassMachine = new KvassMachine(100, 50);

kvassMachine.setKvassAmount(500);

alert( kvassMachine.getKvassAmount() ); // 500

 

Заключение

Геттеры и сеттеры призваны помочь контролировать переменные от внешнего вмешательства. А вам, в свою очередь, дают возможность безопасно читать и менять значения самой переменной.

Схожие статьи

Разработка мобильных приложений: необходимые инструменты и технология
Другое

Разработка мобильных приложений: необходимые инструменты и технология

Предложения думы о кибердружинах: загубит ли это российский интернет?
Другое

Предложения думы о кибердружинах: загубит ли это российский интернет?

Регрессионное тестирование — это что, где и зачем оно используется?
Другое

Регрессионное тестирование — это что, где и зачем оно используется?

KDevelop для Windows, сфера ее применения и главные особенности
Другое

KDevelop для Windows, сфера ее применения и главные особенности

×