Principios
Los cuatro principios fundamentales de la programación orientada a objetos son: encapsulación, herencia, polimorfismo y abstracción. No voy a comentar cada uno de ellos porque sería redundante. Ya hay mucha información al respecto en Internet.Desacoplamiento
A estos cuatro principios le agregaría uno: desacoplamiento. Y la mejor forma de conseguirlo en nuestro código fuente es mediante el uso de interfaces para evitar hacer referencias directas entre clases (y entre las unidades en las que se implementan esas clases)Ejemplo
Supongamos que tenemos un Form y un DataModule, es decir, una parte visual y una parte con datos. En el Form tenemos un DataSource que deberíamos enlazar con un DataSet del DataModule. Lo habitual es agregar la unidad del DataModule a la cláusula uses de la unidad del Form y enlazar el DataSource del Form con el DataSet del DataModule. Pero así estaríamos haciendo una referencia directa entre ambas clases, la del Form y la del DataModule, algo que sería mejor evitar.¿Cómo lo evitamos?
Mediante el uso de interfaces.
El primer paso es declarar la interface en su propia unidad.
unit UMiDataModuleIntf;
...
IMiDataModule = interface(IInterface)
function GetDataSet(const aNombre: string): TDataSet;
end;
El segundo paso es implementar la interface en la clase del DataModule.
unit DMMiDataModule;
...
TdtmdlMiDataModule = class(TDataModule, IMiDataModule) { IMiDataModule }
protected
function GetDataSet(const aNombre: string): TDataSet;
{ IMiDataModule }end;
...
function TdtmdlMiDataModule.GetDataSet(const aNombre: string): TDataSet;
begin
Result := nil;
if SameText(aNombre, 'cdsMiDS') then
Result := MiDS;
end;
Aquí asumo que en el DataModule "MiDataModule" hay un DataSet (por ejemplo, un ClientDataSet) llamado "cdsMiDS".
El tercer paso es registrar la clase del DataModule de alguna forma que nos permita evitar una referencia directa. Para simplificar y sólo con fines didácticos, usaré una unidad con una variable pública.
unit UMiDataModuleClss;
...
var
oMiDataModuleClass: TComponentClass = nil;
Y en la sección Initialization de la unidad del DataModule registramos la clase.
unit DMMiDataModule;
...
uses
UMiDataModuleClss;
...
initialization
oMiDataModuleClass := TdtmdlMiDataModule;
El cuarto y último paso es crear una instancia del DataModule en la unidad del Form para obtener el DataSet.
unit FMiForm;
...
uses
UMiDataModuleClss, UMiDataModuleIntf;
...
procedure TfrmMiForm.OnCreate(Sender: TObject);
begin
FMiDataModule := oMiDataModuleClass.Create(Self);
dtsrcMiDS.DataSet := (FMiDataModule as IMiDataModule).GetDataSet('cdsMiDS');
end;
Esta implementación nos permite cambiar la unidad del DataModule sin tener que tocar nada del resto del código fuente porque el DataModule está totalmente desacoplado del Form. El único requisito es que la clase del DataModule debe implementar la interface IMiDataModule.
Descargar proyecto Delphi 2010
No hay comentarios:
Publicar un comentario