Dies ist eine offene Frage, aber ich möchte einige Meinungen von der SO-Community zu Traits einholen; Denkst du Traits in Squeak/Pharo sind eine gute Sache, oder solltest du dich von ihnen fernhalten und stattdessen Komposition und Delegation verwenden? Ich frage, weil, obwohl ich weiß, wie man sie benutzt (dank dem Pharo-Buch), ich nicht wirklich sicher bin, wie akzeptabel es ist, sie zu benutzen oder wo es in Ordnung ist, sie zu benutzen und wo nicht.Sind Eigenschaften gut oder schlecht?
Antwort
Ich mag Eigenschaften nicht, weil sie starke Abhängigkeiten in Code einführen. Diese Abhängigkeiten können offensichtlich sein (eine Klasse, die ein Merkmal importiert, ein Merkmal, das Methoden erwartet), aber auch sehr subtil (ein Merkmal, das Supermethoden/Instanzvariablen überschattet). Außerdem gibt es keine adäquate Werkzeugunterstützung für Merkmale.
Nach meiner Erfahrung Delegation gibt eine viel bessere und wiederverwendbare Design in einer dynamisch typisierten objektorientierten Sprache wie Smalltalk.
Die Dinge haben ihre Vor- und Nachteile. Lukas erwähnt zu Recht viele der Nachteile:
- Starke Abhängigkeiten in Code einführen.
- keine angemessene Werkzeugunterstützung.
Während der zweite vielleicht eines Tages weggehen wird, wird der erste nicht.
Der Zweck von Traits besteht darin, Codeduplikation zu verhindern, die auftritt, wenn zwei Klassen, die keine andere Superklasse als Object verwenden, eine Instanzmethode gemeinsam nutzen. Manchmal kann die Delegation das beheben, aber oft nicht. Also, der Vorteil der Merkmale ist:
- Reduzierte Code-Duplizierung.
Mein Urteil hier ist, dass die Nachteile überwiegen. Ich denke, dass Code-Duplikation heute und für immer stattfinden wird. Und wenn Delegierung nicht möglich ist, kann ich mir sogar vorstellen, dass Code-Duplikation nicht so schädlich ist, da es oft der divergenten Entwicklung der kopierten Code-Snippets vorausgeht.
- 1. Optionale Parameter, gut oder schlecht?
- 2. Globale Datenrahmen - gut oder schlecht
- 3. PHP Typecasting - Gut oder schlecht?
- 4. Anonyme Instantiierungssyntax - gut oder schlecht?
- 5. Sind "by ref" Argumente in WCF schlecht oder gut?
- 6. Referenzparameter (& $ a) in Funktionen, gut oder schlecht?
- 7. Netzwerkverbindung im Konstruktor eingerichtet: gut oder schlecht?
- 8. php Rückgabe gemischter Datentypen - gut oder schlecht
- 9. Post-Build-Commits: gut oder schlecht?
- 10. ASP MVC HTML-Helfer - gut oder schlecht?
- 11. Mehrere Passwörter Login: gut oder schlecht
- 12. Regulärer Ausdruck Benannte Gruppen: Gut oder schlecht?
- 13. Deaktivieren des IE8-Kompatibilitätsmodus, gut oder schlecht?
- 14. Memcache Komprimierung - gut/schlecht?
- 15. Kreisförmige Datenbankbeziehungen. Gut, Schlecht, Ausnahmen?
- 16. Schreibe "gut" oder "schlecht" wenn Werte im Bereich sind wahr oder falsch
- 17. Silverlight ReaderWriterLock Implementierung Gut/Schlecht?
- 18. De-Normalisierung von Live-Daten für Berichte - Gut oder Schlecht?
- 19. WCF Self-Hosting auf dem Client? Gut oder schlecht
- 20. Entity Framework: Singletonish ObjectContext - gut, schlecht oder überdenken?
- 21. Mehrere Formulare mit Eingabefeldern mit demselben Namensattribut? Gut oder schlecht?
- 22. Ist der Wrapper innerhalb des Konstruktors gut oder schlecht?
- 23. PHP - Funktion in einer Funktion. Gut oder schlecht?
- 24. PHP - Konvertieren aller Fehler in Ausnahmen - gut oder schlecht?
- 25. Verwenden Sie Systemnamespaces für Klassenbibliotheken: gut oder schlecht
- 26. Unsafe C# und Zeiger für 2D-Rendering, gut oder schlecht?
- 27. Statische Methoden innerhalb der Klasseninstanz - gut, schlecht oder abhängig?
- 28. Mehrere DbContext-Klassen für eine einzelne Webanwendung. Gut oder schlecht?
- 29. Option Rückübersetzung macht Abfrage schnell - gut oder schlecht?
- 30. Google Drive Speichern von Bildern - schlecht oder gut Weg