AGB  ·  Datenschutz  ·  Impressum  







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

TList<>.OnBefore?

Ein Thema von himitsu · begonnen am 23. Jan 2016 · letzter Beitrag vom 26. Jan 2016
Antwort Antwort
Seite 2 von 3     12 3      
TiGü

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

AW: TList<>.OnBefore?

  Alt 25. Jan 2016, 14:13
Alleine das Interface der TList<> ist knapp 400 Zeilen lang, mit unmassen an Methoden, die man fast alle Wrappen müsste...
Reden wir wirklich von System.Generics.Collections.TList<T>?
In Delphi Seattle geht die gesamte Klassendefinition von Zeile 340 bis Zeile 450.
Die öffentlichen Methoden von 369 bis 425 mit vielen Leerzeilen dazwischen, die fünf Propertys und ggf. der Enumerator kommen noch dazu.
Aber soooviel zu wrappen ist es auch nicht, wenn man unbedingt noch die Prüfung im Add, Insert und AddRange braucht.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: TList<>.OnBefore?

  Alt 25. Jan 2016, 14:33
Mit dem Helper und allem drum und dran geht es bei Zeile 20 los, aber OK, nur TList<> sind dennoch 100 Zeilen (330 bis 440)
Alleine der ListHelper von 70 bis 330 und die Events werden in jeder dessen Methode einzeln aufgerufen.
$2B or not $2B

Geändert von himitsu (25. Jan 2016 um 14:36 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.295 Beiträge
 
Delphi 12 Athens
 
#13

AW: TList<>.OnBefore?

  Alt 25. Jan 2016, 14:46
TList ist keine Komponente, sondern eine Klasse. Und so eine Klasse hat genau eine einzige Aufgabe: Implementierung einer Liste.
Wo wurde behauptet, daß TList eine Komponente ist?

Deine SW wäre mit TListen übersäht, wobei das OnBefore... ständig umgebogen würde. Hmmm....
Wiso? Eine virtuelle "DoBefore" wäre doch hilfreich. Wenn ich von TList<> eine Ableitung schreibe, dann muss ich diese virtuelle Methode einfach überschreiben und schon habe ich eine Klasse, die genau auf die Anforderung angepasst ist.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
TiGü

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

AW: TList<>.OnBefore?

  Alt 25. Jan 2016, 17:25
Muss man denn auch den ganzen ListHelper nachstellen?
Ich dachte eher an sowas:
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  System.Generics.Collections;

type
  THimiBeforeNotifyEvent<T> = reference to function(Sender: TObject; const Item: T): Boolean;

  THimiList<T> = class
  strict private
    FList: TList<T>;
    FOnBeforeNotify: THimiBeforeNotifyEvent<T>;
  public
    constructor Create;
    destructor Destroy; override;

    function Add(const Value: T): Integer; {$IFDEF Release} inline; {$ENDIF}
    property OnBeforeNotify: THimiBeforeNotifyEvent<T> read FOnBeforeNotify write FOnBeforeNotify;
  end;

constructor THimiList<T>.Create;
begin
  inherited;
  FList := TList<T>.Create;
end;

destructor THimiList<T>.Destroy;
begin
  FList.Free;
  inherited;
end;

function THimiList<T>.Add(const Value: T): Integer;
begin
  Result := 0;
  if Assigned(FOnBeforeNotify) then
  begin
    if FOnBeforeNotify(Self, Value) then
    begin
      Result := FList.Add(Value);
    end;
  end;
end;

procedure Main;
var
  HimiList: THimiList<Integer>;
begin
  HimiList := THimiList<Integer>.Create;
  HimiList.OnBeforeNotify := function(Sender: TObject; const Item: Integer): Boolean
    begin
      Result := (Item mod 2) = 0;
    end;
  try
    HimiList.Add(1);
    HimiList.Add(2);
    HimiList.Add(3);
    HimiList.Add(4);
  finally
    HimiList.Free;
  end;
end;

begin
  try
    Main;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

end.
Zugegeben, das wird bei Insert/AddRange() etwas fricklig, aber sonst?
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#15

AW: TList<>.OnBefore?

  Alt 25. Jan 2016, 19:38
TList ist keine Komponente, sondern eine Klasse. Und so eine Klasse hat genau eine einzige Aufgabe: Implementierung einer Liste.
Wo wurde behauptet, daß TList eine Komponente ist?
Muss denn irgendwo stehen, A ist ein B, um zu betonen, das A eben *kein* B ist? Komponenten haben Events ohne Ende, um das Verhalten zu modifizieren, kleine Klassen nicht.
Deine SW wäre mit TListen übersäht, wobei das OnBefore... ständig umgebogen würde. Hmmm....
Wieso? Eine virtuelle "DoBefore" wäre doch hilfreich. [/QUOTE] Klar und dann? Schreibe ich mir lauter Ableitungen (composition over inheritance).
Wenn ich eine Liste benötige, bei der ich kontrollieren muss, was rein darf und was nicht, schreibe ich mir eine entsprechende Klasse.
Die Liste (bzw. allgemein: eine Klasse) mit virtuellen Methoden zu überladen und damit komplex und schwerfällig zu machen, kann es doch nicht sein.
Denn es bliebe ja nicht beim OnBefore, sondern... OnAfter? OnDelete? OAfterDelete? etc. Was ist, wenn ich ein Listenelement einfach update und damit die Validierumg im 'OnBefore' aushebeln kann?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: TList<>.OnBefore?

  Alt 25. Jan 2016, 22:32
Zitat:
Delphi-Quellcode:
  TList<T> = class(TEnumerable<T>)
    function Add(const Value: T): Integer; inline;

    //procedure AddRange(const Values: array of T); overload;
    //procedure AddRange(const Collection: IEnumerable<T>); overload; inline;
    //procedure AddRange(const Collection: TEnumerable<T>); overload; inline;

    procedure Insert(Index: Integer; const Value: T); inline;

    procedure InsertRange(Index: Integer; const Values: array of T); overload;
    procedure InsertRange(Index: Integer; const Collection: IEnumerable<T>); overload;
    procedure InsertRange(Index: Integer; const Collection: TEnumerable<T>); overload;

    //function Remove(const Value: T): Integer; inline;
    function RemoveItem(const Value: T; Direction: TDirection): Integer; inline;
    procedure Delete(Index: Integer); inline;
    procedure DeleteRange(AIndex, ACount: Integer); inline;
    function ExtractItem(const Value: T; Direction: TDirection): T; inline;
    //function Extract(const Value: T): T; inline;

    procedure Exchange(Index1, Index2: Integer); inline;
    procedure Move(CurIndex, NewIndex: Integer); inline;

    procedure Clear; inline;

    property Capacity: Integer read GetCapacity write SetCapacity;
    property Count: Integer read FListHelper.FCount write SetCount;
    property Items[Index: Integer]: T read GetItem write SetItem; default;
    property List: arrayofT read FItems;
  end;
Alleine das müsste man in XE8 überschreiben verdecken und wer weiß was zukünftig noch dazu kommt.

Man hat nur Add erweitert (siehe oben), dann benutzt wer Insert und schon war es das.
Selbt List ist geil, da dynamische Arrays ein (defektes) Speichermanagement besitzen und dieses Property somit nicht ReadOnly ist.
$2B or not $2B

Geändert von himitsu (25. Jan 2016 um 22:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#17

AW: TList<>.OnBefore?

  Alt 25. Jan 2016, 23:00
Jetzt weißt du auch warum Composition und nicht Inheritence
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#18

AW: TList<>.OnBefore?

  Alt 26. Jan 2016, 07:32
Wieso gibt es eigentlich kein IList<T> ? Das ist doch eigentlich die Grundvoraussetzung für die erfolgreiche Verwendung bzw. nachträglichen Einsatz eines Composite? Kein Wunder, das so viele Delphianer immer noch auf Ableitungen setzen, man wird ja förmlich dazu gezwungen.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#19

AW: TList<>.OnBefore?

  Alt 26. Jan 2016, 10:16
Eben darüber habe ich mich in den ersten Delphi-Tagen auch gewundert. Nicht nur ich, sondern da wundern sich bis heute glaube ich eine Menge Leute drüber.

Man muss sich dann eben nicht an das mitgelieferte, sondern irgendein 3rd Party Framework für IEnumerable<T> <-- IList<T> usw. verwenden.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: TList<>.OnBefore?

  Alt 26. Jan 2016, 10:43
Warum?
Weil sich Generics und Interfaces nicht sonderlich doll mögen.


Composition: Aber dann beschneide ich doch den Endbenutzer, außer ich kaufe mir jedes Jahr das neue Bugfix (Delphi) und erweitere mühsam den Code, der eigentlich aus nur einer überschriebenen Methode (oder Event) bestanden hätte.
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 17:48 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