Newsgroup: it.comp.lang.delphi
Titolo: strati OOP

Normalmente ogni form si lega ad un Datamodule, tramite uses;
vorrei trovare un modo di slegare totalmente il form dal Datamodule, 
inserendo un strato intermedio tra i due composto da Interface
dove Form e datamodule non siamno in collegamento tra loro
 
questa la nuova idea
-> <Form>
!
-> <modulo Inrterface> con classi
!
<datamodule>
 
invece della la classica
-> <Form>
!
-> <datamodule>
 
certamente si perderanno i rifermenti a design time, ma sarebbe comodo 
avere questa separazione per gestioni diverse o di DB o con Webservices
 
Qualche spunto degli argomenti da inziare a cercare ?

Se usi clientdataset e datasetprovider puoi comunque astrarre il modo in cui i dati vengono recuperati e forniti ai cds (anche mediante REST). Non ti serve creare uno strato intermedio, che vedo molto problematico da gestire. Il punto di forza di Delphi sono proprio i collegamenti a design time.


Non uso dbexpress, ma FireDac, con Rest (per Client/Server) dovrei 
inserire qualcosa sul server e non è detto sia possibile farlo.
invece fattibile per Web come da documentazione
http://docwiki.embarcadero.com/RADStudio/Seattle/en/Tutorial:_Using_a_REST_DataSnap_Server_with_an_Application_and_FireDAC
 
 
piccola divagazione .... ma in tema
 
A livello C/S trovo poco diverso (utile ?) usare Interface o 
collegamento diretto
 
Se unit2 usa un DatoModule1 per MySql e DataModule2 per MsSql, alla fine 
unit1 dovrà sempre fare riferimento a unit2 per accedere ai DataModule.
 
Mi sfugge proprio l'uso pratico delle Interface, dato che poi le 
procedure/funzioni dichiarate andranno implementate sempre nella unit2
 
trovo la classe TMenuOperation e relative procedure, che potrei evitare, 
implemetamdole nella classe TMenuOper
 
che dite sono fuori di testa (da rottamare come diceva qualcuno ....) ?
se non vedo la reale utilità di una cosa faccio fatica a metterla in 
pratica.
 
 
//----------------
unit Unit3;
 
interface
 
type IMenuOperation = Interface
   ['{5D216A1D-C5CC-4BB8-B125-AC19C1141273}']
   function LoadLanguage: boolean;
   procedure LoadVociSrv(bState: boolean);
 
   property LoadLg: boolean read LoadLanguage write LoadVociSrv;
End;
 
//----------------
unit Unit2;
 
interface
 
uses unit3;
 
type
   TMenuOperation = class(TInterfacedObject, IMenuOperation)
 
   private
     FLoadLg: boolean;
 
     function LoadLanguage: boolean;
     procedure LoadVociSrv(bState: boolean);
 
   public
 
   published
     property LoadLg: boolean read LoadLanguage;
 
end;
 
Type TMenuSet = class
  private
   clMenu : IMenuOperation;
 
  public
   procedure Load;
 
end;
 
implementation
 
{ TMenuOperation }
 
function TMenuOperation.LoadLanguage: boolean;
begin
//
end;
 
procedure TMenuOperation.LoadVociSrv(bState:boolean);
begin
//
end;
 
{ TMenuSet }
 
procedure TMenuSet.Load;
begin
   if not Assigned(clMenu) then clMenu := TMenuOperation.Create;
   clMenu.LoadLg;
end;
 
end.
 
//-----------------
unit Unit1;
 
interface
 
uses
   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, 
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
   unit2;
 
type
   TForm1 = class(TForm)
     procedure FormShow(Sender: TObject);
   private
     { Private declarations }
     clMenuOperation: TMenuSet;
   public
     { Public declarations }
   end;
 
var
   Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.FormShow(Sender: TObject);
begin
   clMenuOperation := TMenuSet.Create;
   clMenuOperation.Load;
end;
 
end.

Non uso dbexpress, ma FireDac, con Rest (per Client/Server) dovrei
inserire qualcosa sul server e non è detto sia possibile farlo.
 
In che senso? 
 
Le "interface" non sono altro che dichiarazioni di contratti che servono ad estrarre le dipendenze tra classi e renderle piu` versatili (un'interfaccia puo` essere implementata da classi che non appartengono necessariamente alla stessa gerarchia). 
 
Il modo in cui sono implementate in Delphi e` semplicemente orribile, portandosi dietro inutili retaggi di COM - come le GUID. 
 
Io capisco che tu voglia separare i due strati form/datamodule, e la ritengo anche un'idea ingegneristicamente nobile, ma mi sembra possa finire per complicare notevolmente la manutenzione del tuo software. 
 
La dipendenza da database diversi si implementa puntando a driver distinti, ma usando gli stessi componenti per leggere/scrivere i dati.