代码之家  ›  专栏  ›  技术社区  ›  UnDiUdin

Delphi重构示例,涉及数据感知控件和直接访问DB表的数据模块

  •  7
  • UnDiUdin  · 技术社区  · 14 年前

    我正在试图定义重构我正在处理的项目的最佳方法。

    由于缺乏良好的设计,几乎所有项目都由以下部分组成:

    1)包含业务逻辑的表单

    2)大型数据模块(每个表单1个+一些额外的模块)

    3)一些包含公共代码(库)的单元

    没有OOP(除了一些小区域),代码重用处于最低级别。

    还有一个问题是使用了数据感知控件,因此在数据模块上删除许多数据集+数据源并以高度耦合的方式直接链接到数据库非常简单。

    理想情况下,我希望提取类,如tcustomer、temployee,以获得操作系统封装的优势,并使将来在不复制所有代码的情况下创建新的UI成为可能。

    不管怎样,我的问题是:如何才能继续处理数据感知控件?我应该实现一个返回数据集的函数,并将dataawarecomponent.datasource链接到函数结果吗?

    function TCustomer.LoadByID(aCustomerID: integer): TDataset
    

    ?

    2 回复  |  直到 13 年前
        1
  •  9
  •   Kenneth Cochran    14 年前

    Supervising Controller

    Passive View

    IProductView = interface
    end;
    

    TProductForm = class(TForm, IProductView)
    ...
    end;
    

    TProductPresenter = class
    private
      FView: IProductView;
    public
      constructor Create(AView:IProductView);
    end;
    

    TProductForm = class(TForm, IProductView)
    private
      FPresenter: TProductPresenter;
    public
      constructor Create;
    ...
    end;
    
    implementation
    TProductForm.Create
    begin
      FPresenter := TProductPresenter.Create(self);
    end;
    

    TProductForm.NameDBEditChange(Sender: TObject);
    begin
      FPresenter.ValidateName;
    end;
    

    IProductView = interface
      function GetName:string;
      procedure SetName(Value: string);
      property Name: string read GetName write SetName;
    

    GetName SetName

    TProductForm.GetName: string;
    begin
      Result := NameDBEdit.Text;
    end;
    
    TProductForm.SetName(Value: string);
    begin
      NameDBEdit.Text := Value;
    end;
    

        2
  •  1
  •   Wim ten Brink    14 年前


    推荐文章