![]() |
Mehrere unterschiedliche Objektersteller alle als 'Create'?
Ich habe eine Klasse, die bereits zwei Konstruktoren besitzt. Nun entsteht eine weitere Methode, die auf eine dritte Weise ein Objekt (mit einer anhängenden baumartigen Struktur aus gleichen Objekten) erzeugt, das dann als Wurzelelement des Baums dient.
In C# oder C++ würde ich das mit verschiedenen statischen Funktionen machen. Ist es in Delphi angebracht, alles als Konstruktoren zu erzeugen:
Delphi-Quellcode:
Alternative:
constructor Create(vorgaenger: TKlasse); overload; // Bearbeitungsmodus
constructor Create(wert1, wert2, wert3: TTyp); overload; // Erstellen aus vorhandenen Daten constructor Create(ID: Integer); overload; // Einlesen aus Datenbank, Erstellen Baum
Delphi-Quellcode:
Oder ist es eher eine Frage des persönlichen Geschmacks?
class function CreateFromValues(wert1, wert2, wert3: TTyp): TKlasse;
class function CreateFromDB(ID: Integer): TKlasse; |
AW: Mehrere unterschiedliche Objektersteller alle als 'Create'?
Hallo,
Also in meinen Augen ist das Geschmackssache. |
AW: Mehrere unterschiedliche Objektersteller alle als 'Create'?
Der Code im Konstruktor sollte möglichst einfach sein und insbesondere keine potentielle Quelle für Exceptions sein.
Den folgenden Konstruktor nennt man copy constructor weil das übergebene Objekt von gleichen Typ wie die Klasse selbst ist:
Delphi-Quellcode:
Innerhalb des Konstruktors werden nur Daten kopiert und das geht so auch völlig in Ordnung.
constructor TKlasse.Create(vorgaenger: TKlasse); overload;
Auch der Konstruktor der mehrere Werte aus einfachen Typen entgegen nimmt und im Objekt ablegt ist kein Problem. Aber der Konstruktor
Delphi-Quellcode:
passt hier nicht rein.
constructor Create(ID: Integer); overload; // Einlesen aus Datenbank, Erstellen Baum
1. können bei Datenbankzugriffen Exceptions ausgelöst werden und 2. muss zwangsläufig auf globale Variablen (Datenmodul, Query, Connection) zugegriffen werden. Günstiger wäre es die Erzeugung eines Objekts dieser Klasse an anderer Stelle vorzunehmen:
Delphi-Quellcode:
Für die Beantwortung der Frage was in einen Konstruktor gehört und was nicht, versuche Dir einfach vorzustellen du müsstest die Unit mit der Klasse in einem anderen Programm benützen.
function TDatenModul.CreateXYobjekt(ID: Integer):TKlasse;
begin Query1.parameters.ParamValues['ID'] := ID; Query1.Open; Result := TKlasse.Create(Query1['...'], ...); Query1.Close; end; Das bedeutet z.B. das der Zugriff auf globale Variablen nicht möglich ist. |
AW: Mehrere unterschiedliche Objektersteller alle als 'Create'?
Hallo,
also ich denke auch, dass es eher Geschmackssache ist. Wobei ich die statischen Funktionen nicht verwenden würde, einfach weil man es seltener sieht. Auch das Freigeben der zurückgelieferten Klasse kann zu Memory Leaks führen. In C# ist das Thema ja nicht zu beachten ;) |
AW: Mehrere unterschiedliche Objektersteller alle als 'Create'?
Ein Contructor "muß" nicht immer "Create" heißen ... auch da sind unterschiedliche Namen möglich.
Man kann es zwar auch als "externe" Funktion machen, aber wenn, dann nehm ich lieber Class-Funktions, aber im Prinzip ist es fast das Gleiche wie ein Contructor ... aber in einer Klasse oder einem Record, sind diese wenigstens in einem "Namespace" zusammengefasst. |
AW: Mehrere unterschiedliche Objektersteller alle als 'Create'?
Der Konstruktor mit dem Parameter 'vorgaenger' ist kein Copy-Konstruktor, sondern dient zum Aufbau der Baumstruktur während der Bearbeitung. Bei einem Copy-Konstruktor hieße der Parameter 'source'.
Zitat:
Das Argument, dass bei der Abfrage etwas schiefgehen kann, zieht natürlich, also werde ich die Static-Function-Variante wählen. |
AW: Mehrere unterschiedliche Objektersteller alle als 'Create'?
Ich persönlich würde einen einzigen Konstruktor verwenden, und zwar einen, der das Objekt instantiiert und notwendige Daten initialisiert. Sonst nix, wie sx2008 schon sagte. Bei Dependency Injection kann man hier natürlich überladene Konstruktoren angeben.
Wenn ich das Objekt auf unterschiedliche Art und Weise initialisiere (denn das ist es ja eigentlich, was die einzelnen Konstruktoren tun), dann könnte ich mir eine 'Initialize' - Methode vorstellen, die dann überladen ist. Eine Methode soll genau eine Sache erledigen. Konstruktoren erzeugen (ggf. auch abhängige Felder). Fertig. |
AW: Mehrere unterschiedliche Objektersteller alle als 'Create'?
Zitat:
Zitat:
|
AW: Mehrere unterschiedliche Objektersteller alle als 'Create'?
Zitat:
|
AW: Mehrere unterschiedliche Objektersteller alle als 'Create'?
Zitat:
Delphi-Quellcode:
Ist jetzt nicht so kompliziert. Ich kann deinen Einwand aber nachvollziehen. Das Belegen mit Initialwerten gehört in den Konstruktor, denn damit wird das Verhalten der Instanz definiert.
Constructor TMyClass.Create(ImportantValues : TSetOfValues);
Begin ThisAndThat := ImportValues; Initialized := False; End; procedure TMyClass.LoadFromDatabase(...); Begin If Initialized then Raise Exception.Create("Object allready initialized"); Database.Load(Self); Initialized := true; End; Das Laden aus einer Datenbank gehört eindeutig nicht dort hin. Es ist zudem viel schlechter testbar. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz