Ist es Verletzung des Clean-Code zum Aufruf der init-Methode im Konstruktor wie diese
Mein Anliegen in der untenstehende code ist, dass der Parameter an den Konstruktor ist eigentlich nicht direkt zugeordnet, um die Klasse-Instanz-Felder. Die Instanz-Felder herleiten Wert aus der parameter-und für die bin ich mit dem initalize-Methode. Weiter, habe ich einige Sachen so, dass das Objekt erstellt wurde, kann verwendet werden, direkt in der folgende code, z.B. Aufruf drawBoundaries(). Ich habe das Gefühl es tut, was gemeint ist, durch anlegen(initialisieren) einer Leinwand in einem abstrakten Sinn.
Ist mein Konstruktor zu viel zu tun? Wenn ich die add-Methoden zu nennen, die in Sachen Konstruktor explizit von außen, das wird falsch sein. Bitte lassen Sie mich wissen, Ihre Ansichten.
public class Canvas {
private int numberOfRows;
private int numberOfColumns;
private final List<Cell> listOfCells = new LinkedList<Cell>();
public Canvas(ParsedCells seedPatternCells) {
initalizeCanvas(seedPatternCells);
}
private void initalizeCanvas(ParsedCells seedPatternCells) {
setNumberOfRowsAndColumnsBasedOnSeedPatten(seedPatternCells);
drawBoundaries();
placeSeedPatternCellsOnCanvas(seedPatternCells);
}
...
P. S.: Sorry, wenn dies sieht aus wie eine dumme Frage, mein code wird überprüft werden, indem eine OOP-guru, und ich bin gerade besorgt :-0
EDIT:
Las ich einige Bedenken über die Methoden in initalizeCanvas() über-geritten - zum Glück diese Methoden sind private und nicht jeder andere Methoden.
Sowieso nach weiterer Forschung auf dem Netz, das ich angefangen habe, mögen diese mehr... ich hoffe, Euch damit einverstanden !!??
public class Canvas {
private int numberOfRows;
private int numberOfColumns;
private final List<Cell> listOfCells = new LinkedList<Cell>();
private Canvas() {
}
public static Canvas newInstance(ParsedCells seedPatternCells) {
Canvas canvas = new Canvas();
canvas.setNumberOfRowsAndColumnsBasedOnSeedPatten(seedPatternCells);
canvas.drawBoundaries();
canvas.placeSeedPatternCellsOnCanvas(seedPatternCells);
return canvas;
}
- Ich sehe nichts wohl falsch mit Ihrem code.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist generell eine schlechte Idee für einen Konstruktor enthalten, die nicht trivial-code. Als eine Regel, Konstruktoren sollten in den meisten weisen gelieferten Werte zu Feldern. Wenn ein Objekt erfordert komplexe Initialisierung, Initialisierung sollte die Verantwortung einer anderen Klasse (in der Regel ein Fabrik). Sehen Miško Hevery große write-up zu diesem Thema: Fehler: Konstruktor muss Echte Arbeit.
Sollten Sie nie nennen non-final Methoden in einem Konstruktor. Effektive Java - macht einen guten job zu erklären, warum, aber im Grunde ist das Objekt nicht in einem stabilen Zustand befinden, bevor der Konstruktor gibt. Wenn Ihr Konstruktor ruft die Methoden, die überschrieben werden, indem eine Unterklasse, können Sie bekommen seltsame, Undefinierte Verhalten.
Siehe auch diese Antwort.
private
, so konnte es nicht überschrieben werden durch die Unterklasse. Bin ich etwas fehlt?Obwohl es nicht der eleganteste Weg, es zu tun, ich sehe es nicht als fehlerhaft aus OO-Sicht. Allerdings, wenn Sie nicht den Aufruf der
private
MethodeinitalizeCanvas
von einer beliebigen anderen Stelle innerhalb der Klasse, dann können Sie erwägen, verschieben Sie diese drei Zeilen an den Konstruktor selbst.Sehe ich zwei mögliche Probleme:
Sind die Methoden, die Sie aufrufen, in
initializeCanvas
private oder final? Wenn Sie nicht sind, ist es möglich, eine Unterklasse zu überschreiben, Sie und unwissentlich gegen den Konstruktor.Machst du Grafik-Operationen in der
drawBoundaries
Methode? Es ist eine gute übung für Konstruktor zu tun, nur das notwendige minimum zu erstellen, die ein gültiges Objekt. Sind diese Operationen notwendig, für die Leinwand einen gültigen Anfangszustand?Kommt es an.
Es ist nicht schlecht für einen Konstruktor-Aufruf einer privaten Methode, vorausgesetzt, dass die private Methode nicht andere Methoden aufrufen, die könnten überschrieben werden. Allerdings, wenn die Methode oder die Methoden, es fordert, könnte überschrieben werden, können Sie in Schwierigkeiten führen. Speziell die überschreibende Methode wird aufgerufen, bevor das überschreiben von Klassen-Konstruktor ausgeführt, und werden sehen, Instanz-Felder, bevor Sie initialisiert wurden.
Einem zweiten problem, wenn Sie, dass einige der Methoden in Ihrem
initalizeCanvas
Methode schauen, wie Sie meinen "veröffentlichen", die das aktuelle Objekt, bevor es wurde vollständig initialisiert. Dies ist möglicherweise problematisch, wenn die Anwendung ist multi-threaded, und kann dazu führen, in anderen threads zu sehen, veraltete Feld Werte.Ein eigenes init-Funktion könnte nützlich sein, wenn Sie haben mehrere Konstruktoren, in denen einige Parameter sind voreingestellt oder zufällig. Nach allem, was bestimmt ist, ein eigenes init-Funktion füllt das Objekt.
In einem Konstruktor der Klasse, wahrscheinlich nicht.