Ich arbeite derzeit an einer Codebasis mit vielen Klassen, die eine Start-Methode implementieren. Dies scheint mir eine zweiphasige Konstruktion zu sein, die ich immer für eine schlechte Praxis gehalten hatte. Ich kann den Unterschied zwischen diesem und einem Konstruktor nicht erkennen.
Wann ist es angebracht, eine Startmethode anstelle der normalen Objektkonstruktion zu verwenden?
Wann sollte ich lieber den Konstruktor verwenden?
Bearbeiten: Ich denke nicht, dass es so relevant ist, aber die Programmiersprache ist C #, es könnte gleichermaßen für Java oder C ++ gelten
object-oriented-design
construction
constructors
Dave Hillier
quelle
quelle
start
und dem Konstruktor? etc ...init
Methode außerhalb dernew
Funktion zu haben - perldoc.perl.org/perlobj.html . Die Redewendungen einer Sprache mögen dort gut funktionieren und nicht in anderen Sprachen.Start
Methoden in allgemeinen APIs sind Threads und Stoppuhren.Antworten:
Ein
Start()
Verfahren (wieRun()
,Execute()
oder etwas Ähnliches) ist geeignet , wenn die Kosten für die Aufgabe des Konstruierens niedrig ist, aber die Kosten der Verwendung ist es hoch. Zum Beispiel: Eine Klasse, die einen Best-Path-Optimization-Algorithmus kapselt. Es ist trivial, ihn mit einer Reihe von Parametern einzurichten (X
Quadrate fürY
Quadrate, mit einer solchen Bewertungsmethode), aber es kann eine Weile dauern, bis er ausgeführt wird. Wenn Sie 20 dieser Objekte erstellen möchten, möchten Sie möglicherweise die Ausführung verzögern, bis alle Objekte erstellt wurden. Auf diese Weise können Sie sie beispielsweise einfacher parallelisieren.Alternativ kann es nützlich sein, wenn Sie nicht wissen, wann das Objekt gestartet werden muss - möglicherweise, weil es auf Benutzereingaben oder einer Logik basiert, die aus einer Liste von Möglichkeiten auswählt.
Dies setzt natürlich voraus, dass dies
Start()
die nützliche Methode für das Objekt ist und nicht eine Entsprechung zu einerInitialize()
Methode. Wenn es nur eine zusätzliche Möglichkeit ist, weitere Parameter festzulegen, sollte es nicht existieren.quelle
Code Complete (und viele andere Softwareentwicklungsressourcen) heben hervor, dass Ihre Klassen mit Objekten der realen Welt verglichen werden. Ich glaube, der Hauptgrund dafür ist, dass Sie dadurch wahrscheinlicher verstehen, was Sie implementieren, als sich von einer immateriellen Idee abzukoppeln.
Wenn Sie sich für diese Theorie entscheiden, sehe ich nichts Falsches daran
Start()
, einer Klasse eine Methode hinzuzufügen , die, wenn es sich um ein reales Objekt handelt, auch einen Ruhezustand haben sollte. Wenn es keinen Sinn macht, dass Ihr Objekt existiert, während es nicht ausgeführt wird (oder wenn Ihr Objekt überhaupt ausgeführt wird), dann würde ich sagen, dass es eine schlechte Praxis ist.quelle
Start()
dies entweder einem Ein / Aus-Schalter (wie einem Lichtschalter) entsprechen könnte, der dann einen haben sollteStop()
, oder einem Druckknopf (wie dem Druckknopf eines Kopiergeräts), bei dem er startet und dann ausgeführt wird, bis er fertig ist.Sie können Lazy Initialization verwenden.
Auf diese Weise vermeiden Sie eine zeitliche Kopplung, dh der Consumer Ihrer Klasse muss bestimmte Methoden in einer bestimmten Reihenfolge aufrufen. Wenn Sie
start()
zuerst anrufen müssen, müssen Sie wissen, wie die Klasse intern funktioniert. Dies ist schlecht, da Sie dies möglicherweise in Zukunft ändern werden.Verzögern Sie die teure Initialisierung, bis sie zum ersten Mal benötigt wird.
Beispiel:
quelle