<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    2008年1月4日

    一點感悟

    這兩天遇到的一些問題,引起的一些思考,覺得有必要寫下來。
    一. 面向?qū)ο蟮腁PI接口設(shè)計,如何做到向后兼容。一個軟件存在多個模塊,如果提供基礎(chǔ)API的模塊變化了,那么依賴于它的應(yīng)用模塊都必須重新編譯和部署。這就對基礎(chǔ)API模塊的向后兼容性提出了要求。完全通用的方法是不存在的,任何方法都需要根據(jù)實際情況調(diào)整,這里僅僅提供一些比較通用但是也不明確的方法:
    方法一:擴展時對象只增加方法和屬性,原有的屬性和方法保留。這對于c++等基于二進制對象布局的方法在使用時需要非常小心,否則極易引起內(nèi)存訪問違規(guī)。但是對于ActionScript基于元數(shù)據(jù)的語言來說,這一方法一般不會有什么問題。對于Java的情況不是非常清楚,估計與actionscript情況差不多。
    方法二:增加新的對象(使用繼承)提供擴展功能,原來的對象保留。不過對于耦合的類關(guān)系,只增加一個類往往并不能達到目的。

    這里必須注意的一點是,API提供者與API使用者保持單向依賴的關(guān)系,API不應(yīng)該依賴于具體的應(yīng)用。對于多模塊的軟件來說架構(gòu)最重要的是兩點:
    1. 從需求中抽象出API,并且將API的開發(fā)交給素質(zhì)較高的人員,而應(yīng)用之間松散耦合,通過API發(fā)生關(guān)系。
    2. API本身空間也要做劃分,將之切割成為正交的空間,這樣API擴展時,影響控制在局部。


    順便說說向前兼容的問題,這要求新的Client兼容老的API,這在API設(shè)計中很少碰到,但是在設(shè)計軟件的文檔存儲格式(Save/Load)時常常遇到,這要求新的應(yīng)用在開發(fā)時,做判斷,判斷屬性不存在時應(yīng)該如何處理,也就是提供一個默認值。

    對于其它的Server-Client結(jié)構(gòu),比如WebService的擴展,XML擴展等等,我想也應(yīng)該有類似的方法。所以我也想去看看一些公開的API接口是如何設(shè)計和擴展的,比如FaceBook,不過說到底還是抽象與空間劃分的問題,而這些并沒有通用的方法,都依賴于具體的需求。

    二. 面向接口的設(shè)計實際上就是合理的劃分對象空間。對于對象在擴展時,我們常常會發(fā)現(xiàn)并沒有辦法把它劃分成樹狀的類關(guān)系,常常我們發(fā)現(xiàn)從一個類A派生了兩個類B和C,但是又存在第三種情況,它的行為包含部分B的行為也包含部分C的行為。實際上類的空間劃分,和數(shù)據(jù)庫設(shè)計是一樣的,每一次劃分(繼承)相當于以一個索引劃分對象空間,但是很多時候劃分有多個索引,這時候要想劃分成單一的一棵樹是不可能的。這時候就需要進一步細化對象的空間劃分,并將之劃分為正交的多個空間。舉個例子:Window派生出TransparentWindow和OpaqueWindow,這是一種劃分,但是我們又發(fā)現(xiàn)另一種劃分,WindowWithTitleBar與WindowWithoutTitleBar,他們都是對Window的劃分。這時候我們應(yīng)該想到的是,Window可以拆分為:ITitleBar, IMainWindow,各種Window可以選擇實現(xiàn)或者不實現(xiàn)這些接口。當?shù)谌呤褂眠@些對象時,直接訪問接口即可,因為其它的接口可能是他們并不關(guān)心的。當存在多種索引時,將對象拆分為正交的空間,每一個空間尤其自己的單一索引,這應(yīng)該是對象劃分的一種通用原則。就像單根繼承一樣,這樣會使得對象的劃分結(jié)構(gòu)非常清晰。
    對于某些不是特別復雜的情況,如果存在多種劃分索引,不妨用單一的類表示全部的對象,對某些對象,某些屬性方法是無效的,這樣實際上在簡單情況下是很有效的,因為過度的劃分會造成復雜性,使用者可能不知道在哪個對象上找到他需要的屬性或方法了,這就好像在一張表上設(shè)計了全部的屬性,盡管有些屬性是抵觸的,有些屬性是相關(guān)的。隨著不斷的擴展,這張表會越來越大,這就需要開始對對象空間做劃分了,所以說到底,還是一個需求復雜度的問題,這里最重要的是掌握一個劃分的度,何時劃分,劃分到什么程度,決定這些的往往不僅僅是技術(shù)因素,還有商業(yè)上,運營上,時間上,成本上的因素,這也是最難判斷的一點,需要在實際中去具體問題具體分析,這里就能體現(xiàn)經(jīng)驗的重要性了,其實在架構(gòu)上方法都是很Genralized的,這些和實現(xiàn)一個具體的算法大部相同,所以設(shè)計模式都在講模式一定有其上下文,也是這個道理嗎

    胡扯了很多,先到這里吧,等有時間做進一步的整理

    posted @ 2008-08-15 17:40 雁過無痕 閱讀(330) | 評論 (0)編輯 收藏

    國內(nèi)的Flex資源

    AnyFlex
    RIAchina
    RXNA類似國外的mxna)
    Flex搜索引擎計劃:http://blog.eshangrao.com/index.php/2007/02/27/352-googleflex
    Flex Wiki計劃:http://blog.eshangrao.com/index.php/2007/05/12/390-flexwikiflex
    RIAmeeting:http://www.riameeting.cn/

    Flex對于信息發(fā)布類網(wǎng)站不一定有效,但交互性要求很高的社區(qū)類網(wǎng)站就很合適

    posted @ 2008-02-28 16:12 雁過無痕 閱讀(378) | 評論 (0)編輯 收藏

    竹林深處寬屏壁紙

    http://www.aar.cn/wallpaper/Desktop/Natural/2150/F_WQTP_1680x1050_Q.Html

    posted @ 2008-02-27 18:45 雁過無痕 閱讀(365) | 評論 (0)編輯 收藏

    Flex SDK Open Source Site Online

    http://opensource.adobe.com/wiki/display/site/Source

    posted @ 2008-02-26 11:38 雁過無痕 閱讀(307) | 評論 (0)編輯 收藏

    Dont't treat software as an artifact, but as a process of engagement with your users

    Fellow evangelist Duane Nickull has posted the slides from his Web 2.0 Design Patterns, Models and Analysis presentation

    posted @ 2008-01-17 11:33 雁過無痕 閱讀(268) | 評論 (0)編輯 收藏

    Inversion of Control for Actionscript 3.0

    http://www.pranaframework.org/

    reference:
    Inversion of Control Containers and the Dependency Injection Pattern, by Martin Fowler


    Prana是一個用Actionscript寫的IoC Framework,理念和Spring非常類似,目的是為了盡可能降低類之間的依賴性,通過xml配置文件使得編譯依賴性降低,可以動態(tài)裝配。這在Java的世界里是非常有意義的,因為所有的事情都發(fā)生在server端,Client端并不需要知道這一切。但是在Flex的世界里,swf是客戶端下載下來運行在client,如果要達到動態(tài)裝配的目的,client必須能夠有最新需要動態(tài)裝配的class的字節(jié)碼,這必然要求swf重新編譯,那么這就失去了Ioc的意義了

    posted @ 2008-01-09 17:42 雁過無痕 閱讀(366) | 評論 (0)編輯 收藏

    Module之間的通信交互解決辦法

    看看以下的代碼,有點意思
    1.子Swf的Code,SampleChildren.mxml

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
        
    <mx:Script>
            
    <![CDATA[
                import mx.managers.SystemManager;
                public 
    function output(s:String):void{
                    trace(s);
                }

                
                public 
    function CallFriend():void{
                    SampleChildren(_SystemManager.application).output(
    "call");
                }

                
                private 
    var _SystemManager:SystemManager;
                
                public 
    function register(ASystemManager:SystemManager):void{
                    _SystemManager
    =ASystemManager;
                }

                    
            ]]
    >
        
    </mx:Script>
    </mx:Application>

    2.主swf的Code, SampleParent.mxml
    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
        
    <mx:Script>
            
    <![CDATA[
                import mx.managers.SystemManager;
                
                
    var Children1,Children2:SystemManager;
                
                private 
    function onClick(e:Event):void{
                    SampleChildren(Children1.application).register(Children2);
                    SampleChildren(Children2.application).register(Children1);
                }

                
                private 
    function initNestedAppProps():void {
                    Children1 
    = SystemManager(myLoader.content);
                    trace(Children1.application);
                }

                private 
    function initNestedAppProps2():void {
                    Children2 
    = SystemManager(myLoader2.content);
                    trace(Children2.application);
                }

                
                private 
    function onC1(e:Event):void{
                    SampleChildren(Children1.application).CallFriend();
                }
      
                private 
    function onC2(e:Event):void{
                    SampleChildren(Children2.application).CallFriend();
                }
                  
                
            ]]
    >
        
    </mx:Script>
        
    <mx:Button label="ClickMe" click="onClick(event);"/>
        
        
    <mx:Button label="c1 call c2" click="onC1(event);"/>
        
    <mx:Button label="c2 call c1" click="onC2(event);"/>
        
        
    <mx:SWFLoader id="myLoader" width="300"
            source
    ="SampleChildren.swf"
            creationComplete
    ="initNestedAppProps();"/>
        
    <mx:SWFLoader id="myLoader2" width="300"
            source
    ="SampleChildren.swf"
            creationComplete
    ="initNestedAppProps2();"/>    
    </mx:Application>

    注意到SampleParent.mxml文件中SampleChildren類的使用了么,原來mxml文件也是對應(yīng)一個同名的actionscript class的,這個class是從Application派生的。但是要注意哦,SampleParent.mxml編譯時必須能夠看到SampleChildren類的Source。

    posted @ 2008-01-04 12:27 雁過無痕 閱讀(506) | 評論 (0)編輯 收藏

    轉(zhuǎn)貼兩篇關(guān)于Flex FrameWork以及模塊化開發(fā)的文章,第一篇Flex Framework Fundamentals

    轉(zhuǎn)載自:http://www.cnblogs.com/sharplife/archive/2007/09/03/880641.html

    最近看時學習Flex應(yīng)用,開始對Flex和Flash的關(guān)系有些模糊,讀了Oreilly的Programming Flex 2才算是明白些,現(xiàn)記下。

    1、Flex應(yīng)用程序的生命周期
    Flex應(yīng)用就其根本上講就是Flash應(yīng)用,只不過其是基于Flex Framework(由ActionScript寫就)開發(fā)的。Flex應(yīng)用程序的根對象的是SystemManager(不是我們在flex應(yīng)用上看到的Application根元素),繼承自flash.dispaly.MovieClip—flash player display type,MovieClip是一種支持timeline基本元素幀frame的對象,在Flex Framework中SystemManager是特殊的,含有兩幀(其他component都是一幀的),分別是preloader和真正的Application,preloader幀可以迅速下載下來并用于顯示應(yīng)用下載進度,一旦Flex應(yīng)用的SystemManager實例進入第二幀,將創(chuàng)建Flex主應(yīng)用application實例并賦予本身的屬性application(在進入第二幀之前是null),自此application(flex主應(yīng)用)的內(nèi)部生命周期、事件開始運作:
    preinitialize:application已經(jīng)實例化但尚未創(chuàng)建任何child component
    initialize:已經(jīng)創(chuàng)建child component但對其進行布局(lay out)
    creationComplete:application已經(jīng)完成實例化并完成所有child component的布局
    SystemManager有一個topLevelSystemManager對象,指向一個SystemManager實例,是所有當前在flash player運行的任何東西的根(root),如果flex被作為主應(yīng)用加載到flash player則上述屬性將指向其本身(self-refrencing),但當flex應(yīng)用是被另一flex應(yīng)用載入的,其自身的SystmenManager的topLevelSystemManager屬性則不是自引用了,而是指向其父應(yīng)用的SystemManager實例。所有UIComponent的子類都有一個systemManager屬性指向應(yīng)用的SystemManager實例,在被SystemManger實例監(jiān)聽的component的事件發(fā)生冒泡時,其將擁有事件處理鏈上最后的處理權(quán)。

    2、Flash palyer和Framwork的區(qū)別
    Flash player是Flex應(yīng)用和flash應(yīng)用的運行環(huán)境,兩應(yīng)用對其擁有完全平等的操作權(quán)(通過Flash player提供的API),兩應(yīng)用形成的.swf文件在flash player中是同樣的表現(xiàn),不同的不是應(yīng)用的內(nèi)容而是其各自的創(chuàng)建方式。Flex的Framework在開發(fā)和運行之間為應(yīng)用提供了一層抽象,F(xiàn)lex應(yīng)用編譯時會將必要的framwork library編譯進.swf文件(同樣影響應(yīng)用文件的大小等),主要的flash player class當然不會被編譯到.swf中,因為他們已經(jīng)存在于flash player中了,最終形成與flash應(yīng)用同樣的flash player可以理解的指令。
    關(guān)于flash player class和flex framework的區(qū)分很方便,前者的class以flash開頭,如flash.net.URLLoader,而后者則以mx開頭,如mx.controls.Button

    3、動態(tài)載入另外的flex應(yīng)用
    <mx:SWFLoader source=”src/*.swf”/>
    Swfloader的content屬性指向被載入的flex應(yīng)用的SystemManager實例(其application屬性指向被載入felx應(yīng)用的Application實例),swfloader加載、初始化被載入flex應(yīng)用時會dispatch出init事件,可與其中監(jiān)聽被載入flex應(yīng)用的SystemManager實例的ApplicationComplete事件,事件發(fā)生時被載入content的Application對象方可以引用
    與inithandler中event.target.content.addEventListener(FlexEvent.APPLICATION_COMPLETE,func);
    與applicationCompleteHandler中event.target.application.method…

    4、理解應(yīng)用程序域(application domain)
    一個應(yīng)用程序domain(類似于.net的appdoamin)中有flex應(yīng)用的相關(guān)類定義、資源等,被載入的新flex應(yīng)用可以存在于一個全新的、隔離的domain中(占額外的內(nèi)存資源)、可以存在于當前domain的子doamin中(共享父domain的資源、類定義,須注意類定義被取代的情況)、也可以直接存在與當前doamin中(同樣須注意類定義沖突),如runtime shared library。
    代碼中實現(xiàn)這三種方式的應(yīng)用(主要應(yīng)用到flash.system.LoaderContext、flash.display.Loader或flash.net.URLLoader、flash.system.ApplicationDomain)

    var context:LoaderContext = new LoaderContext( );
    context.applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);//載入作為子domain
    context.applicationDomain = new ApplicationDomain();//載入作為全新domain
    context.applicationDomain = ApplicationDomain.currentDomain;//載入當前domain
    var request:URLRequest = new URLRequest("RuntimeLoadingExample.swf");
    var loader:Loader = new Loader( );
    loader.load(request, context);

    5、關(guān)于preloader
    Preloader是一個輕量級的類,在systemManager的第一幀被實例化,preloader會dispatch出一系列的事件,由progress bar監(jiān)聽實現(xiàn)loading界面,一旦應(yīng)用進入第二幀待application初始化后會借由system manager通知preloader初始化進度,preloader通知system manager其準備待刪除
    Preloader的事件dispatch:
    progress
    Indicates download progress
    complete
    Indicates that the download is complete
    rslError
    Indicates that a runtime shared library could not load
    rslProgress
    Indicates the download progress for a runtime shared library
    rslComplete
    Indicates that the download is complete for runtime shared libraries
    initProgress
    Indicates that the application is initializing
    initComplete
    Indicates that the application has initialized

    如此,preloader可以定制化了。

    Over,暈倒!~

    posted @ 2008-01-04 12:19 雁過無痕 閱讀(1838) | 評論 (1)編輯 收藏

    <2008年1月>
    303112345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    導航

    統(tǒng)計

    常用鏈接

    留言簿(7)

    隨筆檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 免费精品国产自产拍在| 国产成人AV片无码免费| 日韩免费视频网站| 亚洲色中文字幕在线播放| 色妞WWW精品免费视频| 在线观看亚洲AV日韩A∨| 亚欧人成精品免费观看| 亚洲日本国产乱码va在线观看| 亚洲精品无码不卡| 少妇太爽了在线观看免费视频| 狠狠色伊人亚洲综合成人| 很黄很污的网站免费| 亚洲综合国产精品| 成人免费AA片在线观看| 亚洲日产乱码一二三区别 | 久久精品九九亚洲精品天堂| 热99RE久久精品这里都是精品免费 | 亚洲AV无码专区国产乱码电影| 麻豆精品成人免费国产片| 亚洲色图在线播放| 久久久久久久91精品免费观看| 亚洲色欲啪啪久久WWW综合网| 全免费a级毛片免费看无码| 污网站在线观看免费| 国产亚洲一区二区手机在线观看| 99视频免费播放| 免费在线一级毛片| 中文毛片无遮挡高清免费| 亚洲综合激情视频| 国产一级理论免费版| 两个人看的www免费| 亚洲一区二区三区精品视频| 国产成人免费a在线资源| 花蝴蝶免费视频在线观看高清版| 亚洲精品视频在线播放| 又粗又大又猛又爽免费视频| 插鸡网站在线播放免费观看| 亚洲综合一区国产精品| 亚洲日韩国产成网在线观看| 亚洲高清视频免费| 免费高清A级毛片在线播放|