- 論壇徽章:
- 0
|
前言
這兩天寫了一個研究Flex
+ Java的例子,供大家參考,這個例子主要是出于以下幾點考慮的
1.
系統(tǒng)性能和系統(tǒng)可維護(hù)性上的平衡(Value Object lazy load)
2.
開發(fā)效率和代碼可讀性上的平衡(Command and CommandManager)
3.
如何讓Flex調(diào)用服務(wù)端的Service(AMF3,
Remote Object)
4.
使用Cache Framework提升我們的性能
花絮:其實做項目和生活,管理等等都是一樣,做到最好是不太現(xiàn)實的,但要和諧,什么叫和諧?就是在成本,進(jìn)度,質(zhì)量等外在壓力下把代碼寫得最好!所以我下面的例子代碼也是一樣,追求的是一個平衡J
一.
系統(tǒng)性能和系統(tǒng)可維護(hù)性上的平衡(Value Object lazy
load)
最佳性能時,系統(tǒng)只在網(wǎng)絡(luò)上傳輸必要的數(shù)據(jù),如顯示用戶清單時只傳輸user name和department name。
而結(jié)構(gòu)最優(yōu)時,傳輸?shù)膮s是規(guī)范的數(shù)據(jù)結(jié)構(gòu)。
這個時候矛盾來了
A.
傳輸規(guī)范的數(shù)據(jù)結(jié)構(gòu)。這時候必然會帶上一些冗余數(shù)據(jù),如顯示用戶清單時傳輸?shù)腢serVO,而UserVO里同時也包含了標(biāo)志這個用戶部門的DepartmentVO,這時就會帶來不必要的數(shù)據(jù)傳輸,如果顯示的用戶清單有100條,那么這100個UserVO里面的DepartmentVO必然會帶來不小的數(shù)據(jù)冗余。
B.
只在網(wǎng)絡(luò)上傳輸必要的數(shù)據(jù)。這時有兩種方法可以做到,設(shè)計一個UserListVO,里面包含user name和department name這兩樣field,然后在Business
Logic里組裝這個UserListVO。但這種方法顯然有個大的缺點,這個VO或?qū)?yīng)的業(yè)務(wù)邏輯代碼不可以共用,因為不同的地方會有不同的業(yè)務(wù)需求,比如有一個模塊中會要顯示用戶的年齡。另一個方法就是,使用規(guī)范的數(shù)據(jù)結(jié)構(gòu),但只為這些數(shù)據(jù)結(jié)構(gòu)中必要的欄位設(shè)值,如上面所說的,可以只為userVO.departmentVO.name設(shè)值,但其它欄位保持null,顯然,這個VO的共用性也不好,因為我沒法知道這個VO里面的欄位是否已經(jīng)被設(shè)值了。
綜上所說,所以我取上面兩種方法的一個中間點來解決這個問題(如下圖),即使用完整的數(shù)據(jù)結(jié)構(gòu)來存儲數(shù)據(jù),但不是必要的數(shù)據(jù)不會被加載上來,如果要用時,可以通過Lazy Load的方式加載。如UserVO里有DepartmentVO,但在顯示清單時不需要user對應(yīng)的department信息,在編輯時才需要,所以我們可以在popup出用戶編輯窗口的時候才在UserVO的getDepartmentVO()方法中加載相應(yīng)的DepartmentVO。
請參見附件中的class diagram for data model
二.
開發(fā)效率和代碼可讀性上的平衡(Command and
CommandManager)
往往在開發(fā)的時候,標(biāo)準(zhǔn)的結(jié)構(gòu)會多寫很多代碼,雖然結(jié)構(gòu)很清晰,但老實說,對于我們的項目,好像不需要這樣“清晰”,比如Cairngorm中有command, event, controller等等,這確實是一種清晰的結(jié)構(gòu),但寫起來很麻煩,所以我下面設(shè)計了一種簡化的結(jié)構(gòu)來實現(xiàn)它(如下圖)。
Class Diagram
請參見附件中的class diagram for command
Sequence Diagram
請參見附件中的sequence diagram for command pattern
關(guān)于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是怎么調(diào)用一個Command并返回結(jié)果的。
1.
創(chuàng)建一個CairngormEvent,并在這個Event里要有一個userId:Number的field。
2.
創(chuàng)建一個Command,這個Command要實現(xiàn)兩個接口,ICommand和IResponder。
3.
創(chuàng)建一個FrontController來建立Event和Command的關(guān)連。
然后,在客戶端調(diào)用的時候,書寫如下的代碼:
var event: EventFindUser = new EventFindUser
();
event.userId = userVO.id;
CairngormEventDispatcher.getInstance().dispatchEvent(
event );
我們現(xiàn)在新的結(jié)構(gòu)是這樣實現(xiàn)的:
var command:CommandFindUser = new
CommandFindUser();
command.userId = userVO.id;
NovemCommandManager.execute(command);
可以看出來,Cairngorm通過注冊Event,并通過Event來傳遞輸入?yún)?shù),而我們自己的結(jié)構(gòu)是將參數(shù)直接傳遞給Command,所以Cairngorm并沒有給我們提供特別的方便,反而增加了不少麻煩的Event,而它提供的這種解耦,也并不實在。
Why not
Cairngorm Model Locator?
Cairngorm Model Locator提供的其實是一種靜態(tài)全局變量。
那么,誰都可以來改變這個Model
Locator中的值,這顯然是一個很危險的事。
如果大家也和我一樣認(rèn)為Cairngorm
Model Locator就是一種靜態(tài)全局變量的話,我想我在這里不用說得太多,只要去查一下靜態(tài)全局變量的好處壞處就可以了。
三.
如何讓Flex調(diào)用服務(wù)端的Service(AMF3, Remote Object)
暫且假定,我們的項目使用的Remote
Object方式去訪問服務(wù)端
Why
not Cairngorm Delegate?
老規(guī)矩,我們先來看看Cairngorm是怎么來調(diào)用服務(wù)端的
1.
在service.xml里添加配置項
2.
創(chuàng)建Delegate.as,并為RemoteObject添加對應(yīng)的方法(這里需要為每個服務(wù)端對象都創(chuàng)建對應(yīng)的Delegate和方法,工作量不但不小,而且很煩哦)
再來看看我們的寫法吧:
1.在ServiceFactory里添加需要調(diào)用的Service和method的名字常量
2.調(diào)用方法
ServiceFactory.getService(ServiceFactory.USER_BIZ)
.callService(ServiceFactory.USER_BIZ_INSERT,
[newVO], this.result);
四.
使用Cache Framework提升我們的性能
有空再做哦……
但主要的思路是使用第三方的Cache工具在業(yè)務(wù)層做Cache
本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u/21344/showart_2163901.html |
|