2010-08-19 5 views
10

Ich versuche, ein besseres Verständnis der allgemeinen Praxis zu bekommen ... speziell abgeleitet this() in einem Konstruktor. Ich verstehe, dass es weniger Code, aber ich halte es für weniger lesbar. Ist es üblich/gut, es so zu machen? Oder ist es besser, einen zweiten Konstruktor zu schreiben, der es speziell behandelt?: this() Als Konstruktor

public SomeOtherStuff(string rabble) : this(rabble, "bloop") { } 

oder

Public SomeOtherStuff(string rabble) 
{ 
    //set bloop 
} 

Jede Eingabe schätzten

+3

'this()' ist eine gute Möglichkeit, Auto-Eigenschaften für einen Strukturtyp zu haben und dennoch zu erlauben, dass sie in einem parametrisierten Konstruktor gesetzt werden. Ohne das 'this()' müssen explizite Hintergrundfelder verwendet werden. –

+0

@Dan: Das ist brilliant, daran habe ich nie gedacht!In Zukunft werde ich 'this()' in Strukturen verwenden, die Auto-Eigenschaften haben! Vielen Dank! – Timwi

Antwort

17

Es ist eine gute Praxis, wenn immer möglich this() zu verwenden. Andernfalls duplizieren Sie einen Code, der gegen das DRY-Prinzip (Do not Repair Yourself) verstößt. Das Problem mit sich selbst zu wiederholen ist, dass jedes Mal, wenn Sie eine Änderung vornehmen müssen - auch wenn es eine einfache Änderung an einer einzigen Zeile des Codes ist - müssen Sie merken gleichen an mehreren Stellen ändern, und behalten Sie die multiple Kopien synchronisiert.

Sie sollten den Code nur "duplizieren", wenn Sie müssen, da es anders sein muss, so dass es nicht mehr ein Duplikat ist. Auf diese Weise ist ein Duplikat eine Nachricht an den Leser, dass der Code tatsächlich anders ist, und dies aus einem bestimmten Grund.

+0

Große Antwort und das erklärt definitiv meine Frage. Ich habe das DRY-Prinzip nicht gesehen und ich glaube, dass das meinen Code auf der ganzen Linie verbessern wird. Vielen Dank! – Aardvark

0

ich weniger kümmern uns um die Lesbarkeit und mehr für Zuverlässigkeit wäre.

Verketten Konstruktoren ist viel besser als Copypasting Konstruktor Methode Körper.

+4

Ich stimme zu, Konstruktoren zu verketten ist besser als Code zu kopieren. Lesbarkeit ist jedoch sehr wichtig. In diesem Fall denke ich, dass Konstrukteure besser lesbar und viel zuverlässiger sind. Aber als eine allgemeine Aussage, "nicht" für Lesbarkeit zu sorgen ist eine gefährliche Praxis IMO. –

+1

@foo Buggy und lesbar oder obskur aber zuverlässig? Natürlich ist es nicht immer eine Entweder-oder-Situation, aber wenn Sie die Wahl haben, das eine oder das andere zu tun, besser das andere. Auch der unlesbarste Code wird mit der Anwendung von Code-Kommentaren mehr als nachvollziehbar! – Will

+0

Uh, warum verbindest du "Buggy" mit "lesbar"? Wie wäre es mit "lesbar und zuverlässig"? Sie schließen sich nicht gegenseitig aus. –

1

So ketten Sie Konstrukteure und es ist eine vollkommen gültige Sache zu tun.

7

Das Problem mit den zwei separaten Konstruktoren ist, dass sie oft identischen Code enthalten, was zu Problemen mit späteren Refactorings führen kann, wenn ein Konstruktor geändert wird und der andere nicht. So könnte man sehen, dass der Konstruktor mit diesem() als eine Anwendung der DRY principle verkettet ist.

2

Initialisierungslisten sind in der Industrie weit verbreitet.

Aus Gründen der Lesbarkeit ... ist das eine Frage der Meinung. Aber Wartbarkeit ist in der Regel ein höheres Ziel zu erreichen.

DRY ist eine gute Sache :)

1

Ich mag die erste Möglichkeit (Konstruktorverkettung), aber wenn Sie die zweite Möglichkeit, das Gefühl besser lesbar ist dann für das gehen, und Sie könnten, was doppelte Code, den Sie in die haben setzen Konstruktoren zu einer privaten Methode, um zu vermeiden, das von den Menschen erwähnte DRY-Prinzip zu brechen.

Außerdem versuche ich auch immer, im Stil des Codes zu arbeiten, an dem ich arbeite - wenn also der vorherrschende Stil der eine oder der andere ist, würde ich mit diesem Stil aus Konsistenz gehen.

0

Eine andere Möglichkeit zu DRY ist das Schreiben einer Initialisierungsmethode, zum Beispiel Init(rabble, bloop) und alle Konstruktoren rufen diese Methode auf.

Dies ist tendenziell weniger verwirrend und flexibler, vor allem dort, wo es viele Konstruktoren gibt.