Hallo!
Ich bastel gerade an dem Grundgerüst eines neuen Programms. Man könnte es vielleicht Architektur nennen, aber ganz so ausgereift ist es noch nicht. Die Idee ist, dass ich im Prinzip die verschiedenen Aufgaben im Programmfluss auf verschiedene Klassen aufteile.
Hierbei gibt es eine Hierachie mit zwei Stufen:
Auf obersten Stufe arbeitet der
ProgramManager, dieser verwaltet einige
globale Werte und zudem verschiedene
SubManager die Teilaufgaben erledigen. So kümmert sich z.B. der OptionsManager darum, dass die Optionen ausgelesen, geändert, geschrieben, etc. werden.
Der ProgrammManager erstellt und kontrolliert die SubManager.
Das Problem: Geleichzeitig sollen die SubManager auf die globalen Werte des ProgrammManagers zugreifen können. Deswegen muss die
Unit des ProgrammManagers die Units der SubManager referenzieren und umgekehrt. Dies für zu einem zirkulären Bezug:
Delphi-Quellcode:
Unit_A
...
uses Unit_B; // Notwendig für TOptionsManager...
type
TProgrammManager = class(TObject)
private
FOptionsManager: TOptionsManager;
FRegistryPfad: String;
public
constructor Create;
RegistryPfad: String read FRegistryPfad;
end;
...
constructor TProgrammManager.Create;
begin
FRegistryPfad := '\Ein\Pfad\in\der\Registry\';
// SubManager "OptionsManager" erstellen und verwenden
FOptionsManager := TOptionsManager.Create;
FOptionsManager.LiesOptionen;
end;
Delphi-Quellcode:
Unit B
...
uses Unit_A;
// Notwendig für TProgrammManager ...
type
TOptionsManager=
class(TObject)
private
FParrent: TProgrammManager;
public
constructor Create(aParrent: TProgrammManager);
procedure LiesOptionen;
end;
...
constructor TOptionsManager.Create(aParrent: TProgrammManager);
begin
// SubManager mit ProgrammManager Parrent erstellen
FParrent := aParrent;
end;
procedure TOptionsManager.LiesOptionen;
begin
// Mit globalen Werten des ProgrammManager arbeiten
OpenRegistryPath(FParrent.RegistryPfad);
...
end;
Ich finde die Konstruktion eigentlich recht gut, nur leider funktioniert das Ganze wegen dem zirkulären
Unit-Bezug nicht. Habt Ihr eine Idee wie ich dieses Problem umgehen kann?
Besten Dank
Ares