Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   OOP: Designproblem, abhängige Klassen entwirren (https://www.delphipraxis.net/116213-oop-designproblem-abhaengige-klassen-entwirren.html)

alzaimar 25. Jun 2008 07:45


OOP: Designproblem, abhängige Klassen entwirren
 
Hallo,

ich sitze gerade an einer Klassenbibliothek für einen Reportgenerator. Ich habe eine 'Oberklasse', die als Controller fungiert (globale Einstellungen, Nachschlagelisten etc.). Jede Klasse meiner Bibliothek hat einen Verweis auf diese Oberklasse, ungefähr so:

Delphi-Quellcode:
Type
  TMasterClass = Class;
  TSomeItem = Class
  fMaster : TMasterClass;
  End;

  TAnotherItem (TSomeItem)
  End;

  TSomeItemList = Class (TList)
  ...
  End;

  TAnotherItemList = Class (TList)
  ...
  End;

  ...
  TMasterClass = Class
  Private
    fSomeItemList : TSomeItemList;
    fAnotherItemList : TAnotherItemList;
  Public
    Property SomeItemList : TSomeItemList Read fSomeItemList;
    Property AnotherItemList : TAnotherItemList Read fAnotherItemList;
  End;
Nun wird die Unit langsam ziemlich lang und mir fällt keine Methode ein, wie ich das entwirren kann, denn die Basisklasse 'TSomeItem', von der alle anderen Klassen abgeleitet werden, enthält ja einen Verweis auf die Masterklasse, die in der logischen Struktur ganz oben/unten ist.

Ich hatte in einem früheren Verweis einen abstrakten Vorfahren der 'TMasterClass' in einer eigenen Unit deklariert und so die zyklischen Abhängigkeiten entwirrt, nur dann musste ich bei jeden Zugriff auf die Instanz der Masterklasse auf die konkrete Klasse casten, was programmiertipptechnisch blöd und imho kein gutes OOP-Design ist.

Also: Gibt es ein Pattern, ein paar Grundregeln, wie ich diese Geschichte elegant aufdröseln kann? Wie kann ich die einzelnen Nachfahren der 'TSomeItem' in eigene Units packen. Geht das überhaupt? Wenn ich mir die Unit 'DB' anschaue, meine ich fast, das das nicht so einfach ist...

iKilledKenny 25. Jun 2008 07:52

Re: OOP: Designproblem, abhängige Klassen entwirren
 
Prinzipiell schon, wenn du die Funktionalität von TMasterClass in einem Interface kapselst, deinen einzelnen Items (TSomeItem, TAnotherItem) dann das Interface anstelle der konkreten Klasse übergibst und TMasterClass das Interface implementieren lässt.

In Delphi ist das ein bischen mühevoller als z.B. in C#, du musst dann TMasterClass von TInterfacedObject ableiten, aber es geht.

Wenn es allerdings nur darum geht, Referenzen auf seinen "Papa" zu haben, dann habe ich das immer mit TObject und einem TypeCast gemacht.

Delphi-Quellcode:
  TSomeItem = Class
    fMaster : TObject;
  End;

alzaimar 25. Jun 2008 08:03

Re: OOP: Designproblem, abhängige Klassen entwirren
 
Dann müsste ich aber konsequenterweise alles über Interfaces lösen. Uff.

Vielleicht doch TypeCasting.. :gruebel:

iKilledKenny 25. Jun 2008 08:29

Re: OOP: Designproblem, abhängige Klassen entwirren
 
Es kommt halt drauf an, ob die einzelnen Items wirklich ihren "Papa" kennen müssen, oft geht es ja auch ohne diese Referenz.

alzaimar 25. Jun 2008 09:57

Re: OOP: Designproblem, abhängige Klassen entwirren
 
Des prüfe ich erstmal, vielleicht habe ich es mir zunächst zu einfach gemacht und steh nun vor dem Dilemma.

Ich bedanke mich zunächst für deine Denkanstöße.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:31 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