AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Unit mit Objekten aufteilen

Ein Thema von Optiplex · begonnen am 10. Aug 2009 · letzter Beitrag vom 11. Aug 2009
Antwort Antwort
Optiplex

Registriert seit: 5. Mär 2008
131 Beiträge
 
Delphi 2005 Personal
 
#1

Unit mit Objekten aufteilen

  Alt 10. Aug 2009, 09:08
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Unit mit Objekten aufteilen

  Alt 10. Aug 2009, 09:17
Einmal im Interface und einmal im Implementierungsteil
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Unit mit Objekten aufteilen

  Alt 10. Aug 2009, 09:25
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)
$2B or not $2B
  Mit Zitat antworten Zitat
Optiplex

Registriert seit: 5. Mär 2008
131 Beiträge
 
Delphi 2005 Personal
 
#4

Re: Unit mit Objekten aufteilen

  Alt 10. Aug 2009, 12:39
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
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#5

Re: Unit mit Objekten aufteilen

  Alt 10. Aug 2009, 18:24
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,
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Optiplex

Registriert seit: 5. Mär 2008
131 Beiträge
 
Delphi 2005 Personal
 
#6

Re: Unit mit Objekten aufteilen

  Alt 11. Aug 2009, 09:05
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
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#7

Re: Unit mit Objekten aufteilen

  Alt 11. Aug 2009, 09:50
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.
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Optiplex

Registriert seit: 5. Mär 2008
131 Beiträge
 
Delphi 2005 Personal
 
#8

Re: Unit mit Objekten aufteilen

  Alt 11. Aug 2009, 12:57
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
  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 17:48 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