In der Java-Welt (genauer gesagt, wenn Sie keine Mehrfachvererbung / Mixins haben) ist die Faustregel ganz einfach: "Bevorzugen Sie die Objektzusammensetzung gegenüber der Klassenvererbung".
Ich würde gerne wissen, ob / wie es geändert wird, wenn Sie auch Mixins berücksichtigen, insbesondere in Scala?
Werden Mixins als ein Weg der Mehrfachvererbung oder als mehr Klassenzusammensetzung angesehen?
Gibt es auch eine Richtlinie "Objektkomposition gegenüber Klassenkomposition bevorzugen" (oder umgekehrt)?
Ich habe einige Beispiele gesehen, bei denen Leute Mixins verwenden (oder missbrauchen), wenn die Objektzusammensetzung auch die Arbeit erledigen könnte, und ich bin mir nicht immer sicher, welches besser ist. Es scheint mir, dass Sie mit ihnen ziemlich ähnliche Dinge erreichen können, aber es gibt auch einige Unterschiede, einige Beispiele:
- Sichtbarkeit - mit Mixins wird alles Teil der öffentlichen API, was bei Kompositionen nicht der Fall ist.
- Ausführlichkeit - In den meisten Fällen sind Mixins weniger ausführlich und etwas einfacher zu verwenden, aber dies ist nicht immer der Fall (z. B. wenn Sie auch Selbsttypen in komplexen Hierarchien verwenden).
Ich weiß, die kurze Antwort lautet "Es kommt darauf an", aber wahrscheinlich gibt es eine typische Situation, in der dies oder das besser ist.
Einige Beispiele für Richtlinien, die ich bisher entwickeln konnte (vorausgesetzt, ich habe zwei Merkmale A und B und A möchte einige Methoden aus B verwenden):
- Wenn Sie die API von A mit den Methoden von B erweitern möchten, mischen Sie, ansonsten Zusammensetzung. Es hilft jedoch nicht, wenn die von mir erstellte Klasse / Instanz nicht Teil einer öffentlichen API ist.
- Wenn Sie einige Muster verwenden möchten, für die Mixins erforderlich sind (z. B. Stackable Trait Pattern ), ist dies eine einfache Entscheidung.
- Wenn Sie zirkuläre Abhängigkeiten haben, können Mixins mit Selbsttypen hilfreich sein. (Ich versuche diese Situation zu vermeiden, aber es ist nicht immer einfach)
- Wenn Sie dynamische Laufzeitentscheidungen zur Komposition und dann zur Objektkomposition wünschen.
In vielen Fällen scheinen Mixins einfacher (und / oder weniger ausführlich) zu sein, aber ich bin mir ziemlich sicher, dass sie auch einige Fallstricke haben, wie die "Gottklasse" und andere, die in zwei Artima-Artikeln beschrieben werden: Teil 1 , Teil 2 (übrigens) scheint mir, dass die meisten anderen Probleme für scala nicht relevant / nicht so ernst sind).
Haben Sie weitere Hinweise wie diese?
quelle
this => Logging
? Es wird nicht kompiliert.Andere Unterschiede, die Sie nicht erwähnt haben:
( Programmierskala )
[Martin2003]: Robert C. Martin, Agile Softwareentwicklung: Prinzipien, Muster und Praktiken, Prentice-Hall, 2003
trait
) haben keine Konstruktorparameter.Daher der Rat, immer noch von Programming Scala :
Der letzte Teil in Bezug auf den Anfangszustand eines Objektes, hat dazu beigetragen , oft entscheidet zwischen Klasse (und Klassenzusammensetzung) und Zuge (und Mixins) für ein bestimmtes Konzept.
quelle
trait
) haben keine Konstruktorparameter. " Interessanterweise unterstützt Dotty (um Scala 3 zu werden) Merkmalsparameter . Infolgedessen kann sich die von Ihnen erwähnte Faustregel von Programming Scala weiterentwickeln.