Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Unit mit Objekten aufteilen (https://www.delphipraxis.net/138420-unit-mit-objekten-aufteilen.html)

Optiplex 10. Aug 2009 08:08


Unit mit Objekten aufteilen
 
Hallo DP'Ler,

ich habe eine Unit mit meinen neuen Objektklassen und die wächst und wächst. Nun wollte ich auch wegen der Übersichtlichkeit und Fehlersuche diese Unit in aufteilen. Da aber sehr viele Klassen von einander abhängig sind bekomme ich nur Fehler da sich die Unit gegenseitig aufrufen. Nun meine Frage, gibt es ein Rezept bei dem es mir gelinkt diese Aufteilung durchzuführen.

Gruß Dieter

mkinzler 10. Aug 2009 08:17

Re: Unit mit Objekten aufteilen
 
Einmal im Interface und einmal im Implementierungsteil

himitsu 10. Aug 2009 08:25

Re: Unit mit Objekten aufteilen
 
wenn schon in den öffentlichen Interfaces Klassen voneinander abhängig sind, dann gibt es keine Möglichkeit, außer die gemeinsammen Teile oder eben gemeinsame Teile nochmals auszulagern (z.B. gemeinsame Klassen oder mindestens Vorfahren derer, welche stattdessen dann in der anderen Unit im öffentlichen Teil verwendet werden)

Optiplex 10. Aug 2009 11:39

Re: Unit mit Objekten aufteilen
 
Danke zusammen

@mkinzler
so einfach ist es nicht

@himitsu
genau das ist mein Problem, da die Klassen sich gegenseitig über Änderungen benachrichten sind diese natürlich im Interface deklariert. Ich hatte gehofft,dass hier jemand vielleicht einen Trick kennt um dieses Problem zu lösen.

Gruß Dieter

mjustin 10. Aug 2009 17:24

Re: Unit mit Objekten aufteilen
 
Zitat:

Zitat von Optiplex
@himitsu
genau das ist mein Problem, da die Klassen sich gegenseitig über Änderungen benachrichten sind diese natürlich im Interface deklariert. Ich hatte gehofft,dass hier jemand vielleicht einen Trick kennt um dieses Problem zu lösen.

* Wollknäuel-Methode (auch als Houdini-Methode bekannt): man beginnt an einem losen Ende in Form einer Klasse ohne Abhängigkeiten zu den anderen (also nur Abhängigkeiten zu Standard-Delphi-Units), das man dann in eine neue Unit extrahiert.

* Interfaces statt Klassen verwenden z.B. in Methodensignaturen: dadurch kann man die starke Kopplung der Klassen auflösen. Die Interfaces werden in einer neuen Unit definiert. So können wieder 'lose Enden' entstehen (weitere Klassen, die in eigene Dateien ausgelagert werden können)

* Hilfsklassen in Implementation verschieben. Beispiel:

Delphi-Quellcode:
interface
type
  TMyThread = class(TThread)
   ...
  end;
 
  TMyClass = class(TObject)
  private
  FMyThread: TMyThread;
  ...
  end;
wird zu

Delphi-Quellcode:
interface
type
  TMyClass = class(TObject)
  private
  FMyThread: TThread;
  ...
  end;

...

implementation
type
  TMyThread = class(TThread)
   ...
  end;
Das hilft z.B. wenn TMyThread wieder Klassen referenziert, die man lieber niht im interface hätte. Wenn TMyThread in einer eigenen Unit liegt, ist es wieder 'global' sichtbar, da sollte es nur sein wenn es eine gute Begründung gibt (Geheimnisprinzip).
Cheers,

Optiplex 11. Aug 2009 08:05

Re: Unit mit Objekten aufteilen
 
Hallo MJustin,
das hört sich schon sehr gut an, aber so richtig verstanden habe ich das noch nicht.

Bespiel

Delphi-Quellcode:
Type

interface
TMyObj = Class(TObject)
   FMyObjList: TMyObjList
end;

TMyObjList=Class(TObjectList)
   FMy2ObjList: TMy2ObjList
end;

TMy2Obj = Class(TObject)
   FMy2ObjList: TMy2ObjList
end;

TMy2ObjList=Class(TObjectList)
   FMyObjList: TMyObjList
   FMyObj:TMyObj
end;

implementation
Wie würdest du das auflösen. Von dieser Wollknäuel-Methode die du beschreibst habe ich noch nichts gehört, ist sie noch irgendwo genauer beschrieben?

Gruß
Dieter

mjustin 11. Aug 2009 08:50

Re: Unit mit Objekten aufteilen
 
Delphi-Quellcode:
Type

interface
TMyObj = Class(TObject)
   FMyObjList: TMyObjList
end;

TMyObjList=Class(TObjectList)
   FMy2ObjList: TMy2ObjList
end;

TMy2Obj = Class(TObject)
   FMy2ObjList: TMy2ObjList
end;

TMy2ObjList=Class(TObjectList)
   FMyObjList: TMyObjList
   FMyObj:TMyObj
end;

implementation
Die Klasse TMy2Obj wird nicht referenziert, sie kann problemlos (unverändert) in eine eigene Unit ausgelagert werden.

Mehr kann man anhand des Codes allein nicht sagen. Bei den anderen Klassen kommt es darauf an, welche im interface benötigt werden oder nur Hilfsklassen sind, die man auch komplett in den implementation Teil oder in andere Units verlagern könnte, wobei die Referenzen auf einen Vorfahrtyp umgestellt werden wie TObjectlist (was dann beim Zugriff einen unschönen Typecast erfordert). Schöner (aber etwas performancemindernd) wäre die Verwendung von Schnittstellentypen.

Optiplex 11. Aug 2009 11:57

Re: Unit mit Objekten aufteilen
 
Hallo mjustin,
ich habe nun verstanden was du meinst, aber so richtig weiter bringt mich das nicht, da ich nur sehr wenige Hilfklassen in den Implementatiomnsteil auslagern kann und frei zugängliche zum auslagern in andere Units sind auch sehr beschränkt.
Du schreibst etwas von Schnittstellentypen, die kenne ich überhaupt nicht, sind die schon in delphi 2005 vorhanden?
und wie setzt man die ein?

Gruß Dieter


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz