Jaka jest różnica między miksami a cechami?
Według Wikipedii moduły Ruby to coś w rodzaju cech. Jak to?
Jaka jest różnica między miksami a cechami?
Według Wikipedii moduły Ruby to coś w rodzaju cech. Jak to?
Odpowiedzi:
ad 1. W mikserach można zdefiniować zmienne instancji. Cechy na to nie pozwalają. Stan należy podać, komponując klasę (= klasa wykorzystująca cechy)
ad 2.
Może wystąpić konflikt nazw. Dwie mieszanki ( MA
i MB
) lub cechy ( TA
i TB
) definiują metodę z tą samą definicją 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 mieszankach konflikty w klasie komponującej C mixins MA, MB
są rozwiązywane niejawnie.
Class C mixins MA, MB {
bar():void {
foo();
}
}
To zadzwoni foo():void
odMA
Z drugiej strony, podczas korzystania z Cech, komponowanie klasy musi rozwiązywać konflikty.
Class C mixins TA, TB {
bar():void {
foo();
}
}
Ten kod wywoła konflikt (dwie definicje foo():void
).
ad 3. Semantyka metody nie zależy od tego, czy jest ona zdefiniowana w ramach cechy, czy w klasie, która korzysta z tej cechy.
Innymi słowy, nie ma znaczenia, czy klasa składa się z Cech, czy kod Cech jest „kopiowany - wklejany” do klasy.
Te strony wyjaśniają różnicę w języku programowania D.
Mixiny w tym kontekście to kod generowany w locie, a następnie wstawiany w tym miejscu w kodzie podczas kompilacji. Całkiem przydatne dla prostych DSL.
Cechy to zewnętrzne wartości czasu kompilacji (a nie kod wygenerowany z zewnętrznego źródła). Różnica jest subtelna. Miksery dodają logikę, cechy dodają dane, takie jak informacje o typie kompilacji.
Nie wiem zbyt wiele o Rubim, ale mam nadzieję, że to trochę pomoże.