Кіріспе

Күйдегі өзгерістерге жол бермейтін объекті

Объектіге бағытталған (ОО) және функционалдық бағдарламалауда өзгермейтін объект (өзгеріссіз объект) – жасалғаннан кейін күйін өзгертуге болмайтын объекті. Бұл өзгертілетін объектіге (өзгеріс болатын объектіге) қарама-қарсы, оны жасағаннан кейін өзгертуге болады. Кейбір жағдайларда, объектінің ішкі атрибуттары өзгергенімен, сыртқы тұрғыдан оның күйі өзгермейтін болып көрінетін болса, ол өзгермейтін объекті деп есептелуі мүмкін. Мысалы, қымбат есептеулердің нәтижелерін сақтау үшін мемоизацияны пайдаланатын объекті де өзгермейтін объекті болып саналуы мүмкін. Жолдар және басқа да нақты объектілер көбінесе ОО бағдарламалауда оқуға қолайлы болуы және орындалу жылдамдығын арттыру үшін өзгермейтін объектілер ретінде бейнеленеді. Өзгермейтін объектілер қауіпсіздік тұрғысынан да тиімді, өйткені олар өздігінен жіптерге қауіпсіз (thread-safe). Бұл, мысалы, объектінің өмірлік циклі бойына өзгермейтін деректерге қатысты белгілі бір шарттарды сақтауға көмектеседі. Кейбір бағдарламалау тілдерінде бұл `const` (C++-та) немесе `final` (Java-да) сияқты кілттік сөздер арқылы іске асырылады, олар өрісті өзгермейтін деп белгілейді. Ал кейбір тілдер керісінше: OCaml-де объектінің немесе жазбаның өрістері әдепкі бойынша өзгермейтін болып келеді және өзгертілетін болуы үшін `mutable` деп нақты көрсету қажет.

Нысандарға сілтемелер

Көптеген объектіге бағытталған тілдерде нысандарға сілтемелер арқылы жүгінуге болады. Мұндай тілдердің мысалдары – Java, C++, C#, VB.NET, сондай-ақ Perl, Python және Ruby сияқты көптеген сценарийлік тілдер. Мұндай жағдайда, нысандар сілтемелер арқылы бөлісілген кезде, нысанның күйі өзгеруі маңызды.

Нысандарды көшіру мен сілтемелеу

Егер объекті өзгермейтін болып белгілі болса, оның толық көшірмесін жасаудың орнына сілтеме жасау дұрыс. Бұл жадты үнемдеу үшін, деректердің дубликатын болдырмау және конструкторлар мен деструкторларды шақырудан аулақ болу мақсатында жасалады; сондай-ақ, орындалу жылдамдығын арттыруға мүмкіндік береді. Өзгертілетін объектілер үшін сілтеме көшіру әдісін қолдану қиын, себебі егер өзгертілетін объектінің сілтемесін пайдаланатын кез келген қолданушы оны өзгертсе, осы сілтемені пайдаланатын барлық басқа қолданушылар да сол өзгерісті көреді. Егер мұндай нәтиже күтілмесе, басқа қолданушыларды дұрыс жауап беру үшін хабарлау қиын болуы мүмкін. Мұндай жағдайларда, сілтеме емес, толық объектіні қорғанышпен көшіру көбінесе оңай, бірақ шығынды шешім болып табылады. Көзбен қадағалау үлгісі – өзгертілетін объектілердегі өзгерістерді басқарудың баламалы тәсілі.

Жазуға көшіру

Өзгермелі және өзгермейтін нысандардың артықшылықтарын біріктіретін және дерлік барлық заманауи аппараттық құралдарда тікелей қолдау көрсетілетін техника – жазу кезінде көшіру (COW). Осы техниканы пайдалану арқылы, пайдаланушы жүйеден нысанды көшіруді сұрағанда, жүйе сол нысанға әлі де сілтеме жасайтын жаңа сілтеме ғана жасайды. Пайдаланушы белгілі бір сілтеме арқылы нысанды өзгертуге тырысқанда, жүйе нақты көшірме жасап, оған өзгерісті қолданып, сілтемені жаңа көшірмеге бағыттайды. Басқа пайдаланушыларға ешқандай әсер етпейді, себебі олар әлі де бастапқы нысанға сілтеме жасайды. Осылайша, COW жағдайында барлық пайдаланушылар өз нысандарының өзгермелі нұсқасына ие болып көрінеді, бірақ егер пайдаланушылар өз нысандарын өзгертетін болмаса, өзгермейтін нысандардың жадты үнемдеу және жылдамдық артықшылықтары сақталады. Жазу кезінде көшіру виртуалды жад жүйелерінде кең таралған, себебі ол жадты үнемдеуге мүмкіндік береді және қолданба бағдарламасының кез келген әрекетін дұрыс орындай алады.

Интернатталу

Бірдей объектілердің көшірмелерін пайдаланудың орнына сілтемелерді қолдану тәжірибесі интерн деп аталады. Егер интерн қолданылса, екі объект тең деп есептеледі, егер олардың сілтемелері – әдетте көрсеткіштер немесе бүтін сандар түрінде ұсынылса – тең болса ғана. Кейбір тілдер мұны автоматты түрде жасайды: мысалы, Python қысқа жолдарды автоматты түрде интерндейді. Егер интерн іске асыратын алгоритм мүмкін болатын барлық жағдайларда оны іске асыруға кепілдік берілсе, онда объектілерді теңдік үшін салыстыру олардың көрсеткіштерін салыстыруға дейін тоғытылады – бұл көптеген қолданбаларда айтарлықтай жылдамдыққа қол жеткізеді. (Алгоритмнің толықтығына кепілдік берілмесе де, объектілер бірдей болғанда және бірдей сілтемені қолданғанда жылдам әрекет ету мүмкіндігі сақталады.) Интерн көбінесе өзгертілмейтін объектілер үшін ғана тиімді.

Сызық қауіпсіздігі

Өзгермейтін нысандар көп жіпті қолданбаларда пайдалы болуы мүмкін. Көптеген жіптер өзгермейтін нысандармен ұсынылған деректермен жұмыс істеуге болады, басқа жіптер деректерді өзгертеді деген алаңдаусыз. Сондықтан өзгермейтін нысандар өзгертілетін нысандарға қарағанда жіптерге қауіпсіз деп есептеледі.

Өзгермеушілікті бұзу

Өзгермеушілік компьютер жадында сақталған нысанды өзгертпеуге болмайтындығын білдірмейді. Керісінше, өзгермеушілік – компиляция кезінде құрылатын конструкция, ол бағдарламашының нысанның әдеттегі интерфейсі арқылы не істей алатынын көрсетеді, міндетті түрде олардың абсолютті түрде не істей алатынын емес (мысалы, типтік жүйені айналып өту арқылы немесе C немесе C++ тілдерінде константалық дұрыстықты бұзу арқылы).

Тілге қатысты нақты мәліметтер

Python, Java және .NET Framework-та жолдар өзгертілмейтін нысандар болып табылады. Java мен .NET Framework-тың екеуінде де жолдың өзгертілетін нұсқалары бар. Java-да бұл StringBuffer және StringBuilder (Java-ның өзгертілетін нұсқалары), ал .NET-те бұл StringBuilder ( .NET жолының өзгертілетін нұсқасы). Python 3-те өзгертілетін жолдың (байт) bytearray деп аталатын нұсқасы бар. Сонымен қатар, Java-дағы барлық примитивті қаптаушы (wrapper) кластар өзгертілмейтін. Осыған ұқсас үлгілер – Immutable интерфейсі және Immutable қаптаушысы. Таза функционалдық бағдарламалау тілдерінде тілді кеңейтпей (мысалы, өзгертілетін сілтемелер кітапханасы немесе сыртқы функция интерфейсі арқылы) өзгертілетін нысандарды жасау мүмкін емес, сондықтан барлық нысандар өзгертілмейтін.