Einzelnen Beitrag anzeigen

Rollo62

Registriert seit: 15. Mär 2007
3.937 Beiträge
 
Delphi 12 Athens
 
#19

AW: Optimaler Hash-Algorithmus und Strategie für Dateivergleiche, Verzeichnisbaum

  Alt 6. Mai 2024, 07:50
Danke sehr für die Mühe.
Ich habe mal ein bischen darüber nachgedacht wellche Pattern in Frage kämen und habe hier ein grobes Konzept, was hoffentlich das was ich möchte gut abbildet.
Die spezifischen Adapter erzeugen die Hashes systemabhängig und geben diese an den zentralen Controller weiter.

Delphi-Quellcode:
program PathManagement;

{$APPTYPE CONSOLE}

uses
  System.SysUtils, System.Generics.Collections;

type
  IPathInterface = interface
    function GetFormattedPath: string;
  end;

  TPathController = class
  private
    FAdapters: TList<IPathInterface>;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Attach(Adapter: IPathInterface);
    procedure NotifyAdapters;
  end;

  TPathAdapter = class(TInterfacedObject, IPathInterface)
  protected
    FController: TPathController;
    FPath: string; // Jeder Adapter verwaltet nun seinen eigenen Pfad
  public
    constructor Create(Controller: TPathController; const Path: string);
    function GetFormattedPath: string; virtual; abstract;
  end;

  TPathAdapter_Windows = class(TPathAdapter)
  public
    function GetFormattedPath: string; override;
  end;

  TPathAdapter_Unix = class(TPathAdapter)
  public
    function GetFormattedPath: string; override;
  end;

{ TPathController Implementation }
constructor TPathController.Create;
begin
  inherited Create;
  FAdapters := TList<IPathInterface>.Create;
end;

destructor TPathController.Destroy;
begin
  FAdapters.Free;
  inherited Destroy;
end;

procedure TPathController.Attach(Adapter: IPathInterface);
begin
  FAdapters.Add(Adapter);
end;

procedure TPathController.NotifyAdapters;
var
  Adapter: IPathInterface;
begin
  for Adapter in FAdapters do
    WriteLn(Adapter.GetFormattedPath);
end;

{ TPathAdapter Implementation }
constructor TPathAdapter.Create(Controller: TPathController; const Path: string);
begin
  inherited Create;
  FController := Controller;
  FPath := Path;
  FController.Attach(Self);
end;

{ TPathAdapter_Windows Implementation }
function TPathAdapter_Windows.GetFormattedPath: string;
begin
  //! Nur als Beispiel womrum es geht, genau solche unnötigen Umkopierungen möchte ich durch Baum-Auflösung im PathController Vermeiden
  Result := StringReplace(FPath, '/', '\', [rfReplaceAll]);
end;

{ TPathAdapter_Unix Implementation }
function TPathAdapter_Unix.GetFormattedPath: string;
begin
  //! Nur als Beispiel womrum es geht, genau solche unnötigen Umkopierungen möchte ich durch Baum-Auflösung im PathController Vermeiden
  Result := StringReplace(FPath, '\', '/', [rfReplaceAll]);
end;

var
  Controller: TPathController;
  WinAdapter, UnixAdapter: IPathInterface;
begin
  try
    Controller := TPathController.Create;
    WinAdapter := TPathAdapter_Windows.Create(Controller, 'C:\Users\Example\LocalDocuments'); // hier hinter sollten sich die identischen Dokumente befinden
    UnixAdapter := TPathAdapter_Unix.Create(Controller, 'FTP://mytest.com/remote/Documents'); //

    Controller.NotifyAdapters; // Kann verschiedene Lokations-übergreifende Aktionen anstossen

    ReadLn;
  finally
    Controller.Free;
  end;
end.
Alle Funktionalität um die verschiedenen Lokationen abzubilden, synchron zu halten bzw. separat zu bearbeiten wäre zentral in dem PathController gekapselt.
Alle Zugriffe, aus Sicht einer einzelnen Lokation wären in den PathAdaptern und deren PathInterface gekapselt.

Damit komme ich glaube ich weiter.
Ich werde zuerst mal versuchen in dem PathControll mit einem TFdMemTable zu arbeiten, wenn das nicht reicht, dann kann ich immer noch auf Bäume und sonstiges umsteigen.

Vielen Dank erstmal an alle.

Geändert von Rollo62 ( 6. Mai 2024 um 12:22 Uhr)
  Mit Zitat antworten Zitat