Jaka jest różnica między Mixinami a Cechami?Mixiny kontra cechy
According to Wikipedia, Moduły Ruby są podobne do cech. Jak to?
Jaka jest różnica między Mixinami a Cechami?Mixiny kontra cechy
According to Wikipedia, Moduły Ruby są podobne do cech. Jak to?
ad 1. W wstawek można zdefiniować zmienne instancji. Cechy nie pozwalają na to. Stan musi być zapewniony przez komponowanie klasy (= klasa używająca cech)
ad 2. Może być konflikt nazwy. Dwie mieszanki (MA
i MB
) lub cechy (TA
i TB
) definiują metodę o tej samej definicji foo():void
.
Mixin MA {
foo():void {
print 'hello'
}
}
Mixin MB {
foo():void {
print 'bye'
}
}
Trait TA {
foo():void {
print 'hello'
}
}
Trait TB {
foo():void {
print 'bye'
}
}
W wstawek konflikty w komponowaniu klasę C mixins MA, MB
są rozwiązane w sposób dorozumiany.
Class C mixins MA, MB {
bar():void {
foo();
}
}
ten wezwie foo():void
z MA
Z drugiej strony podczas korzystania Cechy, komponując klasa ma rozwiązywać konflikty.
Class C mixins TA, TB {
bar():void {
foo();
}
}
Ten kod spowoduje zgłoszenie konfliktu (dwie definicje: foo():void
).
ad 3. Semantyka metody nie zależy od tego, czy jest zdefiniowana w cechie, czy w klasie, która używa tej cechy.
Innymi słowy, nie ma znaczenia, że klasa składa się z Cech lub kod Cechy jest "skopiowany - wklejony" do klasy.
Te strony wyjaśniają różnicę w języku programowania D.
Wstawki w tym kontekście to kod generowany w locie, a następnie umieszczony w tym punkcie w kodzie podczas kompilacji. Dość przydatny w przypadku prostych DSL.
Cechy to czasy zewnętrzne kompilacji (zamiast kodu wygenerowanego ze źródła zewnętrznego). Różnica jest subtelna. Mixiny dodają logikę, cechy dodają dane, takie jak informacje o typie kompilacji.
Nie wiem zbyt wiele o Ruby, ale mam nadzieję, że to trochę pomaga.
Mixiny i cechy w D są całkowicie różne od tych, które oznaczają ogólnie w informatyce. W D oba są prymitywami preprocesora do automatycznego generowania kodu. W innych językach są to mechanizmy dziedziczenia. Decyzja nazewnictwa w D jest niefortunna. – tylerl
+1 Bardzo podobała mi się twoja odpowiedź. To było zwięzłe i bardzo wyraźnie opisało różnicę między nimi. Dziękuję Ci! – Tower
Gdyby istniała lista wzorcowych odpowiedzi, to na pewno byłoby na nim. Dziękuję, jk_. – Reece
Wiem, że minął rok, ale dla przyszłych czytelników, w rubinach użyłbym metody z ostatniego modułu, który został wymieszany, więc nazwałoby to foo() formą MB –