В об'єктно-орієнтованих мовах програмування домішка (англ. mixin) — це клас, який містить методи для використання іншими класами без необхідності бути батьківським класом для них. Те, як ці інші класи отримують доступ до методів домішки залежить від мови. Іноді домішки описують як «включені», а не як «успадковані».
Домішки заохочують повторне використання коду, і їх можна використовувати для уникнення неоднозначності успадкування, яку може спричинити множинне успадкування (" проблема алмазу "), або для усунення відсутності підтримки множинного успадкування в мові. Домішку також можна розглядати як інтерфейс із реалізованими методами . Цей шаблон є прикладом застосування принципу інверсії залежностей .
Історія
Домішки вперше з'явилися в Symbolics об'єктно-орієнтованій Flavors системі (розробленій Говардом Кенноном), яка була підходом до об'єктної орієнтації, використаним у Lisp Machine Lisp . Назву було навіяно кафе-морозиво Steve's Ice Cream Parlor у Сомервіллі, штат Массачусетс: власник магазину морозива запропонував основний смак морозива (ваніль, шоколад тощо) і змішав комбінацію додаткових продуктів (горіхи, печиво, помадка тощо) і назвав продукт " mix-in ", його власний термін торгової марки на той час.
Визначення
Домішки — це концепція мови, яка дозволяє програмісту вставляти код у клас . Програмування домішок — це стиль розробки програмного забезпечення, у якому функціональні одиниці створюються в класі, а потім змішуються з іншими класами.
Клас-домішка діє як батьківський клас, що містить бажану функціональність. Потім підклас може успадкувати або просто повторно використовувати цю функціональність, але не як засіб спеціалізації. Як правило, домішка експортує бажану функціональність до дочірнього класу без створення «родинних зв'язків». Різниця між поняттями домішки і успадкування в тому, що дочірній клас все ще може успадковувати всі особливості батьківського класу, але семантику вказування «зв'язку» з батьківським елементом немає необхідності вказувати.
Переваги
- Він забезпечує механізм множинного успадкування, дозволяючи одному класу використовувати спільну функціональність кількох класів, але без складної семантики множинного успадкування.
- Багаторазове використання коду: домішки корисні, коли програміст хоче поділитися функціями між різними класами. Замість того, щоб повторювати один і той самий код спільну функціональність можна просто згрупувати в домішку, а потім включити в кожен клас, який цього вимагає.
- Домішка дозволяє успадковувати та використовувати лише бажані функції з батьківського класу, а не всі.
Реалізації
У Simula класи визначені в блоці, в якому атрибути, методи та ініціалізація класу визначені разом; Таким чином, усі методи, які можуть бути викликані в класі, визначені разом, і визначення класу завершено.
У Flavors домішка— це клас, від якого інший клас може успадковувати визначення та методи слотів. Домішка зазвичай не має прямих екземплярів. Оскільки Flavor може успадкувати від кількох інших Flavor, він може успадкувати від однієї або кількох домішок. Зауважте, що оригінальні Flavor не використовували загальні функції.
У New Flavors (спадкоємець Flavors) і CLOS методи організовані в " загальних функціях ". Ці загальні функції — це функції, які визначені в кількох випадках (методах) за допомогою класової диспетчеризації та комбінацій методів.
CLOS і Flavors дозволяють методам домішки додавати поведінку до існуючих методів: :before
і :after
daemons, whoppers і wrappers у Flavors. CLOS додав :around
методи і можливість викликати тіньові методи через CALL-NEXT-METHOD
. Так, наприклад, stream-lock-mixin може додати блокування навколо існуючих методів класу потоку. У Flavors можна було б написати wrapper або whopper, а в CLOS можна було б використовувати метод :around
. І CLOS, і Flavors дозволяють обчислюване повторне використання за допомогою комбінацій методів. :before
, :after
і :around
є ознакою стандартної комбінації методів. Надаються інші комбінації методів.
Прикладом є +
метод комбінації, де результуючі значення кожного з застосовних методів загальної функції додаються арифметично для обчислення поверненого значення. Це використовується, наприклад, з border-mixin для графічних об'єктів. Графічний об'єкт може мати загальну функцію ширини. Border-mixin додає рамку навколо об'єкта та має метод обчислення його ширини. Новий клас bordered-button
(який одночасно є графічним об'єктом і використовує домішку border
) обчислюватиме свою ширину, викликаючи всі застосовні методи ширини — за допомогою +
методу комбінації. Усі повернуті значення додаються та створюють комбіновану ширину об'єкта.
У статті OOPSLA 90 Гілад Брача та Вільям Кук переосмислюють різні механізми успадкування, знайдені в Smalltalk, Beta та CLOS, як спеціальні форми успадкування домішок.
Мови програмування, які використовують домішки
Крім Flavors і CLOS (частина Common Lisp), деякі мови, які використовують домішки:
- Ada (шляхом розширення існуючого тегованого запису довільними операціями в загальному)
- C# (починаючи з C# 8.0, за допомогою стандартних методів інтерфейсів)
- Cobra
- ColdFusion (на основі класу з використанням включень і на основі об'єкта шляхом призначення методів від одного об'єкта до іншого під час виконання)
- Curl (з Curl RTE)
- D (називається «шаблонними домішками» ; D також містить оператор «mixin», який компілює рядки як код.)
- Дартс
- Factor
- Groovy
- Java (починаючи з Java 8, за допомогою стандартних методів інтерфейсів)
- Делегування JavaScript — функції як ролі (трейти та домішки)
- Котлін
- Less
- OCaml
- Perl (через ролі в розширенні Moose об'єктної системи Perl 5)
- " Характеристики " PHP
- Magik
- MATLAB
- Python
- Racket (документація домішок)
- Raku
- Rust
- Ruby
- Scala
- XOTcl / TclOO (об'єктні системи, вбудовані в Tcl)
- Sass (мова таблиці стилів)
- SmallTalk
- Vala
- Swift
- SystemVerilog
- TypeScript (документація домішок)
Деякі мови не підтримують домішки на рівні мови, але можуть легко імітувати їх, копіюючи методи з одного об'єкта в інший під час виконання, таким чином «позичаючи» методи домішок. Це також можливо зі статично типізованими мовами, але це вимагає створення нового об'єкта з розширеним набором методів.
Інші мови, які не підтримують домішки, можуть підтримувати їх обхідним шляхом через інші мовні конструкції. Наприклад, Visual Basic. NET і C# підтримують додавання методів розширення до інтерфейсів, тобто будь-який клас, що реалізує інтерфейс із визначеними методами розширення, матиме методи розширення, доступні як псевдо-члени.
// Allows for types to "speak" trait Speak { fn speak(); // Rust allows implementors to define default implementations for functions defined in traits fn greet() { println!("Hi!") } } struct Dog; impl Speak for Dog { fn speak() { println!("Woof woof"); } } struct Robot; impl Speak for Robot { fn speak() { println!("Beep beep boop boop"); } // Here we override the definition of Speak::greet for Robot fn greet() { println!("Robot says howdy!") } }
Примітки
- Using Mix-ins with Python
- Implementing Mix-ins with C# Extension Methods
- I know the answer (it's 42): Mix-ins and C#
- Boyland, John; Giuseppe Castagna (26 червня 1996). Type-Safe Compilation of Covariant Specialization: A Practical Case. У Pierre Cointe (ред.). ECOOP '96, Object-oriented Programming: 10th European Conference. Springer. с. 16—17. ISBN .
{{}}
:|access-date=
вимагає|url=
() - http://c2.com/cgi/wiki?MixIn []
- Working with Mixins in Ruby. 8 липня 2015.
- Re-use in OO: Inheritance, Composition and Mixins.
- . Архів оригіналу за 25 вересня 2015. Процитовано 16 вересня 2015.
- OOPSLA '90, Mixin based inheritance (pdf)
- Bill Wagner. Create mixin types using default interface methods. docs.microsoft.com (en-us) . Процитовано 18 квітня 2022.
- slava (25 січня 2010). Factor/Features/The language. concatenative.org. Процитовано 15 травня 2012.
Factor's main language features: … Object system with Inheritance, Generic functions, Predicate dispatch and Mixins
- Alain Frisch (14 червня 2013). Mixin objects. LexiFi. Процитовано 29 березня 2022.
- . Архів оригіналу за 18 червня 2021. Процитовано 7 березня 2023.
- Mixin Class Composition. . Процитовано 16 травня 2014.
- Mixin classes in XOTcl
Див. також
- Абстрактний тип
- Шаблон декоратора
- , схожа структура, яка не потребує лінійної композиції
Посилання
- MixIn у Portland Pattern Repository
- в ActionScript
- The Common Lisp Object System: An Overview Річарда П. Габріеля та Лінди ДеМічіл є гарним вступом до мотивації визначення класів за допомогою загальних функцій.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
V ob yektno oriyentovanih movah programuvannya domishka angl mixin ce klas yakij mistit metodi dlya vikoristannya inshimi klasami bez neobhidnosti buti batkivskim klasom dlya nih Te yak ci inshi klasi otrimuyut dostup do metodiv domishki zalezhit vid movi Inodi domishki opisuyut yak vklyucheni a ne yak uspadkovani Domishki zaohochuyut povtorne vikoristannya kodu i yih mozhna vikoristovuvati dlya uniknennya neodnoznachnosti uspadkuvannya yaku mozhe sprichiniti mnozhinne uspadkuvannya problema almazu abo dlya usunennya vidsutnosti pidtrimki mnozhinnogo uspadkuvannya v movi Domishku takozh mozhna rozglyadati yak interfejs iz realizovanimi metodami Cej shablon ye prikladom zastosuvannya principu inversiyi zalezhnostej IstoriyaDomishki vpershe z yavilisya v Symbolics ob yektno oriyentovanij Flavors sistemi rozroblenij Govardom Kennonom yaka bula pidhodom do ob yektnoyi oriyentaciyi vikoristanim u Lisp Machine Lisp Nazvu bulo naviyano kafe morozivo Steve s Ice Cream Parlor u Somervilli shtat Massachusets vlasnik magazinu moroziva zaproponuvav osnovnij smak moroziva vanil shokolad tosho i zmishav kombinaciyu dodatkovih produktiv gorihi pechivo pomadka tosho i nazvav produkt mix in jogo vlasnij termin torgovoyi marki na toj chas ViznachennyaDomishki ce koncepciya movi yaka dozvolyaye programistu vstavlyati kod u klas Programuvannya domishok ce stil rozrobki programnogo zabezpechennya u yakomu funkcionalni odinici stvoryuyutsya v klasi a potim zmishuyutsya z inshimi klasami Klas domishka diye yak batkivskij klas sho mistit bazhanu funkcionalnist Potim pidklas mozhe uspadkuvati abo prosto povtorno vikoristovuvati cyu funkcionalnist ale ne yak zasib specializaciyi Yak pravilo domishka eksportuye bazhanu funkcionalnist do dochirnogo klasu bez stvorennya rodinnih zv yazkiv Riznicya mizh ponyattyami domishki i uspadkuvannya v tomu sho dochirnij klas vse she mozhe uspadkovuvati vsi osoblivosti batkivskogo klasu ale semantiku vkazuvannya zv yazku z batkivskim elementom nemaye neobhidnosti vkazuvati PerevagiVin zabezpechuye mehanizm mnozhinnogo uspadkuvannya dozvolyayuchi odnomu klasu vikoristovuvati spilnu funkcionalnist kilkoh klasiv ale bez skladnoyi semantiki mnozhinnogo uspadkuvannya Bagatorazove vikoristannya kodu domishki korisni koli programist hoche podilitisya funkciyami mizh riznimi klasami Zamist togo shob povtoryuvati odin i toj samij kod spilnu funkcionalnist mozhna prosto zgrupuvati v domishku a potim vklyuchiti v kozhen klas yakij cogo vimagaye Domishka dozvolyaye uspadkovuvati ta vikoristovuvati lishe bazhani funkciyi z batkivskogo klasu a ne vsi RealizaciyiU Simula klasi viznacheni v bloci v yakomu atributi metodi ta inicializaciya klasu viznacheni razom Takim chinom usi metodi yaki mozhut buti viklikani v klasi viznacheni razom i viznachennya klasu zaversheno U Flavors domishka ce klas vid yakogo inshij klas mozhe uspadkovuvati viznachennya ta metodi slotiv Domishka zazvichaj ne maye pryamih ekzemplyariv Oskilki Flavor mozhe uspadkuvati vid kilkoh inshih Flavor vin mozhe uspadkuvati vid odniyeyi abo kilkoh domishok Zauvazhte sho originalni Flavor ne vikoristovuvali zagalni funkciyi U New Flavors spadkoyemec Flavors i CLOS metodi organizovani v zagalnih funkciyah Ci zagalni funkciyi ce funkciyi yaki viznacheni v kilkoh vipadkah metodah za dopomogoyu klasovoyi dispetcherizaciyi ta kombinacij metodiv CLOS i Flavors dozvolyayut metodam domishki dodavati povedinku do isnuyuchih metodiv before i after daemons whoppers i wrappers u Flavors CLOS dodav around metodi i mozhlivist viklikati tinovi metodi cherez CALL NEXT METHOD Tak napriklad stream lock mixin mozhe dodati blokuvannya navkolo isnuyuchih metodiv klasu potoku U Flavors mozhna bulo b napisati wrapper abo whopper a v CLOS mozhna bulo b vikoristovuvati metod around I CLOS i Flavors dozvolyayut obchislyuvane povtorne vikoristannya za dopomogoyu kombinacij metodiv before after i around ye oznakoyu standartnoyi kombinaciyi metodiv Nadayutsya inshi kombinaciyi metodiv Prikladom ye metod kombinaciyi de rezultuyuchi znachennya kozhnogo z zastosovnih metodiv zagalnoyi funkciyi dodayutsya arifmetichno dlya obchislennya povernenogo znachennya Ce vikoristovuyetsya napriklad z border mixin dlya grafichnih ob yektiv Grafichnij ob yekt mozhe mati zagalnu funkciyu shirini Border mixin dodaye ramku navkolo ob yekta ta maye metod obchislennya jogo shirini Novij klas bordered button yakij odnochasno ye grafichnim ob yektom i vikoristovuye domishku border obchislyuvatime svoyu shirinu viklikayuchi vsi zastosovni metodi shirini za dopomogoyu metodu kombinaciyi Usi povernuti znachennya dodayutsya ta stvoryuyut kombinovanu shirinu ob yekta U statti OOPSLA 90 Gilad Bracha ta Vilyam Kuk pereosmislyuyut rizni mehanizmi uspadkuvannya znajdeni v Smalltalk Beta ta CLOS yak specialni formi uspadkuvannya domishok Movi programuvannya yaki vikoristovuyut domishkiKrim Flavors i CLOS chastina Common Lisp deyaki movi yaki vikoristovuyut domishki Ada shlyahom rozshirennya isnuyuchogo tegovanogo zapisu dovilnimi operaciyami v zagalnomu C pochinayuchi z C 8 0 za dopomogoyu standartnih metodiv interfejsiv Cobra ColdFusion na osnovi klasu z vikoristannyam vklyuchen i na osnovi ob yekta shlyahom priznachennya metodiv vid odnogo ob yekta do inshogo pid chas vikonannya Curl z Curl RTE D nazivayetsya shablonnimi domishkami D takozh mistit operator mixin yakij kompilyuye ryadki yak kod Darts Factor Groovy Java pochinayuchi z Java 8 za dopomogoyu standartnih metodiv interfejsiv Deleguvannya JavaScript funkciyi yak roli trejti ta domishki Kotlin Less OCaml Perl cherez roli v rozshirenni Moose ob yektnoyi sistemi Perl 5 Harakteristiki PHP Magik MATLAB Python Racket dokumentaciya domishok Raku Rust Ruby Scala XOTcl TclOO ob yektni sistemi vbudovani v Tcl Sass mova tablici stiliv SmallTalk Vala Swift SystemVerilog TypeScript dokumentaciya domishok Deyaki movi ne pidtrimuyut domishki na rivni movi ale mozhut legko imituvati yih kopiyuyuchi metodi z odnogo ob yekta v inshij pid chas vikonannya takim chinom pozichayuchi metodi domishok Ce takozh mozhlivo zi statichno tipizovanimi movami ale ce vimagaye stvorennya novogo ob yekta z rozshirenim naborom metodiv Inshi movi yaki ne pidtrimuyut domishki mozhut pidtrimuvati yih obhidnim shlyahom cherez inshi movni konstrukciyi Napriklad Visual Basic NET i C pidtrimuyut dodavannya metodiv rozshirennya do interfejsiv tobto bud yakij klas sho realizuye interfejs iz viznachenimi metodami rozshirennya matime metodi rozshirennya dostupni yak psevdo chleni Allows for types to speak trait Speak fn speak Rust allows implementors to define default implementations for functions defined in traits fn greet println Hi struct Dog impl Speak for Dog fn speak println Woof woof struct Robot impl Speak for Robot fn speak println Beep beep boop boop Here we override the definition of Speak greet for Robot fn greet println Robot says howdy PrimitkiUsing Mix ins with Python Implementing Mix ins with C Extension Methods I know the answer it s 42 Mix ins and C Boyland John Giuseppe Castagna 26 chervnya 1996 Type Safe Compilation of Covariant Specialization A Practical Case U Pierre Cointe red ECOOP 96 Object oriented Programming 10th European Conference Springer s 16 17 ISBN 9783540614395 a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite book title Shablon Cite book cite book a access date vimagaye url dovidka http c2 com cgi wiki MixIn gole posilannya Working with Mixins in Ruby 8 lipnya 2015 Re use in OO Inheritance Composition and Mixins Arhiv originalu za 25 veresnya 2015 Procitovano 16 veresnya 2015 OOPSLA 90 Mixin based inheritance pdf Bill Wagner Create mixin types using default interface methods docs microsoft com en us Procitovano 18 kvitnya 2022 slava 25 sichnya 2010 Factor Features The language concatenative org Procitovano 15 travnya 2012 Factor s main language features Object system with Inheritance Generic functions Predicate dispatch and Mixins Alain Frisch 14 chervnya 2013 Mixin objects LexiFi Procitovano 29 bereznya 2022 Arhiv originalu za 18 chervnya 2021 Procitovano 7 bereznya 2023 Mixin Class Composition Procitovano 16 travnya 2014 Mixin classes in XOTclDiv takozhAbstraktnij tip Shablon dekoratora Osnovni pravila dizajnu shozha struktura yaka ne potrebuye linijnoyi kompoziciyiPosilannyaMixIn u Portland Pattern Repository v ActionScript The Common Lisp Object System An Overview Richarda P Gabrielya ta Lindi DeMichil ye garnim vstupom do motivaciyi viznachennya klasiv za dopomogoyu zagalnih funkcij