Soll ich meine Java Objektdaten auf dem Bau oder explizit durch einen Methodenaufruf laden?

StackOverflow https://stackoverflow.com/questions/2419393

  •  19-09-2019
  •  | 
  •  

Frage

Dies ist eine Design-Frage. Ich versuche, zwischen zwei Implementierungen zu entscheiden.

Um auf diese erklären muss ich ein Beispiel. Also, zum Wohl Beispiel:

Ich habe eine Klasse, die einen Bericht über erzeugt, sagen wir mal, bestimmte Börse Werte an einem bestimmten Tag. Ich erstelle ein StockMarketReportGenerator Objekt, es dem heutigen Datum vorbei, und es erzeugt einen Bericht basierend auf den heutigen Marktwerten.

Die StockMarketReportGenerator "hat ein" StockMarketData Objekt. Der Zweck des StockMarketData Objekt ist es, alle Börsenwerte enthalten, die in einer Tabelle gespeichert werden in der Datenbank, und einige weitere Werte berechnet aus den Tabellendaten (vermutlich :) Stockmarket genannt). Es hat einen privaten Methoden, die mit der Datenbank verbinden, rufen Sie die Daten, tun die notwendigen Berechnungen, und speichern Sie die Endwerte in der Membervariablen des Objekts. (Es hat dann Getter Methoden, um diese Werte zu belichten, aber keine Setter-Methoden.) Die StockMarketData Klasse ist im Grunde ein „Halter“ für Börsendaten Werte. Ich habe eine zentrale Funktion so etwas wie „calculateStockMarketData()“ genannt, die alle diese privaten Helfer Methoden aufrufen und das Objekt einrichtet. (Ich bin mir bewusst, dass alle diese Verarbeitung wirklich leichter durch einen Rahmen wie Hibernate behandelt werden könnte,., Aber die Entscheidung wurde getroffen, um es manuell zu tun, wie es ein sehr kleines ist, etwas temporäres Projekt und nicht die Setup-Wert)

Meine Frage ist - aus meiner ReportGenerator Klasse, ich brauche nur das StockMarketData Objekt, um Eigenschaften zuzugreifen, es ist / Membervariablen - Nachbearbeitung und post-Berechnungen. Was bedeutet, dass wirklich, ich möchte das Objekt vorgefüllt bekommen mit Daten. Und so halte ich die calculateStockMarketData Methode privat und nenne es automatisch aus dem StockMarketData Konstrukteur. Aber ich fühle mich etwas unwohl in einem Konstruktor all meine Verarbeitung zu tun und dann keine öffentlichen Methoden müssen. Ist das ein Konstruktionsfehler? Oder ist es wirklich der logischste Weg, dies zu tun? Im Grunde genommen, welche der folgenden zwei Implementierungen ist besser?

1) (Meine aktuelle Implementierung) Stellen Sie die zentrale calculateStockMarketData() Methode privat und aus der StockMarketData Methode Konstruktor aufrufe (die heutigen Datum vorbei), so dass, wenn Sie ein Objekt StockMarketData haben, ist es bereits gefüllt. Also alles, was ich von der ReportGenerator Klasse brauchen würde, bevor ich mit den Objekteigenschaften starten, ist die Zeile:

StockMarketData myData = new StockMarketData(someDate);
Machen Sie

2) die zentrale calculateStockMarketData() Methode public, so dass, um eine StockMarketData Objekt einzurichten müssen Sie explizit die Methode aufrufen. Also von der ReportGenerator Klasse würde ich Code:

StockMarketData myData = new StockMarketData(someDate);
myData.calculateStockMarketData();

Der erste scheint mir die bessere Gestaltung, vor allem da es dann keine Möglichkeit, die Objekteigenschaften verwenden, bevor sie initialisiert werden. Aber ich bin auch nicht sicher über die Standards in Bezug auf eine Menge von Code aus einem Konstruktor Ausführen ... Welche soll ich wählen?

War es hilfreich?

Lösung

würde ich mit der Nummer 2, geht vor allem, wenn es eine Möglichkeit der Zugabe von Methoden der Klasse ist, die verlassen sich nicht auf, dass die Daten dort zu sein.

Auf der anderen Seite, wenn Sie die Klasse halten würden in einem ungültigen Zustand sein, ohne die Daten gefüllt, sollen Sie es auf dem Bau tun.

Andere Tipps

Martin Fowler hat einen guten Essay geschrieben auf Dependency Injection (Constructor vs. Setter Injektion) . Sein Rat ist „so viel wie möglich, gültige Objekte zu Bauzeiten zu schaffen“.

IMO, ist es am besten gültige Objekte, wenn möglich zu konstruieren, weil es leichter zu lesen / beobachtet das Verhalten des Codes macht, da Sie, dass die Objekte richtig konstruiert wurden annehmen können, und Sie haben wenige Fehler auf Objekte im Zusammenhang nicht sein in ordnungsgemäß gefüllt. Die Frage der Setter vs. Konstruktor Injektion unterscheidet sich von dem, was Sie aber fragen nach, das ist eine Frage, wo Sie Ihre Geschäftslogik auszuführen. Ich denke, dass es am besten ist es, den Konstruktor zu verwenden, um ein gültiges Objekt erstellen und dann in einer anderen öffentlichen Methode (Ihre # 2), die eigentliche Business-Logik auszuführen, so dass der Bau des Objekts zu einem anderen Zeitpunkt als die tatsächliche Geschäftslogik passieren kann.

ich immer explizit laden, nach dem Bau.

eine Datenbank von einem Konstruktor aufrufen können für schwierige Fehlersuche machen, zerbrechlicher, unflexibel Code und zu Problemen führen, wenn Ihre Nutzung des Objekts ändert.

Eine gute Praxis ist nicht viel Code in einem Konstruktor auszuführen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top