AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Mehrere unterschiedliche Objektersteller alle als 'Create'?
Thema durchsuchen
Ansicht
Themen-Optionen

Mehrere unterschiedliche Objektersteller alle als 'Create'?

Ein Thema von Mikkey · begonnen am 10. Okt 2013 · letzter Beitrag vom 11. Okt 2013
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.583 Beiträge
 
Delphi 12 Athens
 
#1

AW: Mehrere unterschiedliche Objektersteller alle als 'Create'?

  Alt 10. Okt 2013, 17:30
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.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#2

AW: Mehrere unterschiedliche Objektersteller alle als 'Create'?

  Alt 10. Okt 2013, 17:44
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.
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#3

AW: Mehrere unterschiedliche Objektersteller alle als 'Create'?

  Alt 10. Okt 2013, 17:58
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.
Wenn ich Objekte mit einem Konstruktor initialisiere, stelle ich damit sicher, dass die privaten Felder nur auf die Weise geändert werden, die die Klasse vorgibt. Wenn ich eine Initialize-Methode veröffentliche, habe ich das Risiko, dass die eben nicht nur unmittelbar nach dem Erzeugen des Objekts aufgerufen wird, sondern auch danach noch.
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#4

AW: Mehrere unterschiedliche Objektersteller alle als 'Create'?

  Alt 10. Okt 2013, 18:53
Wenn ich eine Initialize-Methode veröffentliche, habe ich das Risiko, dass die eben nicht nur unmittelbar nach dem Erzeugen des Objekts aufgerufen wird, sondern auch danach noch.
Das ist richtig. Aber das kannst Du ja sicherstellen. Ich kann doch ein Objekt instantiieren und erst später zum Gebrauch Initialisieren.

Delphi-Quellcode:
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;
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.

Das Laden aus einer Datenbank gehört eindeutig nicht dort hin. Es ist zudem viel schlechter testbar.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Mehrere unterschiedliche Objektersteller alle als 'Create'?

  Alt 10. Okt 2013, 19:10
Kann man sich drüber streiten. Ich finde es spricht nichts dagegen, eine statische Factory-Methode zu haben, die eine Instanz erzeugt und die Initialwerte aus der Datenbank liest. Ob man das jetzt als statische Methode implementiert oder als zusätzlichen Konstruktor, macht eigentlich keinen Unterschied.

Ich würde dazu tendieren, im Falle von Konstruktoren diese dann unterschiedlich zu benennen (aber alle mit Präfix „Create“), da ich finde, je mehr der Name einer Methode darüber verrät, was sie macht, desto besser.

Zu Dependency Injection kann ich hier nur sagen KISS.

Geändert von Namenloser (10. Okt 2013 um 19:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.583 Beiträge
 
Delphi 12 Athens
 
#6

AW: Mehrere unterschiedliche Objektersteller alle als 'Create'?

  Alt 10. Okt 2013, 19:21
Ich würde dazu tendieren, im Falle von Konstruktoren diese dann unterschiedlich zu benennen (aber alle mit Präfix „Create“), da ich finde, je mehr der Name einer Methode darüber verrät, was sie macht, desto besser.
Das sowieso, vorallem da man es hier auch mit der Codevervollständigung einfacher hat.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#7

AW: Mehrere unterschiedliche Objektersteller alle als 'Create'?

  Alt 11. Okt 2013, 06:47
Codevervollständigung
Du meinst die Delphi7-Sanduhrfunktion? Das habe ich abgeschaltet, damit ich mit nicht nach dem Tippen jedes Punktes einen Kaffee holen gehe.
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#8

AW: Mehrere unterschiedliche Objektersteller alle als 'Create'?

  Alt 11. Okt 2013, 06:30
Das Laden aus einer Datenbank gehört eindeutig nicht dort hin. Es ist zudem viel schlechter testbar.
Das war der Anlass der Frage, das Laden der komplexen Struktur wird also kein Konstruktor.
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#9

AW: Mehrere unterschiedliche Objektersteller alle als 'Create'?

  Alt 10. Okt 2013, 17:45
Ein Contructor "muß" nicht immer "Create" heißen ... auch da sind unterschiedliche Namen möglich.
Das ist mir bewusst, aber die Argumente, die ich hier bisher dafür gelesen habe, sind schon zündend.

Man kann es zwar auch als "externe" Funktion machen, aber wenn, dann nehm ich lieber Class-Funktions, ... aber in einer Klasse oder einem Record, sind diese wenigstens in einem "Namespace" zusammengefasst.
Das sehe ich auch so...
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:06 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-2025 by Thomas Breitkreuz