专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » flexjava:Flex + Java 中小型项目的代码结构研究 »正文

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 namedepartment name

而结构最优时传输却是规范标准数据结构

 

这个时候矛盾来了

A.      传输规范标准数据结构这时候必然会带上些冗余数据如显示用户清单时传输UserVOUserVO里同时也包含了标志这个用户部门DepartmentVO这时就会带来不必要数据传输如果显示用户清单有100那么这100UserVO里面DepartmentVO必然会带来不小数据冗余

B.      只在网络上传输必要数据这时有两种思路方法可以做到设计UserListVO里面包含user namedepartment 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就是那个Invokercom.novem.farc.command.UserSaveCommand.datagrid就是那个receiver

 

 

Why not Cairngorm Event or Command?

 

我们以查找user为例来看看Cairngorm是如何Command并返回结果

1.  创建CairngormEvent并在这个Event里要有userId:Numberfield

2.  创建Command这个Command要实现两个接口ICommandIResponder

3.  创建FrontController来建立EventCommand关连

 

然后在客户端时候书写如下代码:

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里添加需要Servicemethod名字常量

2思路方法

ServiceFactory.getService(ServiceFactory.USER_BIZ)

.callService(ServiceFactory.USER_BIZ_INSERT, [VO], this.result);

 

4.   使用Cache Framework提升我们性能

 

有空再做哦……

 

但主要思路是使用第 3方Cache工具在业务层做Cache

 

时间:2 个月前


相关文章: ="close">Flex

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: