2010-12-02 5 views
2

Beide Methoden funktionieren für mich, aber ich bin mir nicht sicher, was die Empfehlung aus Sicht der "guten Praxis" wäre.Heavy Constructors oder verwenden Sie eine Methode

Ich habe eine Klasse, die verschiedene Steuerfunktionen innerhalb meiner Bibliothek durchführt, also alle Arten von Objekten und Eigenschaften initialisieren muss.

Ist es in Ordnung, alle diese Logik in den Konstruktor für die Klasse zu setzen, oder sollte ich es in eine "Initialisieren" -Methode setzen.

public MyClass() 
{ 
    mSubObjectA = new mSubObjectA(); 
    mSubObjectA.DoStuff(); 
    mSubObjectA.DoMoreStuff(); 

    mSubObjectB = new mSubObjectB(); 
    mSubObjectC = new mSubObjectC(); 

    if (something) 
    { 
     DoStuff(); 
    } 
    else 
    { 
     MagicHappens(); 
    } 
} 

Antwort

0

Es hängt davon ab, wie viele Konstruktoren Sie denken, dass Sie haben werden. Code nicht wiederholen. Wenn all diese Schritte nur in Ihrem einen Konstruktor passieren, ist das kein Problem. Wenn Sie etwas ausgefalleneres suchen, ordnen Sie Ihren Code intelligent an.

+0

War nicht sicher, welche Antwort zu akzeptieren, da die Factory-Diskussion am nützlichsten war, aber da ich nicht tatsächlich in diesem Fall verwendet, aber meinen Code besser angeordnet, ich denke, das ist es. :) – Cylindric

1

Es gibt eine Alternative zu beiden - verwenden, um eine factory Klasse oder factory method.

Das Konstruieren komplexer Objektdiagramme ist das, woran sich das Fabrikmuster orientiert - klingt wie eine sehr gute Anpassung an Ihre Situation.

6

Persönlich mag ich, dass ein Objekt vollständig betriebsbereit ist, wenn ich es erhalte. Auf der anderen Seite, eine Menge Arbeit im Konstruktor tun tut Geruch etwas.

Eine Alternative ist eine statische Factory-Methode (oder eine Fabrik Klasse *) zu schreiben, die die ganze Arbeit tun können, um es zu muss, bevor den Konstruktor aufrufen, und dann der Konstruktor selbst ziemlich einfach machen. Abhängig von Ihren Anforderungen können Sie den einfachen Konstruktor anzeigen oder nicht.

* Eine Fabrik Klasse kann für eine bessere Testbarkeit machen, und ermöglicht potenziell verschiedene Fabrik-Implementierungen. Auf der anderen Seite, an diesem Punkt haben Sie eine ziemlich hohe Ebene der Abstraktion, die eine Ablenkung sein kann.

+0

Testbarkeit ist genau, woher das kommt - ich habe mit NUnit angefangen und habe alle möglichen Probleme, Teile für Tests zu isolieren - wenn das nicht schlecht riecht, dann weiß ich nicht was! Im Moment müssen viele Dinge eingerichtet werden, bevor der Unterricht beginnen kann. – Cylindric

+0

@Cylindric: Es wird teilweise davon abhängen, wer wirklich für dieses Setup verantwortlich ist. Muss es diese Klasse sein? Sollte dieser Setup-Teil zugänglich sein? –

+0

@Jon Skeet Ich stimme der Factory Class zu 100% zu, aber ich würde gerne sagen, dass die Ablenkung der zusätzlichen Abstraktion eine gute Sache sein kann, da man merkt, dass etwas anderes als nur "neu" vor sich geht. Wir verwenden ziemlich viel von CSLA, wo ich arbeite und es gibt eine Menge Arbeit während der Instanziierung und es ist gut, dass man nicht einfach neu anrufen kann. – msarchet

Verwandte Themen