<%@ page contentType="text/html; charset=gb2312"%> Flex + Java 中小型项目的代码结构研究
网站公告:   ◆北天JAVA技术网热情为java爱好者服务,本网内容包括JAVA(JSP、servlet、EJB、webservice、j2ee、javabean、应用服务器、JavaScript),数据库(MYSQL、SQL Server、Sybase、Oracle、DB2、数据库综合知识),设计研究(设计模式、Struts、Spring、Hibernate、设计框架、设计综合知识),WEB2.0新技术(主要介绍AJAX),以及各种技术的入门、实例、例子等等,欢迎各位多来坐坐!◆  诚邀各位JAVA爱好者加盟!◆  本网站内容丰富,更新快,保证每周20篇以上!  
加入收藏
设为首页
联系站长
承接项目
  相关资源:网站首页 | 免费培训学院 | 技术论坛 | JAVA聊天室 | 作家专栏 | 开发工具 | 认证考试 | 会员俱乐部
  JAVA技术初学者园地 | jsp与servlet | javascript | Java源代码 | EJB | web service | 应用服务器 | JAVA综合知识
  设计研究设计模式 | 设计框架 | Struts | Spring | Hibernate | 开源项目 | 面向对象设计 | 设计综合知识
  数 据 库MYSQL | SQL Server | Sybase | Oracle | DB2 | Informix | Access | 数据库综合知识
  其他资源:AJAX新技术 | 网站开发 | ERP软件 | OA办公软件 | 商业智能BI | 开发综合知识 | 承接项目 | 项目试用

 
 
Flex + Java 中小型项目的代码结构研究
     发布者: 发布时间:2008-03-19

前言

这两天写了一个研究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.     传输规范的数据结构。这时候必然会带上一些冗余数据,如显示用户清单时传输的UserVO,而UserVO里同时也包含了标志这个用户部门的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

 

请参见附件中的class diagram for data model

 

二.   开发效率和代码可读性上的平衡(Command and
CommandManager)

 

往往在开发的时候,标准的结构会多写很多代码,虽然结构很清晰,但老实说,对于我们的项目,好像不需要这样“清晰”,比如Cairngorm中有command, event, controller等等,这确实是一种清晰的结构,但写起来很麻烦,所以我下面设计了一种简化的结构来实现它(如下图)。

 

Class Diagram

请参见附件中的class 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要实现两个接口,ICommandIResponder

3. 创建一个FrontController来建立EventCommand的关连。

 

然后,在客户端调用的时候,书写如下的代码:

var event: EventFindUser = new EventFindUser
();

event.userId = userVO.id;

CairngormEventDispatcher.getInstance().dispatchEvent(
event );

 

我们现在新的结构是这样实现的:

var command:CommandFindUser = new
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
就是一种静态全局变量的话,我想我在这里不用说得太多,只要去查一下静态全局变量的好处坏处就可以了。

 

 

三.  如何让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,
[newVO], this.result);

 

四.  使用Cache Framework提升我们的性能

 

有空再做哦……

 

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

 

时间:2 个月前

Flex Structure

 

前言

这两天写了一个研究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.     传输规范的数据结构。这时候必然会带上一些冗余数据,如显示用户清单时传输的UserVO,而UserVO里同时也包含了标志这个用户部门的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

 

请参见附件中的class diagram for data model

 

二.   开发效率和代码可读性上的平衡(Command and
CommandManager)

 

往往在开发的时候,标准的结构会多写很多代码,虽然结构很清晰,但老实说,对于我们的项目,好像不需要这样“清晰”,比如Cairngorm中有command, event, controller等等,这确实是一种清晰的结构,但写起来很麻烦,所以我下面设计了一种简化的结构来实现它(如下图)。

 

Class Diagram

请参见附件中的class 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要实现两个接口,ICommandIResponder

3. 创建一个FrontController来建立EventCommand的关连。

 

然后,在客户端调用的时候,书写如下的代码:

var event: EventFindUser = new EventFindUser
();

event.userId = userVO.id;

CairngormEventDispatcher.getInstance().dispatchEvent(
event );

 

我们现在新的结构是这样实现的:

var command:CommandFindUser = new
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
就是一种静态全局变量的话,我想我在这里不用说得太多,只要去查一下静态全局变量的好处坏处就可以了。

 

 

三.  如何让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,
[newVO], this.result);

 

四.  使用Cache Framework提升我们的性能

 

有空再做哦……

 

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

 

  • 1af5d9b9-2bf5-3027-b13d-51defc8f43c8-thumb
  • 描述: sequence diagram for command pattern
  • 大小: 20.3 KB
  • 查看次数: 285
  • 2e8db504-2139-3b3f-87f2-43b9bccfc419-thumb
  • 描述: class diagram for command
  • 大小: 33.2 KB
  • 查看次数: 215
  • Cd7d84c9-fbb6-3296-9839-ccc18842041c-thumb
  • 描述: class diagram for data model
  • 大小: 49.5 KB
  • 查看次数: 235

TAG:
java
Java
Flex



(转载文章请保留出处:北天JAVA技术网(www.java114.com))
 
更多精彩文章:
Struts2标签显示列表
代码生成新工具:J2EE Spider
代码生成新工具:J2EE Spider
微软给予Adobe FlashLite在Win Mobile Phone上的授权
微软给予Adobe FlashLite在Win Mobile Phone上的授权
优秀的RSS阅读软件Jetbrains Omea开源了
 
        
标 题:   
内 容:   
 
                                  
 
免责声明:该文章由网友发表,如果对您造成侵权,请联系站长

首页 - 承接项目 - 网站地图 - 联系我们 -
版权所有北天JAVA技术工作室 ICP证号:粤ICP备06079815号