Delphi:视图< - >模型同步的良好模式/策略

Veg*_*gar 13 delphi design-patterns model view

这些天有很多关于模型 - 视图 - 控制器,模型 - 视图 - 视图模型,模型 - 视图 - 演示器等的讨论.

您认为与delphi和非数据感知组件一起使用的最佳模式是什么?

你通常如何实现它?

Dan*_*eti 12

您可以在其被动视图变体中使用"模型视图展示器"模式.前段时间我写了一篇关于它的帖子. http://www.danieleteti.it/?cat=18

您也可以使用Model Gui Mediator(http://www.andypatterns.com/index.php/design_patterns/model_gui_mediator_pattern)


Cal*_*ngh 6

MVC的目的是解耦.解耦系统显然更容易维护,并且首先可以说更容易开发.您是否可以在不影响GUI代码的情况下从根本上改变数据库设计?您的GUI可以完全更改而不会对数据库设计造成太大影响吗?数据库中数据的一致性是否与GUI或基于表单的事件发生的顺序无关?这些是真正重要的问题,MVC是一种积极回答这些问题的方法.

我不是专家,但过去我被这几件事焚烧过:

  1. 尝试将所有显式引用放在数据模块内的数据库访问和数据库访问组件中.如果你错误地站在太多数据模块的一边并不重要,但要注意不要在同一个数据模块中放置太多不相关的DB访问项(组合代码比分离代码容易得多).

  2. 虽然在设计时将所有数据库组件连接到主连接/会话组件非常方便(并且这样做是Delphi的优势之一),但是能够显式设置connectionString或session,这也非常有用.或者在运行时动态连接引用,特别是当想要在不同项目中使用数据模块时,无需添加原始项目的DB连接单元(如果存在).

  3. 尽最大努力将尽可能少的业务逻辑放入组件事件中.这是不使用数据感知组件的自然扩展.很难保持这一点,因为这样做似乎总是做额外的工作,特别是在新项目中,你告诉自己你以后只会重构; 当然,你知道这是谎言,因为后来永远不会来.

第(3)点可能需要一个例子.有一个巨大的在以下两个片段之间的清晰性和可维护性差,虽然它可能不是很明显,当一个孤立看着它们,如下:

// "LoadEntries" is (loosely) analogous to the "C" in MVC. 
// What happens /inside/ LoadEntries is the Model, 
// and button interaction is part of View functionality.  
// MyList may also be viewable on screen as part of
// the View.
procedure TForm.Button1Click(Sender: TObject);
begin
  MyDataModule.LoadEntriesIntoMyList(MyList); // LoadEntries is the "C" in MVC
end;
Run Code Online (Sandbox Code Playgroud)

代替

// The "controller" is missing.  That omission of the essential 
// decoupling mechanism between the model and the view will 
// cost you or your company lots of money!
procedure TForm.Button1Click(Sender: TObject);
begin
  MyList.Clear;
  MyDataModule.qMyData.Open;
  while not MyDataModule.qMyData.Eof do
  begin
    NewItem := MyList.AddNewItem();
    NewItem.Blah := MyDataModule.qMyData.Fields['Field1'].Value;
    ...
    MyDataModule.qMyData.Next;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

我目前正在阅读django书,他们的MVC设计真的令人印象深刻.特定于实现的模型,视图或控制器的任何部分都可以由不同的系统替换,而不会(显着地)影响其他两个系统.毫无疑问,其他框架也有类似的方法,但我不能对这些方法发表评论.