2010-07-12 23 views
9

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

6

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.

1

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.

I think, the best thing to do, as of today, is to keep automated track of code duplication, and always monitor when one end changes while the other doesn't. I'm currently writing a tool that'll keep track of such links, even across repositories. I'll report on it in my blog when it's ready.

Verwandte Themen