flexjava:Flex + Java 中小型项目的代码结构研究来源: 发布时间:星期五, 2008年12月19日 浏览:2次 评论:0
前言
这两天写了个研究Flex + Java例子供大家参考这个例子主要是出于以下几点考虑 1. 系统性能和系统可维护性上平衡(Value Object lazy load) 2. 开发效率和代码可读性上平衡(Command and CommandManager) 3. 如何让Flex服务端Service(AMF3, Remote Object) 4. 使用Cache Framework提升我们性能 花絮:其实做项目和生活管理等等都是样做到最好是不太现实但要和谐什么叫和谐?就是在成本进度质量等外在压力下把代码写得最好!所以我下面例子代码也是样追求是个平衡J . 系统性能和系统可维护性上平衡(Value Object lazy load) 最佳性能时系统只在网络上传输必要数据如显示用户清单时只传输user name和department name 而结构最优时传输却是规范标准数据结构 这个时候矛盾来了 A. 传输规范标准数据结构这时候必然会带上些冗余数据如显示用户清单时传输UserVO而UserVO里同时也包含了标志这个用户部门DepartmentVO这时就会带来不必要数据传输如果显示用户清单有100条那么这100个UserVO里面DepartmentVO必然会带来不小数据冗余 B. 只在网络上传输必要数据这时有两种思路方法可以做到设计个UserListVO里面包含user name和department name这两样field然后在Business Logic里组装这个UserListVO但这种思路方法显然有个大缺点这个VO或对应业务逻辑代码不可以共用区别地方会有区别业务需求比如有个模块中会要显示用户年龄另个思路方法就是使用规范标准数据结构但只为这些数据结构中必要栏位设值如上面所说可以只为userVO.departmentVO.name设值但其它栏位保持null显然这个VO共用性也不好我没法知道这个VO里面栏位是否已经被设值了 综上所说所以我取上面两种思路方法个中间点来解决这个问题(如下图)即使用完整数据结构来存储数据但不是必要数据不会被加载上来如果要用时可以通过Lazy Load方式加载如UserVO里有DepartmentVO但在显示清单时不需要user对应department信息在编辑时才需要所以我们可以在popup出用户编辑窗口时候才在UserVOgetDepartmentVO思路方法中加载相应DepartmentVO 请参见附件中 diagram for data model 2. 开发效率和代码可读性上平衡(Command and CommandManager) 往往在开发时候标准结构会多写很多代码虽然结构很清晰但老实说对于我们项目好像不需要这样“清晰”比如Cairngorm中有command, event, controller等等这确实是种清晰结构但写起来很麻烦所以我下面设计了种简化结构来实现它(如下图) Class Diagram 请参见附件中 diagram for command Sequence Diagram 请参见附件中sequence diagram for command pattern 有关Command Pattern请参考以下链接 http://www.javaworld.com/javaworld/jw-06-2002/jw-0628-designpatterns.html 这里CommandManager就是那个Invoker而com.novem.farc.command.UserSaveCommand.datagrid就是那个receiver Why not Cairngorm Event or Command? 我们以查找个user为例来看看Cairngorm是如何个Command并返回结果 1. 创建个CairngormEvent并在这个Event里要有个userId:Numberfield 2. 创建个Command这个Command要实现两个接口ICommand和IResponder 3. 创建个FrontController来建立Event和Command关连 然后在客户端时候书写如下代码: var event: EventFindUser = EventFindUser ; event.userId = userVO.id; CairngormEventDispatcher.getInstance.dispatchEvent( event ); 我们现在新结构是这样实现: var command:CommandFindUser = CommandFindUser; command.userId = userVO.id; NovemCommandManager.execute(command); 可以看出来Cairngorm通过注册Event并通过Event来传递输入参数而我们自己结构是将参数直接传递给Command所以Cairngorm并没有给我们提供特别方便反而增加了不少麻烦Event而它提供这种解耦也并不实在 Why not Cairngorm Model Locator? Cairngorm Model Locator提供其实是种静态全局变量 那么谁都可以来改变这个Model Locator中值这显然是个很危险事 如果大家也和我样认为Cairngorm Model Locator就是种静态全局变量话我想我在这里不用说得太多只要去查下静态全局变量好处坏处就可以了 3. 如何让Flex服务端Service(AMF3, Remote Object) 暂且假定我们项目使用Remote Object方式去访问服务端 Why not Cairngorm Delegate? 老规矩我们先来看看Cairngorm是如何来服务端 1. 在service.xml里添加配置项<mx:RemoteObject/> 2. 创建Delegate.as并为RemoteObject添加对应思路方法(这里需要为每个服务端对象都创建对应Delegate和思路方法工作量不但不小而且很烦哦) 再来看看我们写法吧: 1.在ServiceFactory里添加需要Service和method名字常量 2.思路方法 ServiceFactory.getService(ServiceFactory.USER_BIZ) .callService(ServiceFactory.USER_BIZ_INSERT, [VO], this.result); 4. 使用Cache Framework提升我们性能 有空再做哦…… 但主要思路是使用第 3方Cache工具在业务层做Cache 相关文章: ="close">Flex 0
相关文章读者评论
发表评论 |