So Squeak/Pharo Unterstützung Traits und Neusprech hat Mixins. Was ist der Unterschied? Traits haben keine InstVars, aber Mixins haben?Was ist der Unterschied zwischen einem Squeak/Pharo-Merkmal und einem Neusprech-Mixin?
Antwort
Für einen guten Vergleich und für die Begründung, warum Merkmale bevorzugt werden, können Sie die traits paper (pdf) überprüfen.
Im Wesentlichen ist es, was Lukas Renggli sagte:
Traits Mitglieder in einer Klasse zusammengesetzt sind, und nicht seine Vererbungshierarchie ändern. Konflikte müssen vom Nutzer der Merkmale explizit gelöst werden.
Mixins werden in die Vererbungshierarchie der Zielklasse linearisiert. Wenn es widersprüchliche Mitglieder gibt, bestimmt die Reihenfolge, in der sie deklariert wurden, welches Mitglied angerufen wird. Dies ist zerbrechlich, weil es implizit das Verhalten der Komposition definiert, und der Klassenautor muss sich der potenziellen Konflikte bewusst sein und wie sie sich auf die resultierende Klasse auswirken.
Da Mixins linearisiert werden, leiden sie nicht unter dem berüchtigten "Diamantproblem" der Mehrfachvererbung.Die fragile Natur, in der sie gestapelt sind, ist ein weiteres Problem, das ich mit dem "Rubin-Problem" bezeichne, um mit der Metapher des kostbaren Steins zu bleiben. Aus einigen seltsamen Gründen, die mit moose zu tun haben, zeigen Perlen nicht das Problem sowie Rubine.
Eigenschaften werden mit einer Kompositionsregel zusammengesetzt. Konflikte müssen manuell aufgelöst werden, es kann nicht vorkommen, dass eine Eigenschaft versehentlich eine andere Methode mit demselben Namen überschreibt.
Mixins werden in der Reihenfolge zusammengesetzt und haben daher ähnliche Fragilitätsprobleme wie die Mehrfachvererbung.
In Neusprech sind alle Klassen Mixins. Hier sind einige Auszüge aus Gilad Bracha Antwort auf eine ähnliche Frage in Newspeak discussion forum:
Mixins sind kein Merkmal von Neusprech per se. Das heißt, wir haben die Sprache nicht mit dem Spruch entworfen, ok, jetzt fügen wir Mixins hinzu. Mixins fallen automatisch aus Klassenverschachtelung und Nachrichtenbasiert Semantik. Das heißt, wenn Sie virtuelle Klassen haben, haben Sie Mixins , es sei denn Sie tatsächlich verbieten. ...
Traits versuchen, wahrgenommene Problem von Mixins zu adressieren.
- Es gibt sehr wenig echte Erfahrung, die anzeigt, dass diese wahrgenommenen Probleme real sind.
- Merkmale sind auf Zustandslosigkeit beschränkt. Dies vereinfacht die Angelegenheit, aber nicht alle Fälle von Interesse. In der Tat gibt es jetzt Forschungspapiere, die versuchen, Eigenschaften zu Eigenschaften hinzuzufügen.
Traits werden vollständig von einem allgemeines Modell subsumiert, die ich in meiner Doktorarbeit vor vielen Jahren entwickelt (erhältlich off meiner Web-Site, wenn Sie tief wollen graben wirklich). ... Ich würde gerne prüfen, wie wir diese Kombinatoren in Newspeak integrieren könnten. ...
- 1. Was ist der Unterschied zwischen einem Index und einem Fremdschlüssel?
- 2. Was ist der Unterschied zwischen einem RoutedCommand und einem RoutedUICommand?
- 3. Was ist der Unterschied zwischen einem Muster und einem Pfad?
- 4. Was ist der Unterschied zwischen einem Primärschlüssel und einem Ersatzschlüssel?
- 5. Was ist der Unterschied zwischen einem Integrator und einem Tiefpassfilter?
- 6. Was ist der Unterschied zwischen einem Controller und einem Service?
- 7. Was ist der Unterschied zwischen einem Anwendungscontroller und einem Anwendungskontext?
- 8. Was ist der Unterschied zwischen einem Streamwriter und einem Binarywriter?
- 9. Was ist der Unterschied zwischen einem Key und einem KeySpec?
- 10. Was ist der Unterschied zwischen einem Domänenklassendiagramm und einem Designklassendiagramm?
- 11. Was ist der Unterschied zwischen einem Tupel und einem compressed_pair?
- 12. Was ist der Unterschied zwischen einem Klassendiagramm und einem Objektdiagramm?
- 13. Was ist der Unterschied zwischen einem Iterator und einem Generator?
- 14. Was ist der Unterschied zwischen einem Array und einem Objekt?
- 15. Was ist der Unterschied zwischen einem Tabellenindex und einem Ansichtsindex?
- 16. Was ist der Unterschied zwischen einem Algorithmus und einem Entwurfsmuster
- 17. Was ist der Unterschied zwischen einem Nanokern und einem Exokernel?
- 18. Was ist der Unterschied zwischen einem Helfer und einem Teil?
- 19. Was ist der Unterschied zwischen einem Workflow und einem Flowchart?
- 20. Was ist der Unterschied zwischen einem Instanzinitialisierer und einem Konstruktor?
- 21. Was ist der Unterschied zwischen einem ViewModel und einem Controller?
- 22. Was ist der Unterschied zwischen einem Bündel und einer Absicht?
- 23. Was ist der Unterschied zwischen Ember.computed.alias und einem Ember.binding?
- 24. Was ist der Unterschied zwischen einem Mixin und dem Dekorationsmuster?
- 25. Was ist der Unterschied zwischen einem QWindow und QWidget
- 26. Was ist der Unterschied zwischen einem URI und einer URL?
- 27. Was ist der Unterschied zwischen einem Algorithmus und einer Funktion?
- 28. Was ist der Unterschied zwischen einem Fehler und einer Ausnahme?
- 29. Was ist der Unterschied zwischen einem Benutzer und einer Rolle?
- 30. Was ist der Unterschied zwischen einer Schließung und einem Modul?
Die Fragilität, die normalerweise mit Mehrfachvererbung verbunden ist, ist "das Diamantproblem" - keine deterministische Auflösung der Methode mit demselben Namen und derselben Signatur, die von mehreren Klassen geerbt wird. Im Falle von Mixins, wie Sie bereits angemerkt haben, bestimmt die Reihenfolge der Zusammensetzung, wie Methoden gelöst werden, so dass Mixins nicht unter dem "Diamantproblem" leiden. – Yardena
Ja tun sie, aber es ist in einer voreingenommenen Weise. Wenn Sie zwei Methoden 'm()' und 'n()' aus 'Mixin1' und' Mixin2' erhalten, dann können Sie nur beide Methoden von einem Mix-In haben. Wenn Sie eine Methode von 'Mixin1' und die andere von' Mixin2' wollen, stecken Sie fest. –
Was Sie beschreiben, ist nicht, was als "das Diamantproblem" bekannt ist. Ich bin mir nicht sicher, ob es überhaupt ein Problem ist - Mixin sollte eine minimale Einheit wiederverwendbaren Verhaltens darstellen, so dass es natürlich nicht weiter zerlegt werden kann ... – Yardena