AGB  ·  Datenschutz  ·  Impressum  







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

Readonly interface erzeugen (MMX?)

Ein Thema von freimatz · begonnen am 5. Jan 2022 · letzter Beitrag vom 5. Jan 2022
Antwort Antwort
Seite 1 von 2  1 2      
freimatz

Registriert seit: 20. Mai 2010
1.456 Beiträge
 
Delphi 11 Alexandria
 
#1

Readonly interface erzeugen (MMX?)

  Alt 5. Jan 2022, 07:38
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?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#2

AW: Readonly interface erzeugen (MMX?)

  Alt 5. Jan 2022, 10:06
Kannst du mal den aktuellen und gewünschten Vorgang in einem Beispiel beschreiben?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Readonly interface erzeugen (MMX?)

  Alt 5. Jan 2022, 10:22
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.
$2B or not $2B
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.456 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Readonly interface erzeugen (MMX?)

  Alt 5. Jan 2022, 14:11
@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.

Geändert von freimatz ( 5. Jan 2022 um 14:18 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#5

AW: Readonly interface erzeugen (MMX?)

  Alt 5. Jan 2022, 14:26
Was genau ist jetzt die Schwierigkeit mit der Erstellung dieser beiden Interfaces? (Mir ist einfach noch nicht klar, was genau dein Problem ist.)
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#6

AW: Readonly interface erzeugen (MMX?)

  Alt 5. Jan 2022, 14:31
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.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Readonly interface erzeugen (MMX?)

  Alt 5. Jan 2022, 15:05
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.116 Beiträge
 
Delphi 12 Athens
 
#8

AW: Readonly interface erzeugen (MMX?)

  Alt 5. Jan 2022, 15:24
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#9

AW: Readonly interface erzeugen (MMX?)

  Alt 5. Jan 2022, 16:04
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.456 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Readonly interface erzeugen (MMX?)

  Alt 5. Jan 2022, 16:06
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 00:27 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