Кіріспе

Компьютерлік ғылымда мутатор әдісі – айнымалының өзгерістерін басқару үшін қолданылатын әдіс. Олар сондай-ақ сеттер әдістері деп кеңінен танымал. Көбінесе сеттер жеке мүше айнымалысының мәнін қайтаратын геттермен бірге қолданылады. Бұлар жиынтығында аксессуарлар деп те аталады. Мутатор әдісі көбінесе объектіге бағытталған бағдарламалауда инкапсуляция принципіне сәйкес қолданылады. Осы принципке сәйкес, кластың мүше айнымалылары оларды жасыру және басқа кодтан қорғау үшін жеке болып жасырылады, оларды тек қалаған жаңа мәнді параметр ретінде қабылдайтын, қажет болса тексеріп, жеке мүше айнымалысын өзгертетін ашық мүше функциясы (мутатор әдісі) арқылы ғана өзгертуге болады. Мутатор әдістерін тағайындау операторын жүктеумен салыстыруға болады, бірақ олар әдетте объектілік иерархияның әртүрлі деңгейлерінде кездеседі. Мутатор әдістерін объектіге бағытталмаған ортада да қолдануға болады. Бұл жағдайда, өзгертілмекші айнымалыға сілтеме және жаңа мән мутаторға беріледі. Мұндай жағдайда компилятор кодты мутатор әдісін айналып өтіп, айнымалыны тікелей өзгертуден шектей алмайды. Дамытушылар айнымалы тек мутатор әдісі арқылы ғана өзгертілетініне және тікелей өзгертілмейтініне көз жеткізуге жауапты. Оларды қолдайтын бағдарламалау тілдерінде қасиеттер инкапсуляцияның тиімділігінен айырылмастан, ыңғайлы балама ұсынады. Төмендегі мысалдарда толыққанды іске асырылған мутатор әдісі кіріс деректерін тексеруге немесе оқиғаны іске қосу сияқты қосымша әрекеттерді орындауға қабілетті.

Салдары

Мутаторлар мен аксессор әдістерін немесе қасиеттер блоктарын анықтаудың орнына, инстанция айнымалысына жеке емес көрінетіндік беріп, объектілерден тысқары тікелей қол жеткізуге болады. Мутаторлар мен аксессорларды қолдану арқылы кіру құқықтарын әлдеқайда жақсы бақылауға болады. Мысалы, параметрді тек аксессор арқылы оқуға болады, мутаторды анықтамай. Екі әдістің көріну деңгейі әртүрлі болуы мүмкін; көбінесе аксессордың ашық болуы тиімді, ал мутатор қорғалған, пакеттік жеке немесе ішкі болуы мүмкін. Мутатор анықталған блок кіріс деректерін тексеруге немесе алдын ала өңдеуге мүмкіндік береді. Егер барлық сыртқы қолжетімділік мутатор арқылы жүзеге асырылса, онда осы қадамдарды айналып өту мүмкін емес. Мысалы, егер күнді жеке жыл, ай және күн айнымалыларымен көрсетілсе, кіріс күндері setDate мутаторымен бөлінеді, ал сәйкестік үшін сол жеке инстанция айнымалыларына setYear және setMonth арқылы қол жеткізіледі. Барлық жағдайларда 1 мен 12-ден тыс ай мәндері бірдей кодпен қабылдамауға болады. Аксессорлар керісінше, ішкі айнымалылардан пайдалы деректерді құруға мүмкіндік береді, сонымен бірге олардың құрылымын сыртқы модульдерден жасырып, капсулациялайды. Ақша сомасын алуға арналған аксессор (getAmount) жасырын валюта параметрімен анықталған ондық таңбалар саны бар сандық айнымалыдан жол құрауы мүмкін. Қазіргі заманғы бағдарламалау тілдері көбінесе мутаторлар мен аксессорлардың қалыпты үлгісін бір жолда жасауға мүмкіндік береді, мысалы, C#-тағы public string Name { get; set; } және Ruby-тегі attr_accessor :name. Бұл жағдайларда тексеру, алдын ала өңдеу немесе құрастыру үшін код блоктары жасалмайды. Бұл жеңілдетілген аксессорлар әлі де қарапайым ашық инстанция айнымалыларына қарағанда капсулацияның артықшылығын сақтайды, бірақ жүйелік жобалау дамыған сайын, бағдарламалық құралдарды күтіп ұстау және талаптар өзгергенде деректерге қойылатын талаптар күрделене түседі. Көптеген автоматты мутаторлар мен аксессорлар ақырында жеке код блоктарымен ауыстырылады. Оларды іске асырудың алғашқы кезеңдерінде автоматты түрде жасаудың пайдасы – сыныптың ашық интерфейсі күрделілік қосылған жағдайда да өзгермейді, бұл кең ауқымды қайта құруды қажет етпейді. Мутаторлары мен аксессорлары бар параметрлерді олар анықталған сыныптың ішінде манипуляциялау көбінесе қосымша ойлауды қажет етеді. Егер осы блоктарда қосымша код болмаса немесе одан да аз болса, іске асырудың алғашқы кезеңдерінде жеке инстанция айнымалысына тікелей қол жеткізу маңызды емес. Тексеру, өзара тексеру, деректердің тұтастығын тексеру, алдын ала өңдеу немесе басқа күрделіліктер қосылғанда, кейбір ішкі қолжетімділіктер жаңа кодты пайдаланса, ал басқа жерлерде оны айналып өтуге болады. Аксессор функциялары қосымша қадамдардың болуына байланысты деректерді тікелей алу немесе сақтаудан тиімсіз болуы мүмкін, бірақ мұндай функциялар көбінесе функция шақыруының қосымша шығындарын жоятын желіде орналастырылады.