Изучаем С++ создавая игры в ue4 Уилльям Шериф Изучайте программирование С++ с интересным применением реально мира, что позволит вам создавать ваши собственные игры!


Но в чём же всё-таки идея операций get/set?



Pdf көрінісі
бет128/252
Дата06.01.2022
өлшемі12,25 Mb.
#11940
1   ...   124   125   126   127   128   129   130   131   ...   252
Но в чём же всё-таки идея операций get/set? 
Итак, первый вопрос, который возникает в голове новоиспечённого программиста, 
когда он впервые сталкивается с операциями get/set для частных переменных, это: 
“не  являются  ли  они  обречёнными  на  провал?”.  Я  имею  в  виду,  в  чём  смысл 
скрывать доступ к элементам данных, когда мы собираемся открыть эти же самые 
данные  снова  другим  путём?  Это  как  сказать:  “Вы  не  можете  взять  шоколадки, 
потому  что  они,  чьи  то  собственные,  до  тех  пор,  пока  не  скажете:  «пожалуйста 
дайМнеШоколадку()
». А потом, можете брать их”. 
Некоторые  опытные  программисты  даже  сокращают  функции  get/set  до  одной 
строки: 
string getName(){ return name; } 
void setName( string newName ){ name = newName; } 
Давайте  ответим  на  этот  вопрос.  Не  разрушает  ли  пара  get/set  инкапсуляцию, 
полностью открывая данные? 
Ответ двоякий. Во первых, функция-член get в основном возвращает только копию 
элемента  данных  к  которому  создавала  доступ.  Это  означает,  что  значение 
оригинального элемента данных остаётся защищённым не подлежит модификации 
через операцию get(). 
Set()  (метод  мутатор)  операция  немного  противоречивая  однако.  Если  сеттер 
проходит  через  (passthru)  операцию,  такую  как 
void  setName(  string  newName  )  { 
name=newName;  }
,  затем  наличие  сеттера  может  показаться  бессмысленным.  В 
чём  преимущество  использования  метода  мутатор  вместо  переписывания 
переменной напрямую? 
Аргумент  для  использования  метода  мутатора  это  написать  дополнительный 
код перед назначением переменной, чтобы защитить переменную от принятия 
некорректного  значения.  Например,  скажем,  у  нас  есть  сеттер  для  элемента 
данных hp, что выглядит таким образом: 
void setHp( int newHp ) 

// 
защита переменной hp от принятия отрицательного значения 
if( newHp < 0 ) 

cout << "
Ошибка, hp игрока не может быть меньше чем 0" << endl; 
newHp = 0; 

hp = newHp; 
}
 


117 | 
С т р а н и ц а
 
 
Метод  мутатора  предполагает  предотвращение  принятия  отрицательного 
значения  внутренним  элементом  данных  hp.  Вы  можете  рассматривать  метод 
мутатора отчасти имеющим обратную силу. Должна ли ответственность лежать на 
вызывающем коде, в проверке значения, которое он установил до  вызова setHp(-
2), и не допускать этого, как только оно попадается в методе мутатора? Можете ли 
вы  использовать  публичную  переменную-член  и  возложить  ответственность  в  
проверке  того,  что  переменная  не  принимает  недействительных  значений  в 
вызове кода, а не в сеттере? Да, вы можете. 
Тем не менее, это суть применения метода мутатора. Идея метода мутатора в том
что  вызывающий  код  может  передавать  любое  значение  которое  он  хочет  для 
функции  setHp  (например,  setHp(-2)),  без  необходимости  беспокоиться  о  том, 
будет  ли  значение,  передаваемое  функции,  пригодным  или  нет.  Затем  функция 
setHp  принимает  ответственность,  в  том,  чтобы  убедиться,  является  ли  значение 
для переменной hp пригодным.  
Некоторые  программисты  считают  прямые  функции  мутатор,  такие  как 
getHp()/setHp() дурно пахнущим кодом. Дурно пахнущий код – это в целом плохая 
практика  программирования,  которую  откровенно  не  замечают,  за  исключением 
лёгкого  чувства,  что,  что-то  было  сделано  не  оптимально.  Они  спорят  о  том,  что 
вместо  мутаторов  могут  быть  написаны  функции-члены  более  высокого  уровня. 
Например, вместо функции-члена setHp() у нас должны быть публичные функции-
члены, такие как 
восстанавливать()
 и 
наноситьУрон()
. Статья по этой теме доступна на 
http://c2.com/cgi/wiki?AccessorsAreEvil



Достарыңызбен бөлісу:
1   ...   124   125   126   127   128   129   130   131   ...   252




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет