AGB  ·  Datenschutz  ·  Impressum  







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

Projekt auf Interfaces umstellen

Ein Thema von TheMiller · begonnen am 11. Apr 2012 · letzter Beitrag vom 13. Apr 2012
Antwort Antwort
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#1

Projekt auf Interfaces umstellen

  Alt 11. Apr 2012, 15:18
Delphi-Version: 2009
Hallo,

ich habe mich gerade ein wenig mit Interfaces befasst. Ich überlege, ein vorhandenes und recht großes Projekt auf Interfaces umzustellen.

Meine Frage ist jetzt: Ist es möglich - ohne große Risiken und ohne sehr großen Aufwand - ein ganzes Projekt auf Interfaces umzustellen. Und wenn ja, lohnt es sich?

Ich überlege deshalb, weil ich geplant habe, ein Plugin-System für das Projekt zu entwickeln um die exe zu verkleinern. Das sollen DLLs sein und teilweise auch Forms enthalten. Ich weiß noch nicht, ob ich die Plugin-Schnittstelle (das Interface) veröffentlichen möchte. Es sind alles nur Gedanken.

Ich hoffe, ihr könnt mich dahingehend etwas beraten. Mit Plugin-DLLs und darin enthaltenen Forms habe ich Erfahrung. Diese setze ich bereits in zwei Projekten ein, ohne Probleme.

Danke!
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.352 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Projekt auf Interfaces umstellen

  Alt 11. Apr 2012, 15:41
Mit konkreten Erfahrungen kann ich nicht aufwarten. Aber die beiden Threads könnten interessant für Dich sein:
http://www.delphipraxis.net/166192-s...r-dummies.html
http://www.delphipraxis.net/166899-i...eferenzen.html

Ich sehe 2 Vorteile bei der Verwendung von Interfaces (in Delphi)
- die Speicherverwaltung ist automatisiert
- die Units Klassen sind deutlich besser voneinander entkoppelt

Als Nachteil ist sicher die erhöhte Schreibarbeit und ein gewisser Lernbedarf am Anfang zu nennen.

Ein "normals Projekt" auf Interfaces umzustellen, dürfte sich lohnen, wenn man sehr komplexe Beziehungen zwischen den Klassen herstellen muss und Probleme mit der Speicherverwaltung der Objekte hat. Mit Interfaces lässt sich das m.E. abstrakter und übersichtlicher handeln.

Wenn Du Objekte an eine DLL übergeben willst, geht das m.E. nur über Interfaces - stimmt das? Ich habe damit noch nie gearbeitet.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli (11. Apr 2012 um 16:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#3

AW: Projekt auf Interfaces umstellen

  Alt 11. Apr 2012, 16:16
Solltest dir dies bzgl. auch mal die Serie von Nick Hodges anschauen. Ich finde, es lohnt sich wirklich. habe im Moment Spring im Einsatz und bin davon sehr überzeugt und freue mich jeden Tag aufs neue, wo schön Dinge doch sein können. Aber es Bedarf halt etwas an Verständnis für die Materie.

Aufwand und Risiken wirst du aber immer haben, da du ja ein sinnvolles Konzept erstellen solltest. Blind von jeder Klasse ein Interface definieren und loslegen hat imho nur den Vorteil der automatischen Speicherverwaltung. Hat man aber FastMM im Einsatz, so kann man das Problem der Speicherleichen aber schon von vorn herein bekämpfen. Beim Umstieg solltest du ruhig einen Schritt weiter gehen, imho.

@stahli: man entkoppelt nicht Units voneinander, sondern man schafft eine lose Kopplung. Klassen hängen nicht mehr direkt voneinandere ab, sondern eben nur noch von den definierten Schnittstellen, egal welche Klassen diese implementieren.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

AW: Projekt auf Interfaces umstellen

  Alt 11. Apr 2012, 16:35
Die Frage ob ein vorhandenes Projket einfach und problemlos auf Interfaces umstellbar ist, ist nicht so einfach. Im Zweifel würde ich diese deshalb mit Nein beantworten
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Projekt auf Interfaces umstellen

  Alt 11. Apr 2012, 16:48
Forms in DLLs auslagern ... da muß man aber auch etwas aufpassen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#6

AW: Projekt auf Interfaces umstellen

  Alt 11. Apr 2012, 17:10
Hallo.

Vielen Dank für die zahlreichen Antworten. Nach alldem habe ich mich entschlossen, das mit den Interfaces etwas aufzuschieben und das Projekt erstmal so zu warten. Dann, wenn ich mehr Zeit habe, werde ich mit Interfaces neu (parallel) entwickeln und dann die "alte Version" aufgeben.

Aber ich werde mich damit dann doch noch beschäftigen, nur halt später.

Vielen Dank
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.045 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#7

AW: Projekt auf Interfaces umstellen

  Alt 11. Apr 2012, 16:38
Klares "kommt drauf an". Hängt vom vorhandenen Design der Anwendung ab. Lässt sich diese ohne große Umbauten auf Interfaces umstellen, ohne dass du in AVs und invalid pointer Exceptions rennst, weil das ganze Lifetime Management deiner Instanzen so vertrackt ist.

Bei der Benutzung von Interfaces musst du dir auch im Klaren darüber sein, wie das Interface aussehen soll und ob du bei einem Plugin System abwärtskompatibel sein möchtest so dass nicht alle Plugins bei einer Erweiterung/Änderung des Interfaces neu erstellt werden müssen. Wie sehen die Signaturen deiner Interface Methoden aus. Benutzt du dort eigene Typen, sollten diese eventuell in ein Package.

Auch die VCL und jegliche TComponents vertragen sich nicht immer mit Interfaces, da ihr Lifecycle nicht über die Interface Referenzzählung gesteuert wird, sondern über den Owner. Das kann schnell zu AVs führen (TComponent wird über den Owner Mechanismus freigegeben, aber eine Interface Referenz auf diese Komponente ist noch irgendwo vorhanden).

Dass die Interface Referenzzählung nicht mehr greift, wenn man sich überkreuzende Referenzen hat (Parent/Child Relation z.B.), sollte man auch beachten.

Ich selber mag Interfaces sehr gerne, da sie einem ein gutes Stück eine Art GC vorgaukeln, aber man sollte über die Gefahren im Klaren sein und darüber dass in der Theorie immer alles ganz einfach gesagt ist "always code against interfaces" aber in der Praxis nicht immer realisierbar.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
neo4a

Registriert seit: 22. Jan 2007
Ort: Ingolstadt
362 Beiträge
 
Delphi XE2 Architect
 
#8

AW: Projekt auf Interfaces umstellen

  Alt 11. Apr 2012, 18:45
Auch die VCL und jegliche TComponents vertragen sich nicht immer mit Interfaces, da ihr Lifecycle nicht über die Interface Referenzzählung gesteuert wird, sondern über den Owner.
Das lässt sich relativ elegant umgehen, indem man genau 2 Dinge tut:
- Das fragliche TComponent wird von einem TInterfacedObject verwaltet.
- Unser TComponent bekommt als Owner NIL oder einen "Langläufer" z.B. TAplication.Mainform

Delphi-Quellcode:
type

IMyVCLComponent = interface
  procedure SetParent(aParent : TWinControl);
end;

TMyVCLComponentObject = class(TInterfacedObject, IMyVCLComponent )
private
  FMyVCLComponent : TComponent;
private // IMyVCLComponent
   procedure SetParent(aParent : TWinControl);
public
  constructor Create;
  destructor Destroy; override;
end;

implementation;

constructor TMyVCLComponentObject.Create;
begin
  FMyVCLComponent := TComponent.Create(nil);
end;
 
destructor TMyVCLComponentObject.Destroy;
begin
  FMyVCLComponent.Free;
  inherited;
end;

procedure TMyVCLComponentObject.SetParent(aParent : TWinControl);
begin
  FMyVCLComponent.Parent := aParent;
end;
Mit dieser Konstruktion lassen sich (VCL)-Komponenten auch leicht mittels Spring4D verwalten. Ein weiterer erwünschter Effekt ist die damit mögliche vollständige Entkopplung von Dritt-Units und/oder -Libs vom Hauptprogramm. Kein Licht ohne Schatten: Durch die erforderliche dynamische Erzeugung zur Laufzeit muss man auf den Delphi-Designer verzichten.

"always code against interfaces"
Aber allein durch den Versuch, sehen die Programme gleich ganz anders aus
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.045 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

AW: Projekt auf Interfaces umstellen

  Alt 12. Apr 2012, 07:32
Es ging um die Umstellung eines vorhandenen Programms auf Interfaces und nicht um den Start auf der "grünen Wiese" - und da lässt sich nicht alles mal so umsetzen.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  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 01:37 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