Объектіге бағытталған бағдарламалаудағы миксин ұғымы
Mixin
Жаңа пішімдеу: Объектілі бағдарламалау тілдерінде миксиндер – кодты қайта пайдалану және мұрагерлік мәселелерін шешу үшін қолданылатын құрал. Бағдарламалау концепциясы.
Ағылшыншамен салыстырыңыз: абзацты басыңыз — түпнұсқа терезеде ашылады. Абзац астындағы EN түймесі оны мәтін ішінде көрсетеді.
Мазмұны
Кіріспе
Объектіге бағытталған бағдарламалау тілдеріндегі класс – бағдарламалау ұғымы.
Class in object oriented programming languages
the programming concept
Объектіге бағытталған бағдарламалау тілдерінде миксин ("алмаз проблемасы") немесе тілде көп мұрагерлікке қолдау көрсетілмеуіне байланысты туындайтын мәселені шешу үшін қолданылады. Миксинді іске асырылған әдістері бар интерфейс ретінде де қарастыруға болады. Бұл үлгі тәуелділікті кері аудару принципін сақтаудың мысалы болып табылады.
In object oriented programming languages, a mixin (or mix in) (the "diamond problem"), or to work around lack of support for multiple inheritance in a language. A mixin can also be viewed as an interface with implemented methods. This pattern is an example of enforcing the dependency inversion principle.
Тарих
Миксиндер алғаш рет Symbolics компаниясының объектіге бағытталған Flavors жүйесінде пайда болды (Говард Кэннон әзірлеген), бұл Lisp Machine Lisp-те қолданылатын объектіге бағытталғандыққа қатысты тәсіл болды. Атауы Массачусетс штатының Сомервилл қаласындағы Стив мұздығынан шабыттанды: мұздықтың иесі негізгі дәмдегі мұздықты (ваниль, шоколад сияқты) және қосымша ингредиенттерді (жаңғақ, печенье, шоколадты глазурь және т.б.) араластырып, оны "mix in" деп атады – сол кездегі оның тіркелген тауарлық атауы.
Mixins first appeared in Symbolics's object oriented Flavors system (developed by Howard Cannon), which was an approach to object orientation used in Lisp Machine Lisp. The name was inspired by Steve's Ice Cream Parlor in Somerville, Massachusetts: The owner of the ice cream shop offered a basic flavor of ice cream (vanilla, chocolate, etc.) and blended in a combination of extra items (nuts, cookies, fudge, etc.) and called the item a "mix in", his own trademarked term at the time.
Анықтама
Миксиндер – бағдарламашыға сыныпқа кодты қосуға мүмкіндік беретін тілдік ұғым. Миксинмен бағдарламалау – бағдарламалық жасақтаманы әзірлеу стилі, онда функционалдық бөліктер сыныпта жасалады, содан кейін басқа сыныптармен біріктіріледі. Миксин класы қажетті функционалдықты қамтитын ата сынып рөлінде әрекет етеді. Одан кейін, түп сынып бұл функционалдықты мұраға алуға немесе жай ғана қайта пайдалануға болады, бірақ бұл мамандану құралы ретінде емес. Әдетте, миксин қажетті функционалдықты бағынышты сыныпқа экспорттайды, қатаң және біртұрлы "болып табылады" қатынасын құрмайды. Миксиндер мен мұрагерлік ұғымдарының арасындағы маңызды айырмашылық осында: бағынышты сынып әлі де ата сыныптың барлық мүмкіндіктерін мұралай алады, бірақ бағынышты сыныптың "атасының бір түрі" екендігі туралы семантика міндетті түрде қолданылмайды.
Mixins are a language concept that allows a programmer to inject some code into a class. Mixin programming is a style of software development, in which units of functionality are created in a class and then mixed in with other classes. A mixin class acts as the parent class, containing the desired functionality. A subclass can then inherit or simply reuse this functionality, but not as a means of specialization. Typically, the mixin will export the desired functionality to a child class, without creating a rigid, single "is a" relationship. Here lies the important difference between the concepts of mixins and inheritance, in that the child class can still inherit all the features of the parent class, but, the semantics about the child "being a kind of" the parent need not be necessarily applied.
Артықшылықтар
Ол бір сыныпқа бірнеше сыныптың ортақ функционалдығын пайдалануға мүмкіндік беретін көп мұрагерлік механизмін ұсынады, бірақ көп мұрагерліктің күрделі мағынасынсыз. Кодты қайта пайдалану: Миксиндер бағдарламашыға әртүрлі сыныптар арасында функционалды бөлісуге көмектеседі. Бірдей кодты қайта-қайта жазудың орнына, ортақ функционалдылықты миксинге біріктіріп, қажетті әр сыныпқа қосуға болады. Миксиндер ата-ана сыныбынан қажетті мүмкіндіктерді ғана мұраға алуға және пайдалануға мүмкіндік береді, міндетті түрде ата-ана сыныбының барлық мүмкіндіктерін емес.
It provides a mechanism for multiple inheritance by allowing one class to use common functionality from multiple classes, but without the complex semantics of multiple inheritance. Code reusability: Mixins are useful when a programmer wants to share functionality between different classes. Instead of repeating the same code over and over again, the common functionality can simply be grouped into a mixin and then included into each class that requires it. Mixins allow inheritance and use of only the desired features from the parent class, not necessarily all of the features from the parent class.
Қолданылу
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-та кездесетін әртүрлі мұрагерлік механизмдерін миксин мұрагерлігінің ерекше түрлері ретінде қайта қарастырады.
In Simula, classes are defined in a block in which attributes, methods and class initialization are all defined together; thus all the methods that can be invoked on a class are defined together, and the definition of the class is complete. In Flavors, a mixin is a class from which another class can inherit slot definitions and methods. The mixin usually does not have direct instances. Since a Flavor can inherit from more than one other Flavor, it can inherit from one or more mixins. Note that the original Flavors did not use generic functions. In New Flavors (a successor of Flavors) and CLOS, methods are organized in "generic functions". These generic functions are functions that are defined in multiple cases (methods) by class dispatch and method combinations. CLOS and Flavors allow mixin methods to add behavior to existing methods: :before and :after daemons, whoppers and wrappers in Flavors. CLOS added :around methods and the ability to call shadowed methods via So, for example, a stream lock mixin can add locking around existing methods of a stream class. In Flavors one would write a wrapper or a whopper and in CLOS one would use an :around method. Both CLOS and Flavors allow the computed reuse via method combinations. :before, :after and :around methods are a feature of the standard method combination. Other method combinations are provided. An example is the + method combination, where the resulting values of each of the applicable methods of a generic function are arithmetically added to compute the return value. This is used, for example, with the border mixin for graphical objects. A graphical object may have a generic width function. The border mixin would add a border around an object and has a method computing its width. A new class bordered button (that is both a graphical object and uses the border mixin) would compute its width by calling all applicable width methods—via the + method combination. All return values are added and create the combined width of the object. In an OOPSLA 90 paper, Gilad Bracha and William Cook reinterpret different inheritance mechanisms found in Smalltalk, Beta and CLOS as special forms of a mixin inheritance.
Басқа тілдерде
Curl веб-контент тілінде бірнеше мұрагерлік, инстанциялары жоқ сыныптар әдістерді іске асыру үшін қолданылады. Көп қолданылатын миксиндерге SkinnableControlUI-ден мұрагерлік алған барлық скиндейтін ControlUI элементтері, төмен түсірілетін мәзірлерді қажет ететін пайдаланушы интерфейсі делегаттары және FontGraphicMixin, FontVisualMixin және NumericAxisMixin сияқты нақты аталған миксин кластары жатады. 7.0 нұсқасы кітапханаға қолжетімділікті қосты, соның арқасында миксиндердің бір пакетте болуы немесе жалпыға ортақ абстракт болуы міндетті емес. Curl конструкторлары – интерфейстерді немесе миксиндерді тікелей жарияламастан бірнеше мұрагерліктерді пайдалануға мүмкіндік беретін фабрикалар.
In the Curl web content language, multiple inheritance is used as classes with no instances may implement methods. Common mixins include all skinnable ControlUIs inheriting from SkinnableControlUI, user interface delegate objects that require dropdown menus inheriting from StandardBaseDropdownUI and such explicitly named mixin classes as FontGraphicMixin, FontVisualMixin and NumericAxisMixin of class. Version 7.0 added library access so that mixins do not need to be in the same package or be public abstract. Curl constructors are factories that facilitates using multiple inheritance without explicit declaration of either interfaces or mixins.
Интерфейстер мен қасиеттері
Java 8 интерфейстерде әдепкі әдістерді (default methods) жаңа мүмкіндік ретінде ұсынады. Негізінен, бұл интерфейске жаңа әдіс қосылатын жағдайда, интерфейс класын бағдарламалау аяқталғаннан кейін әдіс интерфейсте анықталуына мүмкіндік береді. Интерфейске жаңа функция қосу, интерфейсті пайдаланатын әрбір класта осы әдістің іске асырылуын талап етеді. Әдепкі әдістер осы жағдайда көмектеседі, оларды кез келген уақытта интерфейске қосуға болады және олармен байланысты кластар қолданатын іске асырылған құрылымға ие болады. Сондықтан әдепкі әдістер Java-да миксин тұжырымдамасын қолдану мүмкіндігін ұсынады. Интерфейстер аспектке бағытталған бағдарламалаумен біріктіріліп, C# немесе Java сияқты мұндай мүмкіндіктерді қолдайтын тілдерде толыққанды миксиндерді құруға болады. Сонымен қатар, маркерлік интерфейс үлгісін, жалпылама бағдарламалауды және кеңейту әдістерін пайдалану арқылы C# 3.0 миксиндерді имитациялай алады. Dart 2.7 және C# 3.0 кеңейту әдістерін енгізді, оларды классқа ғана емес, интерфейстерге де қолдануға болады. Кеңейту әдістері классқа оның құрылымын өзгертпей қосымша функционалдық мүмкіндіктерді қосады. Бұл жағдайда, кеңейту әдістерін анықтайтын нақты функционалдық үшін статикалық көмекші класс құруға болады. Кластар интерфейсті іске асыратындықтан (нақты интерфейсте ешқандай әдіс немесе қасиет болмаса да), олар барлық кеңейту әдістерін де қабылдайды. C# 8.0 әдепкі интерфейс әдістері мүмкіндігін қосады. ECMAScript (көбінесе JavaScript ретінде іске асырылады) бір объектіден екіншісіне өрістерді қадамдық түрде көшіру арқылы объектілерді құрастыруды имитациялау қажеттілігін жоққа шығарады. Ол қосымша мінез-құлықты іске асыратын функциялық объектілер арқылы Trait және миксин негізделген объектілерді құрастыруды табиғи түрде қолдайды, содан кейін осы функциялық объектілер шақыру немесе қолдану арқылы осындай жаңа функционалдылыққа мұқтаж объектілерге жіберіледі.
Java 8 introduces a new feature in the form of default methods for interfaces. Basically it allows a method to be defined in an interface with application in the scenario when a new method is to be added to an interface after the interface class programming setup is done. To add a new function to the interface means to implement the method at every class which uses the interface. Default methods help in this case where they can be introduced to an interface any time and have an implemented structure which is then used by the associated classes. Hence default methods add the ability to applying the mixin concept in Java. Interfaces combined with aspect oriented programming can also produce full fledged mixins in languages that support such features, such as C# or Java. Additionally, through the use of the marker interface pattern, generic programming, and extension methods, C# 3.0 has the ability to mimic mixins. With Dart 2.7 and C# 3.0 came the introduction of extension methods which can be applied, not only to classe, but also to interfaces. Extension Methods provide additional functionality on an existing class without modifying the class. It then becomes possible to create a static helper class for specific functionality that defines the extension methods. Because the classes implement the interface (even if the actual interface doesn’t contain any methods or properties to implement) it will pick up all the extension methods also. C# 8.0 adds the feature of default interface methods. ECMAScript (in most cases implemented as JavaScript) does not need to mimic object composition by stepwise copying fields from one object to another. It natively supports Trait and mixin based object composition via function objects that implement additional behavior and then are delegated via call or apply to objects that are in need of such new functionality.