Кіріспе

Объектіге бағытталған бағдарламалау тілдеріндегі класс – бағдарламалау ұғымы.

Объектіге бағытталған бағдарламалау тілдерінде миксин ("алмаз проблемасы") немесе тілде көп мұрагерлікке қолдау көрсетілмеуіне байланысты туындайтын мәселені шешу үшін қолданылады. Миксинді іске асырылған әдістері бар интерфейс ретінде де қарастыруға болады. Бұл үлгі тәуелділікті кері аудару принципін сақтаудың мысалы болып табылады.

Тарих

Миксиндер алғаш рет Symbolics компаниясының объектіге бағытталған Flavors жүйесінде пайда болды (Говард Кэннон әзірлеген), бұл Lisp Machine Lisp-те қолданылатын объектіге бағытталғандыққа қатысты тәсіл болды. Атауы Массачусетс штатының Сомервилл қаласындағы Стив мұздығынан шабыттанды: мұздықтың иесі негізгі дәмдегі мұздықты (ваниль, шоколад сияқты) және қосымша ингредиенттерді (жаңғақ, печенье, шоколадты глазурь және т.б.) араластырып, оны "mix in" деп атады – сол кездегі оның тіркелген тауарлық атауы.

Анықтама

Миксиндер – бағдарламашыға сыныпқа кодты қосуға мүмкіндік беретін тілдік ұғым. Миксинмен бағдарламалау – бағдарламалық жасақтаманы әзірлеу стилі, онда функционалдық бөліктер сыныпта жасалады, содан кейін басқа сыныптармен біріктіріледі. Миксин класы қажетті функционалдықты қамтитын ата сынып рөлінде әрекет етеді. Одан кейін, түп сынып бұл функционалдықты мұраға алуға немесе жай ғана қайта пайдалануға болады, бірақ бұл мамандану құралы ретінде емес. Әдетте, миксин қажетті функционалдықты бағынышты сыныпқа экспорттайды, қатаң және біртұрлы "болып табылады" қатынасын құрмайды. Миксиндер мен мұрагерлік ұғымдарының арасындағы маңызды айырмашылық осында: бағынышты сынып әлі де ата сыныптың барлық мүмкіндіктерін мұралай алады, бірақ бағынышты сыныптың "атасының бір түрі" екендігі туралы семантика міндетті түрде қолданылмайды.

Артықшылықтар

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

Қолданылу

Simula-да кластар атрибуттар, әдістер және класты инициализациялаудың бәрі бірге анықталатын блокпен анықталады; осылайша, класта шақырылатын барлық әдістер бірге анықталады және кластың анықтамасы толық болады. Flavors-та миксин – басқа кластың слот анықтамалары мен әдістерін мұралай алатын класс. Миксиннің тікелей мысалдары болмайды. Flavor бірнеше Flavor-дан мұрагерлік ала алатындықтан, ол бір немесе бірнеше миксиннен мұрагерлік ала алады. Назар аударыңыз, бастапқы Flavors жалпы функцияларды қолданбаған. New Flavors (Flavors-тың жалғасы) және CLOS-та әдістер «жаппай функциялар» арқылы ұйымдастырылған. Бұл жаппай функциялар – бірнеше жағдайда (әдістерде) класс диспетчерлігі және әдіс комбинациялары арқылы анықталатын функциялар. CLOS және Flavors миксин әдістеріне қазіргі әдістерге мінез-құлық қосуға мүмкіндік береді: Flavors-та :before және :after демон, whopper және wrapper. CLOS :around әдістерін және көлеңкелі әдістерді шақыру мүмкіндігін қосты. Мысалы, ағын құлыптау миксині ағын класының қазіргі әдістерінің айналасында құлыптауды қоса алады. Flavors-та wrapper немесе whopper жазылады, ал CLOS-та :around әдісі қолданылады. CLOS және Flavors екеуі де әдіс комбинациялары арқылы есептелген қайта пайдалануға мүмкіндік береді. :before, :after және :around әдістері – стандартты әдіс комбинациясының ерекшелігі. Басқа әдіс комбинациялары да бар. Мысалы, + әдіс комбинациясы, онда жаппай функцияның қолданылатын әдістерінің әрқайсысынан алынған мәндер қайтару мәнін есептеу үшін арифметикалық түрде қосылады. Бұл, мысалы, графикалық объектілер үшін шекаралық миксинмен қолданылады. Графикалық объект жалпы ен функциясына ие болуы мүмкін. Шекаралық миксин объектіге шекара қосады және оның енін есептеу әдісі бар. Жаңа класс – шекараланған түйме (графикалық объекті және шекаралық миксинді пайдаланады) оның енін барлық қолданылатын ен әдістерін + әдіс комбинациясы арқылы шақыру арқылы есептейді. Барлық қайтарылған мәндер қосылады және объектінің жиынтық енін құрайды. OOPSLA 90 мақаласында Гилад Брача және Уильям Кук Smalltalk, Beta және CLOS-та кездесетін әртүрлі мұрагерлік механизмдерін миксин мұрагерлігінің ерекше түрлері ретінде қайта қарастырады.

Басқа тілдерде

Curl веб-контент тілінде бірнеше мұрагерлік, инстанциялары жоқ сыныптар әдістерді іске асыру үшін қолданылады. Көп қолданылатын миксиндерге SkinnableControlUI-ден мұрагерлік алған барлық скиндейтін ControlUI элементтері, төмен түсірілетін мәзірлерді қажет ететін пайдаланушы интерфейсі делегаттары және FontGraphicMixin, FontVisualMixin және NumericAxisMixin сияқты нақты аталған миксин кластары жатады. 7.0 нұсқасы кітапханаға қолжетімділікті қосты, соның арқасында миксиндердің бір пакетте болуы немесе жалпыға ортақ абстракт болуы міндетті емес. Curl конструкторлары – интерфейстерді немесе миксиндерді тікелей жарияламастан бірнеше мұрагерліктерді пайдалануға мүмкіндік беретін фабрикалар.

Интерфейстер мен қасиеттері

Java 8 интерфейстерде әдепкі әдістерді (default methods) жаңа мүмкіндік ретінде ұсынады. Негізінен, бұл интерфейске жаңа әдіс қосылатын жағдайда, интерфейс класын бағдарламалау аяқталғаннан кейін әдіс интерфейсте анықталуына мүмкіндік береді. Интерфейске жаңа функция қосу, интерфейсті пайдаланатын әрбір класта осы әдістің іске асырылуын талап етеді. Әдепкі әдістер осы жағдайда көмектеседі, оларды кез келген уақытта интерфейске қосуға болады және олармен байланысты кластар қолданатын іске асырылған құрылымға ие болады. Сондықтан әдепкі әдістер Java-да миксин тұжырымдамасын қолдану мүмкіндігін ұсынады. Интерфейстер аспектке бағытталған бағдарламалаумен біріктіріліп, C# немесе Java сияқты мұндай мүмкіндіктерді қолдайтын тілдерде толыққанды миксиндерді құруға болады. Сонымен қатар, маркерлік интерфейс үлгісін, жалпылама бағдарламалауды және кеңейту әдістерін пайдалану арқылы C# 3.0 миксиндерді имитациялай алады. Dart 2.7 және C# 3.0 кеңейту әдістерін енгізді, оларды классқа ғана емес, интерфейстерге де қолдануға болады. Кеңейту әдістері классқа оның құрылымын өзгертпей қосымша функционалдық мүмкіндіктерді қосады. Бұл жағдайда, кеңейту әдістерін анықтайтын нақты функционалдық үшін статикалық көмекші класс құруға болады. Кластар интерфейсті іске асыратындықтан (нақты интерфейсте ешқандай әдіс немесе қасиет болмаса да), олар барлық кеңейту әдістерін де қабылдайды. C# 8.0 әдепкі интерфейс әдістері мүмкіндігін қосады. ECMAScript (көбінесе JavaScript ретінде іске асырылады) бір объектіден екіншісіне өрістерді қадамдық түрде көшіру арқылы объектілерді құрастыруды имитациялау қажеттілігін жоққа шығарады. Ол қосымша мінез-құлықты іске асыратын функциялық объектілер арқылы Trait және миксин негізделген объектілерді құрастыруды табиғи түрде қолдайды, содан кейін осы функциялық объектілер шақыру немесе қолдану арқылы осындай жаңа функционалдылыққа мұқтаж объектілерге жіберіледі.