`
peterwei
  • 浏览: 249541 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

集中式Controller设计 PK 分开式Controller设计

阅读更多
一、引子
   昨天另外一个team的A过来找我们组的B,谈论通用flex分页的东西(A负责通用分页,我们所有人都是集成一下他的东西)。集成未果,A对B一陈狠批,说什么你怎么这样做,以后后来的人怎么维护等等。B说,怎么可能,我写的注释很清楚,不可能等等。由于涉及到双方的代码改动,B搬出C(也就是我,我是B的头)说:我和C讨论过的,可以采用某某设计等等,于是引出此文。ps:批B相当于批C
二、背景
   项目中采用flex+puremvc+blazeDS+spring+hibernate+cxf等技术。我们的争论点在于puremvc中的controller设计。puremvc中的v对应mediator类,c对应command类,m对应vo,通过proxy,用blazeds统一调用分布式的spring应用。不了解的可以自行了解,或者无需了解,因为我们今天的是问题是controller的设计问题(command类)。
三、问题
   我们一般在controller设计中有两种方法,一种是集中式设计,一种是分开式设计。flex的command自然也是这样。看看实际的例子,代码不一定对,能看明白就ok.
1.分开式设计:
先看看AddCutoverComand.as(Cutover就是网络割接,联通公司的一种业务类型)
package com.xx.controller
{
	import com.xx.model.CutoverProxy;
	import com.xx.ApplicationFacade;
	import com.xx.model.vo.CutoverVO;
	import org.puremvc.as3.interfaces.INotification;
	import org.puremvc.as3.patterns.command.SimpleCommand;
	import mx.rpc.IResponder;
	import mx.rpc.events.FaultEvent;
	
	import org.puremvc.as3.interfaces.ICommand;
	
	public class AddCutoverCommand extends SimpleCommand
	{
		override public function execute( note:INotification ) : void	
		{
			var cutoverProxy:CutoverProxy = new CutoverProxy();
			
			cutoverProxy.addCutover();
			
			sendNotification(ApplicationFacade.ADD_CUTOVER);			
		}
	}
}

然后自然的有
ModifyCutoverCommand.as,ViewCutoverCommand.as,DeleteCutoverCommand.as,QueryCutoverCommand.as,PublishCutoverCommand.as,ReplyCutoverCommand.as
等controller类。
2.我们再来看看集中式的设计:
CutoverCommand.as
package com.xx.controller
{
	import com.xx.model.CutoverProxy;
	import com.xx.ApplicationFacade;
	import com.xx.model.vo.CutoverVO;
	import org.puremvc.as3.interfaces.INotification;
	import org.puremvc.as3.patterns.command.SimpleCommand;
	import mx.rpc.IResponder;
	import mx.rpc.events.FaultEvent;
	
	import org.puremvc.as3.interfaces.ICommand;
	
	public class CutoverCommand extends SimpleCommand
	{
		var cutoverProxy:CutoverProxy = new CutoverProxy();
		override public function execute( note:INotification ) : void	
		{
			if(type=="add"){
			    addCutover(note);
                            }else if(type=="publish"){
                               publish(note);
                            }
                            //很多 if else
					
		}

                   void addCutover(...){}
                   void viewCutover(...){}
                   void publish(...){}
                   //other method

                   sendNotification(ApplicationFacade.SOME_CONSTANTS);
  	}
}

这样的结果呢就是只有一个该业务相关的Command(Controller)

四、回顾争议的引子
   争论的原因是B用的是集中式的controller设计,而A写的通用flex分页只支持分开式的command设计。谁妥协就要改动代码。最后自然是我维护B,我给出了改动的办法:
原来的分页集成代码是:
sendNotification(ApplicationFacade.SOME_CONSTANTS,Pagination);

actionscript支持动态参数,最后加了个type的参数,分页自然ok了。
sendNotification(ApplicationFacade.SOME_CONSTANTS,Pagination,type);

最后A改动量很少,只加了一个页面的属性,B不用修改代码,原先用分开式Controller设计的同事也不用修改代码。

五、不清楚puremvc
    ok,你不想看puremvc这些东西,那么想想看我们用过的struts,webwork,springmvc等框架的Controller是不是也有同样的问题。
如分开式设计的AddAction.java,DeleteAction.java,ViewAction.java
集中式设计的BizAction.java

六、我的观点
   Struts,Webwork,SpringMVC的项目我之前都有涉及过,我一律用统一式Controller设计,都是一个业务对应一个Controller,里面有自身的一些增删改查的方法。所以我的观点是很明确的,用集中式的设计。
我的理解是:
1.从语义上,Controller做控制的,只是转发一下请求到后台业务类,并不会有太多的操作,犯一着每个method,就新建一个action or command之类的东西。
2.从基于业务角色的角度出发,一个业务一个Controller。
3.维护方面,以后查看修改也方便,不用打开N多类,只在一个类里查看就行。
4.一个method,一个Controller,我觉得设计粒度太细。
5.最后,我就是喜欢集中式Controller设计。


欢迎不同观点的人拍砖,请给出你的理由和想法,谢绝谩骂,哈哈。在碰撞中进步

分享到:
评论
3 楼 lewisw 2010-09-19  
看看webwork, struts2, 有默认的execute方法(就是分散), 也可以指定(就可以多个方法了,就是集中),springmvc也一样有分散的abstractcontroller, 也有multicontroller支持集中, 这些大框架设计的时候都考虑了两种情况,说明分散和集中差别不会太大,起码说明A对B的指责是不对的,B的设计没什么不对。就我个人而言,我也比较喜欢集中的。
2 楼 peterwei 2010-09-19  
Zahir 写道
Action, DispatchAction
仁者见仁, 智者见智, 爱咋用咋用, 能够保证风格统一就成.
不过搞不明白的是, 增删改跟分页有什么关系?

做的通用flex分页查询只支持单个Command的情况,不支持集中式Controller,就是你说的DispatchAction.和增删改没必然联系,只是flex分页查询引出本文。
1 楼 Zahir 2010-09-19  
Action, DispatchAction
仁者见仁, 智者见智, 爱咋用咋用, 能够保证风格统一就成.
不过搞不明白的是, 增删改跟分页有什么关系?

相关推荐

    基于CAN总线的智能车控制系统的设计.pdf

    集中式设计将主控、循迹、驱动等功能集成在同一块电路板上,适合于简单任务和数据通信量小的应用场景。然而,随着智能车竞赛的复杂度增加,这种设计方式的局限性逐渐显现,如实时性、可靠性和可扩展性不足。 ...

    PLC 上位软件在电厂自控系统中的应用方案.pdf

    WINCC的特性包括强大的HMI(Human Machine Interface)系统,内置SQL服务器的归档系统,以及支持IEC 61131的集中式工程系统。此外,其灵活的现场总线集成、报警设置、数据存档和报表设计功能,以及对C脚本的支持,...

    AD域、DNS分离+额外域控制器安装-及主域控制器损坏解决方法.doc

    通过AD,可以实现集中式的身份验证、授权和资源管理。当主域控制器(PDC,Primary Domain Controller)损坏时,备份域控制器(BDC,Backup Domain Controller)可以接管服务,确保服务连续性。 2. DNS分离:在AD...

    分享代码了ios的项目代码

    5. **Model-View-Controller (MVC)**:iOS开发中广泛采用的设计模式,它将数据(Model)、视图(View)和控制逻辑(Controller)分开,使得代码更易于管理和维护。 6. **网络通信**:由于项目名为“YiChatTest”,...

    vue学习文档.pdf

    而 Vuex 是 Vue.js 应用的状态管理模式,它集中式存储管理应用所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。 在构建实际应用时,Vue.js 也具备与第三方库或已有项目整合的能力,这使得在...

    搜索链接深度学习网址导航系统 v0.0.16(jsp)-jspurl.zip

    【搜索链接】深度学习网址导航系统 v0.0.16(jsp) 是一个基于JSP技术构建的网络应用,旨在为用户提供一个集中式的深度学习资源检索平台。这个系统允许用户方便地查找、收藏和分享关于深度学习的各种在线资源,如教程...

    tacacs.net安装文件

    **TACACS(Terminal Access Controller Access Control System)网络服务是一种集中式身份验证、授权和会计(AAA,Authentication, Authorization, and Accounting)协议,主要用于网络设备的管理。它为网络管理员...

    思科ACS认证服务器安装文件

    1. **ACS(Cisco Adaptive Security Appliance)**:ACS全称为思科适应性安全设备,实际上它是一种集中式的网络访问控制解决方案。它的主要功能是提供身份验证、授权和审计服务,以确保只有经过身份验证的用户和设备...

    基于python的自动化测试框架在Scrum开发模式中的应用

    Scrum是一种流行的敏捷开发框架,采用增量式的迭代开发过程。一个完整的开发周期被细分为多个短周期(称为Sprint),每个Sprint周期通常为2到4周,旨在每个迭代结束时都能交付潜在可交付的产品增量。然而,要在每个...

    spring 控制反转和依赖注入.docx

    1. Spring Core:主要模块(组件),BeanFactory,是创建 JavaBean 的工厂,使用 IOC 模式,通过 ID 赋值,将应用程序的配置和依赖性的规范,与实际的应用代码分开。 2. Spring AOP:切面编程,将事务管理集成到...

    单片机原理与应用--习题答案

    单片机还可以被称为**嵌入式控制器(Embedded Controller)**或**微控制器(Microcontroller)**。 **1.3 单片机系统的主要组成部分** 单片机系统将以下几部分集成在一块芯片上: - **CPU**(中央处理器) - **RAM**...

    化工仪表自动化判断题.pdf

    1. 活塞式压力计的工作原理:活塞式压力计通过加砝码产生压力,压力与砝码质量和活塞面积成正比,因此题目中的第一题和第二题涉及到活塞式压力计的操作和设计规范。 2. 节流装置的安装要求:节流装置通常需要上游和...

    DamianDev03.github.io:TELE4网站

    5. **MVC(Model-View-Controller)架构**:如果项目规模较大,可能采用了MVC设计模式,将模型、视图和控制器分开,以便更好地组织代码。 6. **GitHub工作流**:作为GitHub上的项目,可能使用了版本控制、拉取请求...

    Java /JSP代码安全规范

    **2.3.1 集中式输入验证** - **统一入口**:设置一个统一的输入验证点,对所有输入数据进行验证。 - **白名单与黑名单**:推荐使用白名单策略,只接受预期的输入值。 **2.3.2 服务器端输入验证** 客户端的输入...

Global site tag (gtag.js) - Google Analytics