Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Readonly interface erzeugen (MMX?) (https://www.delphipraxis.net/209648-readonly-interface-erzeugen-mmx.html)

freimatz 5. Jan 2022 06:38

Readonly interface erzeugen (MMX?)
 
Hallo,
ich habe hier ein interface für eine Datenklasse. Nun hätte ich gere ein weiteres interface das gleich ist, nur dass es keine Setter gibt. Es soll sicherstellen, dass man die Daten nur liest aber nicht (leichfertig) ändert. (Abgesehen von Referenzen auf weitere Objekte.)
Das Erzeugen ist z.B. mit MMX ja leidlich einfach zu machen. Wenn man während der Entwicklung immer wieder das Ausgangsinterface anpasst, ist das etwas mühsam. Gibt es da eine einfache Möglichkeit die ich übersehen habe?

Uwe Raabe 5. Jan 2022 09:06

AW: Readonly interface erzeugen (MMX?)
 
Kannst du mal den aktuellen und gewünschten Vorgang in einem Beispiel beschreiben?

himitsu 5. Jan 2022 09:22

AW: Readonly interface erzeugen (MMX?)
 
Genau falsch rum. (Vererbung: Dinge hinzufügen, aber nicht entfernen)

Das Readonly bauen, dann davon ableiten und das Schreiben hinzufügen.


Bei IInterfaces ist es aber kein Problem, dort zwei Interfaces zu bauen, die nicht voneinander abgeleitet sind. (aber auch da ist es möglich)
Allerdings, wenn das RW-Interface öffentlich bekannt ist (über GetInterface/GetInterfaceEntry/GetInterfaceTable abrufbar), dann ließe sich das Interface auch abfragen/tauschen.

freimatz 5. Jan 2022 13:11

AW: Readonly interface erzeugen (MMX?)
 
@Uwe: So ähnlich wie bei Spring die IList und IReadOnlyList.

Delphi-Quellcode:
type
  IData = interface
    ['{E9154DD9-A28E-4703-9DD8-5181A27869E2}']
    function GetActualValue(const p_Component: Byte): double;
    function GetCurrentActual(): IActualValue;
    function GetDefaultBehaviourMode(): String;
    procedure SetActualValue(
      const p_Component: Byte;
      const p_Value   : double);
    procedure SetCurrentActual(const p_Value: IActualValue);
    procedure SetDefaultBehaviourMode(const p_Value: String);

    property DefaultBehaviourMode: String read GetDefaultBehaviourMode write SetDefaultBehaviourMode;
    property CurrentActual: IActualValue read GetCurrentActual write SetCurrentActual;
    property ActualValue[const p_Component: Byte]: double read GetActualValue write SetActualValue;
  end;

  IReadOnlyData = interface
    ['{7F08C18E-0E6A-40F1-9DD9-AFDDA473FB8B}']
    function GetActualValue(const p_Component: Byte): double;
    function GetCurrentActual(): IActualValue;
    function GetDefaultBehaviourMode(): String;
    property DefaultBehaviourMode: String read GetDefaultBehaviourMode;
    property CurrentActual: IActualValue read GetCurrentActual;
    property ActualValue[const p_Component: Byte]: double read GetActualValue;
  end;
Nur als Beispiel. Was ich konkret jetzt habe ich ist eine Hierarchie mit 17 interfaces und 57 Properties. (Ergebnis des Versuches ein Berg von technischen Schulden zu erklimmen :-))

@himitsu: sehe jetzt nicht wie es damit weniger mühsam wird.

Uwe Raabe 5. Jan 2022 13:26

AW: Readonly interface erzeugen (MMX?)
 
Was genau ist jetzt die Schwierigkeit mit der Erstellung dieser beiden Interfaces? (Mir ist einfach noch nicht klar, was genau dein Problem ist.)

Blup 5. Jan 2022 13:31

AW: Readonly interface erzeugen (MMX?)
 
Delphi-Quellcode:
type
  IReadOnlyData = interface
    ['{7F08C18E-0E6A-40F1-9DD9-AFDDA473FB8B}']
    function GetActualValue(const p_Component: Byte): double;

    property ActualValue[const p_Component: Byte]: double read GetActualValue;
  end;
 
 IData = interface(IReadOnlyData)
    ['{E9154DD9-A28E-4703-9DD8-5181A27869E2}']
    procedure SetActualValue(const p_Component: Byte; const p_Value : double);

    property ActualValue[const p_Component: Byte]: double read GetActualValue write SetActualValue;
  end;
In diesem Fall kann man durch Vererbung nur die Declaration der Getter sparen.
Wenn ein Object IData unterstützt, sollte auch immer IReadOnlyData mit angegeben werden.
Sonst wird IReadOnlyData bei der direkten Abfrage nicht gefunden.

jaenicke 5. Jan 2022 14:05

AW: Readonly interface erzeugen (MMX?)
 
Ich würde das viel einfacher machen:
Delphi-Quellcode:
type
  IData = interface
    ['{E9154DD9-A28E-4703-9DD8-5181A27869E2}']
    procedure SetActualValue(const p_Component: Byte; const p_Value : double);
    procedure SetCurrentActual(const p_Value: IActualValue);
    procedure SetDefaultBehaviourMode(const p_Value: String);
  end;

  IReadOnlyData = interface
    ['{7F08C18E-0E6A-40F1-9DD9-AFDDA473FB8B}']
    function GetActualValue(const p_Component: Byte): double;
    function GetCurrentActual(): IActualValue;
    function GetDefaultBehaviourMode(): String;
    property DefaultBehaviourMode: String read GetDefaultBehaviourMode;
    property CurrentActual: IActualValue read GetCurrentActual;
    property ActualValue[const p_Component: Byte]: double read GetActualValue;
  end;
Wer sich zum Schreiben extra das entsprechende Interface holen kann, kann auch einfach die Setter verwenden. Dann sieht man auch direkt, dass da geschrieben wird. Dann gibt es auch keine doppelten Deklarationen der Properties usw. und da die Properties in Interfaces auch nur syntaktischer Zucker sind, muss man die noch nicht einmal in der implementierenden Klasse deklarieren.

Dadurch ist der Anpassungsaufwand relativ niedrig.

Rollo62 5. Jan 2022 14:24

AW: Readonly interface erzeugen (MMX?)
 
Delphi-Quellcode:
type
  IReadOnlyData = interface
    ['{7F08C18E-0E6A-40F1-9DD9-AFDDA473FB8B}']
    function GetActualValue(const p_Component: Byte): double;
    function GetCurrentActual(): IActualValue;
    function GetDefaultBehaviourMode(): String;
    property DefaultBehaviourMode: String read GetDefaultBehaviourMode;
    property CurrentActual: IActualValue read GetCurrentActual;
    property ActualValue[const p_Component: Byte]: double read GetActualValue;

  IData = interface( IReadOnlyData )
    ['{E9154DD9-A28E-4703-9DD8-5181A27869E2}']
    procedure SetActualValue(const p_Component: Byte; const p_Value : double);
    procedure SetCurrentActual(const p_Value: IActualValue);
    procedure SetDefaultBehaviourMode(const p_Value: String);

    property DefaultBehaviourMode: String read GetDefaultBehaviourMode write SetDefaultBehaviourMode;
    property CurrentActual: IActualValue read GetCurrentActual write SetCurrentActual;
    property ActualValue[const p_Component: Byte]: double read GetActualValue write SetActualValue;

  end;
Wäre das noch eine Alternative, mit Ableitung der Interfaces ?
Sonst ist das IData nur um Schreiben, das wäre nicht so ideal, allerdings sind abgeleitete interfaces auch nicht so toll.

Uwe Raabe 5. Jan 2022 15:04

AW: Readonly interface erzeugen (MMX?)
 
Zitat:

Zitat von jaenicke (Beitrag 1500114)
Ich würde das viel einfacher machen:
Delphi-Quellcode:
type
  IData = interface
    ['{E9154DD9-A28E-4703-9DD8-5181A27869E2}']
    procedure SetActualValue(const p_Component: Byte; const p_Value : double);
    procedure SetCurrentActual(const p_Value: IActualValue);
    procedure SetDefaultBehaviourMode(const p_Value: String);
  end;

Hier würde ich es als Nachteil empfinden, dass ich immer mit zwei Interfaces arbeiten muss, während ich im Original und bei dem inherited Ansatz immer mit einem auskomme: entweder IReadOnlyData für nur Lesen oder IData für Lesen und Schreiben.

freimatz 5. Jan 2022 15:06

AW: Readonly interface erzeugen (MMX?)
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1500111)
Was genau ist jetzt die Schwierigkeit mit der Erstellung dieser beiden Interfaces? (Mir ist einfach noch nicht klar, was genau dein Problem ist.)

Es ist KEIN Problem. Ich schrieb es ist "etwas mühsam". Das ist wenn man das öfters macht.
Hatte gedacht vielleicht gibt es da etwas schon. Scheint wohl nicht so zu sein.
Als Wunsch für MMX ist wohl auch zu aufwendig.
Danke für alle Rückmeldungen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:03 Uhr.
Seite 1 von 2  1 2      

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