德尔福:良好格局/战略视图模型同步

有一个谈了很多关于模型 - 视图 - 控制器模型 - 视图 - 视图模型,模型 - 视图 - 演示等等这些天。

你怎么看作为与德尔福和非数据感知组件使用的最佳模式?

你通常如何实现它?

--------------解决方案-------------

您可以使用模型视图演示模式在他的被动视图变化。 前一段时间我写了一篇文章关于它。 http://www.danieleteti.it/?cat=18

您可以使用型号桂中介太(http://www.andypatterns.com/index.php/design_patterns/model_gui_mediator_pattern)

MVC的目的是去耦。 分离的系统显然更容易维护,而且可能更容易在第一时间制定。 你可以从根本上改变你的数据库设计,而不会影响你的GUI代码? 可以在您的图形用户界面完全改变,而不会影响太多你的数据库设计? 是数据的顺序GUI或基于表单的事件发生的独立数据库的一致性? 这是真正重要的问题,MVC是一种方法,回答了积极的这些问题。

我不是专家,但我已经烧毁,在过去这几件事情:

  1. 尝试把所有明确提及DB访问,和DB访问组件一个数据模块中。 这不要紧,如果你犯错太多datamodules的一面,但要注意不要把太多的非相关数据库访问的项目在同一个数据模块太大(相结合的代码比分离代码更容易)。
  2. 虽然它是连接所有的数据库组件达在设计时主要连接/会话组件非常方便(这样做是德尔福的优势之一),它也能明确地设置的connectionString,或会话非常有用,或连接引用在运行时动态,特别是当一个人想利用这些数据模块在不同的项目中,而无需添加在原有项目的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;

代替

// 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;

我目前正在读的Django的书,他们的MVC设计实在是令人印象深刻。 实现专用模型,视图或控制器的任何部分可以由不同的系统,而无需(显著)影响其他两个所取代。 毫无疑问,其他框架也有类似的做法,但我不能对这些评论。

IMHO在模型 - 视图 - 控制器模式控制器部分往往是一种开销由于这种应用的基于事件的性质Delphi应用程序。 模型和视图的分离工作,就像任何其他的编程语言。

我切换到C#和MVVM模型(WPF)。

笑话一边看在面向对象的设计论坛,Embarcadero的开始。

你可以看看tiOpf因为我看到他们有一些组件构建的图形用户界面。 还有InstantObjects,但我不知道,如果它仍然是发展。

与VCL组件的主要问题是,它不支持绑定到对象/列表。 因此该解决方案是使用一个虚拟数据集像EzSepcials和数据识别组件或使用非数据感知组件和写入介质的各个组件。 我应该提到虚拟树视图。

我认为,典型的MVC是不恰当的Delphi应用程序。 我已经看到,增加了这么多的样板代码,这是可怕的实现。 他们有更多的工作与自己,他们曾与他们试图解决的问题。

我已经写了MVC框架德尔福,但现在我只用它在我自己的项目。 我不觉得它的生产材料呢。 它是基于模型和浏览器,所述CONTROLER是两者之间唯一的连接组织。

该模型包含或处理业务逻辑和观众是严格的观察(GUI)。 这样的流动是这样的:

  1. 在查看有事(按钮点击)。
  2. 视图发送一个命令与相关联的数据到模型
  3. 该模型更改了业务数据,并准备新的数据视图
  4. 该视图是用新的数据(该视图中仅有一个特定部分)更新

我已经自动化这使得当命令是从视图调用,该模型中的相应的命令处理程序方法被自动调用。 当模型完成变更的视图进行更新。 如果存在对应于视图中的命令名称的方法,该方法被调用,否则一般“的UpdateView”方法被调用。 只有改变了数据传递和仅查看相关的部分进行更新。 如果有一个模型多个视图,所有的更新。 传递数据来回介质是XML作为现在,因为它是柔性的,所以没有问题,以通过任何种类的数据。 是的性能可能会受到在极端情况下,但总体的形式给出似乎工作。 我只是要清理干净,所以尽可能少的样板和开销可能。

也许,如果有兴趣,我可以在博客的解决方案,并清理了生产质量。

我不使用专门的MVC或其他方式,但是今天我做的(虽然我使用的数据同步的数据感知控件)是做事的那种方式:

  • 每个实体的形式( 一个非常松散的方式 “实体”,我指的是第一次出现时,用户点击菜单itens或按钮的形式)有自己的数据模块与数据组件。
    • 这些datamodules,在运行时,获取初始化应用程序连接(这是另一个数据模块 - 全球应用程序),并且初始化覆盖绑定到数据集上的设计时的连接
    • 所有的数据操作,并这样,留在datamodules。 该表格只做像DM.SearchCustomers(<conditions>)DM.SaveData() 表格不会做SQL,
    • 实体形式封装datamodules,所以主要应用程序接口仅仅通过连接的形式,并将其重新发送到DM。

      • 数据模块创建/销毁是实体形式的责任,所以正常情况下的DM所使用的形式作为所有者创建。
    • 数据源留在形式在90%的情况。

我有一个标准格式(和数据模块)的层次结构,所以大部分的时间简单的寄存器(如付款方式)形式都是用很少或根本没有代码。

德尔福缺乏(如上面说的)数据对象绑定和大多数控件或者是dataware或完全忽略它。

我看到有一些这方面的新举措。

斯特凡Glienke早在2011年12月写了关于MVVM博客文章和德尔福库称为DSharp。

现在看起来他们正试图实现一些类似Calibrun.Micro德尔福,这听上去很有意思。

分类:德尔福 时间:2015-03-15 人气:3
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.766 (s). 10 q(s)