AGB  ·  Datenschutz  ·  Impressum  







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

Class Helper for Interface

Ein Thema von himitsu · begonnen am 16. Feb 2015 · letzter Beitrag vom 18. Feb 2015
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

Class Helper for Interface

  Alt 16. Feb 2015, 22:20
Delphi-Version: XE7
Man kann doch Class/Record Helper nun an "alles" dran hängen?

Warum nicht auch an Interfaces?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: Class Helper for Interface

  Alt 16. Feb 2015, 22:37
Weil Embarcadero einfach zu be... ach, lassen wir das, sonst reg ich mich nur wieder auf...
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#3

AW: Class Helper for Interface

  Alt 17. Feb 2015, 07:16
Class Helper sind doch dazu gedacht, eine Klasse nachträglich etwas zu pimpen.
Interfaces sind Verträge.

Wieso sollte ich Verträge nachträglich noch aufbohren wollen. Dann passt das doch nicht mehr.

Wo ist mein Denkfehler?
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: Class Helper for Interface

  Alt 17. Feb 2015, 07:22
Berühmtestes Beispiel: IEnumerable<T>

Eigentlich müsste dieses Interface nur so aussehen:

Delphi-Quellcode:
type
  IEnumerable<T> = interface
    function GetEnumerator: IEnumerator<T>
  end;
Und über Extension Methodseinen interface helper kann man nun alle möglichen Operationen, die auf GetEnumerator operieren, implementieren.
Das ermöglicht einem eine Verkettung dieser Operationen -> syntax Sugar.

Anderes Beispiel:

Delphi-Quellcode:
type
  ILogger = interface
    procedure WriteLogEntry(const entry: TLogEntry);
  end;
Simples Interface, wenn man neue Logger bauen will, muss man nur eine Methode implementieren -> gut!

Aber den Logger zu benutzen ist nun eher umständlich, denn es mag nun verschiedene Eigenschaften in TLogEntry geben, die ich immer befüllen muss.
Also würde sich so ein Interface helper anbieten:

Delphi-Quellcode:
type
  ILoggerHelper = interface helper for ILogger
    procedure LogValue<T>(const value: T)
    procedure EnterMethod(const methodName: string);
    procedure LeaveMethod(const methodName: string);
  end;
In diesen Methoden wird nun nix anderes gemacht als die Information in ein TLogEntry gepackt und dann an die WriteLogEntry Methode übergeben.
D.h. ich kann die Funktionalität des Interfaces erweitern, ohne den Vertrag zu verletzen und ohne weitere Kopplung für den Implementierenden zu erzeugen.

Im Grunde sind so helper Methoden nix anderes als das:

procedure Methode(Self: <gehelpter type>; args) Aber ein:
Delphi-Quellcode:
logger.EnterMethod('foo');

// liest sich einfach besser als:

EnterMethod(logger, 'foo');
Und umso mehr, wenn ich solche Methoden verketten kann (ja, das geht mit Spring4D aber auch nur, weil die ganzen Methoden auf IEnumerable<T> sitzen und somit dem Implementierer aufgezwungen werden, obwohl sie nur auf GetEnumerator aufsetzen -> fette Klassen):
Delphi-Quellcode:
for c in customers.Where(...).Ordered.Take(10) do
  // mach was
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (17. Feb 2015 um 07:38 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.062 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Class Helper for Interface

  Alt 17. Feb 2015, 07:51
Aber warum nicht einfach ILoggerHelper = interface(ILogger) ?
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: Class Helper for Interface

  Alt 17. Feb 2015, 07:55
Aber warum nicht einfach ILoggerHelper = interface(ILogger) ?
Und, wie bekomm ich dann die Methoden von ILoggerHelper aufgerufen, wenn ich nur ILogger implementiere?
Ja, Dekorator bauen, etc... aber darum gehts nicht.

Außerdem könnte ich, wären die helper vernünftig implementiert auch mehrere gleichzeitig aktiv haben, mach das mal mit Vererbung

Eine mögliche Syntax die ich mir auch vorstellen könnte wäre sowas (woher ich das wohl habe...):

Code:
procedure EnterMethod(extends logger: ILogger; const methodName: string);
Und die kann man dann so aufrufen:

Code:
logger.EnterMethod('foo')
Simpler Syntaxzucker also. Und wenn ich das gerade richtig überblicke dürften dort auch alle Regeln von normalen Routinen (sprich, welche Methode ist im Scope, Overload resolution etc) greifen.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (17. Feb 2015 um 08:02 Uhr)
  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 15:15 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