Einzelnen Beitrag anzeigen

bernie110

Registriert seit: 13. Sep 2004
Ort: Uetersen
27 Beiträge
 
Delphi XE6 Professional
 
#1

Type-Anweisung im Implementation-Abschnitt vs. RegisterTypes in eigener Unit

  Alt 28. Jun 2018, 10:50
Delphi-Version: XE6
Hallo,
lt. diversen Programmiervorschlägen (u.a. von Nick Hodges) soll man ja Interfaces und Implementierungen trennen und möglichst auch in verschiedenen Units speichern. Das sieht dann so bei mir so aus:
Code:
unit uInterface;

interface
type
   IFoo = interface
      ['{BD3EC9DA-3E7A-4839-806E-0DCCA325991C}']
      procedure TuWas;
end;

implementation

end.
und:
Code:
unit uDeklaration;

interface

implementation
uses uInterface;
   type TFoo = class(TInterfacedObject, IFoo)
      procedure Tuwas;
   end;

{ TFoo }

procedure TFoo.Tuwas;
begin
   {... Mach was ...}
end;

end.

Die Registrierung im GlobalContainer hatte ich bisher im Initialization-Abschnitt vorgenommen. Da Stevie aber geschrieben hat (und in den Spring4d-Beispielen auch demonstriert hat):
Zitat:
Beitrag von Stevie in 2014: (https://www.delphipraxis.net/1246971-post14.html)
Noch'n Tip: Lagere das Register in eine extra Unit aus und mach das nicht im initialization Part der Unit mit der Klasse.
Dadurch erreichst du nämlich keineswegs eine Entkopplung sondern nur 1. Untestbarkeit deiner Klasse (dadurch, dass sie im Implementation Teil deiner Unit versteckt ist) und 2. indirekte Kopplung deiner Klasse auf den Container (dadurch, dass die Container Unit im Uses deiner Klassen Unit steht).
habe ich das auch so gemacht:
Code:
unit uRegistration;

interface

uses
   Spring.Container;

procedure RegisterTypes(const aContainer: TContainer);

implementation

uses
   uDeklaration;

procedure RegisterTypes(const aContainer: TContainer);
begin
   aContainer.RegisterType<TFoo>;      // <-- hier tritt ein Fehler auf
   aContainer.Build;
end;

end.
Da die Klasse TFoo nicht sichtbar ist, tritt hier ein Fehler auf!
Wenn ich aber die type-Anweisung in den Interface-Abschnitt verschiebe, gibt es keinen Fehler mehr.

Meine Frage:
Gibt es hier einen Konflikt zwischen 2 verschiedenen Programmierstilen ("Wo soll die type-Anweisung der Klasse stehen" vs. "Auslagerung der RegisterType-Anweisung in eine eigene Unit"), ist meine Annahme, dass die type-Anweisung im Implementation-Teil "versteckt" werden soll, damit die Klasse nicht im Projekt sichtbar ist, übertrieben oder übersehe ich eine Kleinigkeit?

Noch eine Frage am Rande:
Soll in der RegisterType-Anweisung der Zusatz ".Implements<IFoo>" hinzugefügt werden oder nicht?
Wird das Programm dadurch schneller, wenn der Zusatz hinzugefügt ist?

Gruß
Bernie

Geändert von bernie110 (28. Jun 2018 um 16:34 Uhr)
  Mit Zitat antworten Zitat