eMVC讨论帖 聊聊也赚分:) ( 积分: 100 )

  • 主题发起人 主题发起人 VictorWoo
  • 开始时间 开始时间
V

VictorWoo

Unregistered / Unconfirmed
GUEST, unregistred user!
先起个话题:
eMVC 文档: http://www.eazisoft.com/products/emvc/emvcdg.htm
eMVC 最新1.03下载: http://jaist.dl.sourceforge.net/sourceforge/emvc/eMVC_1.0a3.zip
eMVC 官方网站 http://www.eazisoft.com/products/emvc
eMVC是一套不错的MVC for Delphi框架,安装后可以在File->New->Other里找到app和form的两个向导。当然不用向导也可以。采用该框架可以做到很好的 模型(M)-视图(V)-控制(C)分离 。其它语言,比如说JAVA,好几套MVC框架早已红红火火了。
for Delphi的,有名有姓的MVC我只找到这一个。还有2ccc上的一个SmartStruct,主要是第三方控件太多,我没有装。

问题1: eMVC_1.0a3/Sample/D7/Mastapp/mainview.pas ,感觉里面似乎做了应该由MainCtrl来做的事情。如 procedure TViewMain.ViewLocalClick(Sender: TObject); ,不知大家如何理解。

问题2: eMVC_1.0a3/Sample/D7/Exapmle1/MainCtrl.pas ,
if (TMenuItem(Sender).caption = '&About...') then
self.sendCommand(CMD_SHOW_ABOUT)
感觉用Caption来判断好像有点土,至少在多语言的时候会碰到些问题。不知道大家如何看待和解决。
 
你应该就是delphi幽冥群里面说emvc的那个吧
 
是。我只用一个昵称的。欢迎讨论。
 
你用了感觉怎么样?我是前段时间学习设计模式中的观察者模式的时候,搜索资料搜索到的,然后就下载下来放起,还没有安装来使用呢。
 
别看eMVC的代码或文档绝大部分是E文,仔细看代码发现有中文注释,应该是国人写的
问题1:我的感觉却是控制器做了视图该做的事情,譬如SetEventHanler这类的处理,为了避免这类问题的出现,必须丰富、优化控制器与视图之间的接口
问题2:因为重点不在这方面的处理上,而且其版本还很低,只是一个MVC框架的雏形
eMVC支持的是Win32客户端程序的设计,而Struts等这类框架却是支持J2EE构架的框架,两者意图不同,MVC在UI开发包的设计上也被广泛地采用,譬如XLGrid(最后版本为1.7)、LwVCL( www.lwvcl.com )
 
是不是哦,感觉不是国人写的东西哦,嘿嘿
 
to cqwty:
感觉还不错,不过如sailsoft所说,感觉有点初级。比如说里面有些大小写都没有规范。Example里的例子自己没有很好地遵守M-V-C。隐约感觉到作者的意思是,不必要让C做所有的业务,比如说菜单中的&Exit,直接在View里做Close就OK了,不知道是不是这个意思。

to sailsoft:
SetEventHanler好像也只能由视图来做了吧。因为要写在OnCreate()里。不过不知道能不能写在整个窗体实例的创建时,等等试验一下。

再引两个问题,这两天用在项目里发现的:
1. CommandList我觉得用Delphi的集合类型会比较优雅一点。目前eMVC都是用字符串,效率也差一点点。
2. 在一个set中,View如何直接访问自己的C?好像也没有命名的实例,只能向全局的ControlCenter发命令。
3. 传参问题。为了写成统一的接口,以及Observer模式,必然传参上得写得比较统一。所以SendCommand重载了有限的几个版本,分别传对象、指针、字符串等。对于多参数的情况,接收方往往得用拉模式(pull mode),如果多参数不便做在一个对象或一个结构体里,还有好方法接收到参数么?全局变量想都不用想了。也不能接收方uses发送方,这样耦合度就大了。还有没有什么方法?
 
VictorWoo:
1.估计作者之所以用字符串,可能是因为在实际应用当中,这些命令是需要存储起来并可以随时维护达到灵活的目的;
2.这个问题的解决办法就是需要增加一个IController接口、TController与TView抽象类,并在TController与TView之间建立视图对控制器的实例访问属性;
3.我想,作者之所以给出几种命令传递的方式,是想由使用框架的人自己在效率与功能之间做出选择,对象方式的命令传递可以解决多参数问题吧.
 
to sailsoft
2。 在view里uses了ctrl,那么ctrl中只要给出一个命名的实例就可以了吧。我看到的ctrl是这样写的:
initialization
ControlCenter.RegController(TControllerMain.Create);

3. 我的意思就是,如果不方便创建对象或者结构体的话,怎么办。我觉得由于框架的限制让人不得不改变许多写法,去创建专门用来传参的类,来适应框架了。
 
2.不是很明白你的意思,依稀记得View没有引用Ctrl吧,通过SetEventHandler使View的事件执行是调用Ctrl中的方法(我倒觉得这样更好:该事件具体的执行由View来做,然后通过View的属性来调用Ctrl的某个方法传递结果给Ctrl,再由Ctrl传递给Mdl).
initialization
ControlCenter.RegController(TControllerMain.Create);
只是在装载单元的时候在控制中心注册主控制器.
3.TStrings,TStringList,THashStringList,TQueue etc. 是对象吧,这样就可以传递多参数呀.
 
我目前做的项目就是基于eMVC,使用的感受:
1:eMVC技术还有待改进(是Delphi的eMVC),比如一个Model的Notify事件,这里需要创建一个TCommand,例程里面TCommand是在UpdataView里面释放,这样就带来一个问题:如果有多个View第一个View使用了这个TCommand后释放,第二个View在得到UpdataView时候将得到一个不存在的(Nill)TCommand;
2:不能否认eMVC这个构架思想的先进性。但是,并非所有的项目都适合用eMVC的构架模式。这就是所谓的---量体裁衣。也就是说,你必须考虑到使用EMVC必须有更多的工作量的投入。那么项目组的成员是否都认同eMVC?并遵循这个构架的设计思路?并且都有考虑到代码在这个构架的合理性?否则,eMVC的优势将无法体现出来,并可能成为将来系统维护的负担。
 
to sailsoft:
是我错了,view里只引用了patterns,所以看得到controlcenter
您的方法我不太理解:View的属性来调用Ctrl的某个方法是指什么?是不是
procedure MainView.Button1Click()
begin
Ctrl.Button1Click();
end;

由Ctrl传递给Mdl有什么意义?我觉得Model只是提供了一个通知回调用的
实例中:
TModelMain = class(TObservable)
patterns里的定义:
//Defined for can't not use TObservable
IObservable = interface
['{A7C4D942-011B-4141-97A7-5D36C443355F}']
procedure RegObserver(observer: IObserver);
procedure Notify(const o: TObject = nil);
end;
 
发现patterns里有中文了
Line 549: //不能把Control Center 做为 SetHeadquarters,否则在程序释放的时候会出错
 
to bannico:
1. 你说的释放问题我没有找到对应的代码,是指哪一段?
2. 同感。用Delphi的同学,一般都是RAD起家,能说服他们运用OOP和Design Pattern就很不错了,要人人适应一套新的Framework实在是困难。我这个项目还好不大,不然以后维护可能要全靠自己了。
 
To VictorWoo
procedure TViewMain.UpdateView(o: TObject);
var
cmd: TCommand;
begin
{write your code here}
if o is TCommand then
begin
..............
end
freeAndNil(o);//这个Command是在Model中 Notify事件里面创建的却在View里面释放。
//他大概没有考虑到一个Ctrl对应多个View的问题。
end;
 
to bannico:
好象是在TObservable的Notify里已经判断过o是否为空,所以不会到UpdateView(o: TObject)时还存在在o=nil的情况

to VictorWoo:
视图的变化要更新模型的话只有通过控制器呀,数据通过某个方法的参数传递路径就是View->Ctrl->Mdl了
作者在patterns的定义并不能完全满足MVC应用的要求,所以需要加中间抽象类来丰富
 
To:sailsoft
我的确遇到第二个View扑空的情况。然后返回错误。不信你试试[:)]
所以我现在的做法都是:哪里创建就哪里释放。
 
也许是我在TObservable中的Notify中改过if o=nil then ...
记不得了,可能是存在这个BUG吧
 
如果让Mdl支持SOAP/COM+/Corba etc.,就可以实现C/S+多层或是跨Internet的应用了
eMVC或许会往这个方向发展...:)
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部