![]() |
Designfrage: Liste selber schreiben? Oder von TList oder TList<T> ableiten?
Hallo Leute,
ich bin im Moment gerade dabei für ein Projekt meine Klassen zu konzipieren und stehe dabei vor einer vermutlich eher trivialen Entscheidung. Dennoch würde ich gern eure Meinung dazu hören, ob ihr Argumente Für oder Wider habt — oder ob ihr der Meinung seid, dass es hier auf den persönlichen Geschmack ankommt. Kurz zur Situation: ich habe verschiedene Klassen, für die ich jeweils Listen-Klassen erstellen möchte. Mal als Konzept in Pseudo-Code:
Delphi-Quellcode:
Das soll jetzt mal als Beispiel dienen. Worum es mir jetzt geht: ich habe einige andere Klassen, die wie TEmployee im Beispiel, jeweils eine Listen-Klasse erhalten sollen. Im Großen und Ganzen unterscheiden diese sich jeweils nur durch diverse Properties und die Implementierung der Funktion LoadFromXML().
type
TESPBase = class constructor Create; destructor Destroy; function LoadFromXML(xml: TJclSimpleXMLElem): Boolean; virtual; function DumpToJSON: String; virtual; end; TEmployee = class(TESPBase) constructor Create; destructor Destroy; function LoadFromXML(xml: TJclSimpleXMLElem): Boolean; function DumpToJSON: String; property ID: String; property FirstName: String; property LastName: String; end; TEmployeeList = class(TESPBase) constructor Create; destructor Destroy; function LoadFromXML(xml: TJclSimpleXMLElem): Boolean; function DumpToJSON: String; procedure Add(Elem: TEmployee); procedure Clear; procedure Delete(Index: Integer); procedure IndexOfID(SearchID: String); property Items[Index: Integer]: TEmployee; property ItemsByID[Index: String]: TEmployee; end; Ich würde an der Stelle jetzt eine Klasse TEspBaseList erstellen, von der ich dann sowohl TEmployeeList als auch alle anderen Listen ableiten kann. Dafür sehe ich jetzt 3 Möglichkeiten:
Was würdet ihr an meiner Stelle tun? Gibt es noch Vor- oder Nachteile an die ich nicht gedacht habe? Oder ist das wirklich eine reine Geschmackssache? Vielen Dank schon mal! Gruß, mh166 |
AW: Designfrage: Liste selber schreiben? Oder von TList oder TList<T> ableiten?
Hast du schon mal daran gedacht, die Funktionalität von TESPBase in zwei Interfaces zu verlagern? Damit brauchst du nicht mehr die gemeinsame Basisklasse. Das befreit ungemein...
|
AW: Designfrage: Liste selber schreiben? Oder von TList oder TList<T> ableiten?
Kleine Randbemerkung:
die Basisklasse
Delphi-Quellcode:
ist fest an eine andere Klasse TJclSimpleXMLElem gebunden. Und alle abgeleiteten Klassen ebenfalls. Was wäre, wenn statt Jcl einmal eine andere XML Bibliothek verwendet werden soll?
TESPBase = class
constructor Create; destructor Destroy; function LoadFromXML(xml: TJclSimpleXMLElem): Boolean; virtual; function DumpToJSON: String; virtual; end; Die Basisklasse sollte von der Konvertierung des Objekts nach/von JSON/XML unabhängig sein. Lesetipp: ![]() |
AW: Designfrage: Liste selber schreiben? Oder von TList oder TList<T> ableiten?
und dann noch die TList<> verwenden und nicht davon ableiten - dann hast Du noch weitere Freiheit dazu gewonnen...
|
AW: Designfrage: Liste selber schreiben? Oder von TList oder TList<T> ableiten?
Ich mache selber immer noch zu viele Anfänger- und Deppenfehler um zu laut Ratschläge geben zu dürfen, aber:
|
AW: Designfrage: Liste selber schreiben? Oder von TList oder TList<T> ableiten?
Zitat:
Ja, TList<> verwenden ist sicher richtig, wie Lemmy sagte allerdings nicht davon ableiten sondern sie private Variable intern als Datenspeicher nutzen, und nach aussen nur fachlich notwendige Methoden veröffentlichen (Hinzufügen/Entfernen/Suchen). Genau das: Zitat:
|
AW: Designfrage: Liste selber schreiben? Oder von TList oder TList<T> ableiten?
Zitat:
Delphi-Quellcode:
type
TESPBase = class constructor Create; destructor Destroy; function LoadFromXML(xml: TJclSimpleXMLElem): Boolean; virtual; function DumpToJSON: String; virtual; end; TEmployee = class(TESPBase) constructor Create; destructor Destroy; function LoadFromXML(xml: TJclSimpleXMLElem): Boolean; function DumpToJSON: String; property ID: String; property FirstName: String; property LastName: String; end; TESPBaseList<T: TESPBase> = class(TESPBase) constructor Create; destructor Destroy; function LoadFromXML(xml: TJclSimpleXMLElem): Boolean; function DumpToJSON: String; procedure Add(Elem: T); procedure Clear; procedure Delete(Index: Integer); procedure IndexOfID(SearchID: String); property Items[Index: Integer]: T; property ItemsByID[Index: String]: T; end; TEmployeeList = TESPBaseList<TEmployee>; |
AW: Designfrage: Liste selber schreiben? Oder von TList oder TList<T> ableiten?
Zitat:
Zitat:
Zitat:
[/quote] Zitat:
Zitat:
|
AW: Designfrage: Liste selber schreiben? Oder von TList oder TList<T> ableiten?
Zitat:
BTW, könnte es sein, daß du in deinen abgeleiteten Klassen das override unterschlagen hast? |
AW: Designfrage: Liste selber schreiben? Oder von TList oder TList<T> ableiten?
Zitat:
Es ist, wie der Name schon sagt, eine Liste. Kein Webserver-Response-Ausleser. Irgendwann hast du einen Webserver, der dir die Daten anders formatiert. Dann musst du deine Liste von Arbeitnehmern anpassen, nur weil sich ein Webserver geändert hat? Grade wenn man einmal damit angefangen hat verleitet es immer weiter, die Klasse mit Dingen aufzublähen die sie nicht haben sollte. Irgendwann kommt eine Methode
Delphi-Quellcode:
welche anhand von irgendwelchen Kriterien Arbeitnehmer auswählt und sie entfernt. Sie stecken zwar in der Liste, aber die Liste selbst hat auch nicht die Filterung zu treffen, wer entfernt wird. Das nur als Beispiel. Schuster, bleib bei deinen Listen (höhö).
massenentlassung()
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:25 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