程序設(shè)計(jì)方法的演化及極限(3)

字號(hào):

4.后面向?qū)ο蠓椒?BR>    雖然面向?qū)ο蟪绦蛟O(shè)計(jì)方法有諸多優(yōu)點(diǎn),但經(jīng)過(guò)多年的實(shí)踐摸索,人們也發(fā)現(xiàn)面向?qū)ο蠓椒ㄓ衅洳蛔?,如許多軟件系統(tǒng)不完全都能按系統(tǒng)的功能來(lái)劃分構(gòu)件, 仍然有許多重要的需求和設(shè)計(jì)決策,比如、日志等,它們具有一種“貫穿特性”(crosscutting concerns),無(wú)論是采用面向?qū)ο笳Z(yǔ)言還是過(guò)程型語(yǔ)言,都難以用清晰的、模塊化的代碼實(shí)現(xiàn)。最后的結(jié)果經(jīng)常是:實(shí)現(xiàn)這些設(shè)計(jì)決策的代碼分布貫穿于整個(gè)系統(tǒng)的基本功能代碼中,形成了常見(jiàn)的“代碼散布”(code scattering)和“代碼交織”(code tangling)現(xiàn)象。代碼交織現(xiàn)象是現(xiàn)有軟件系統(tǒng)中許多不必要的復(fù)雜性的核心。它增加了功能構(gòu)件之間的依賴(lài)性,分散了構(gòu)件原來(lái)假定要做的事情,提供了許多程序設(shè)計(jì)出錯(cuò)的機(jī)會(huì),使得一些功能構(gòu)件難以復(fù)用,源代碼難以開(kāi)發(fā)、理解和發(fā)展。
    因此,人們?cè)诿嫦驅(qū)ο蟮幕A(chǔ)上發(fā)展了更多的新技術(shù),借以彌補(bǔ)面向?qū)ο蠹夹g(shù)的缺陷,使得面向?qū)ο蠹夹g(shù)能夠更好的解決軟件開(kāi)發(fā)中的問(wèn)題。這些建立在面向?qū)ο蟮幕A(chǔ)上、并對(duì)面向?qū)ο笞龀鰯U(kuò)展的新技術(shù)被廣泛應(yīng)用的時(shí)期,我們把它稱(chēng)為“后面向?qū)ο髸r(shí)代”。在后面向?qū)ο髸r(shí)代,有許多新型的程序設(shè)計(jì)值得關(guān)注。
    4.1 面向方面程序設(shè)計(jì)
    面向方面程序設(shè)計(jì)(Aspect-Oriented programming, AOP)方法,這一概念最早是由施樂(lè)(Xerox)公司在美國(guó)加州硅谷PaloAlto 研究中心(PARC)的首席科學(xué)家、加拿大大不列顛哥倫比亞大學(xué)教授Gregor Kicgales 等人首次在1997 年的歐洲面向?qū)ο缶幊檀髸?huì)(ECOOP 97)上提出[4]。
    所謂的Aspect,就是AOP提供的一種程序設(shè)計(jì)單元,它可以將上文提到的那些在傳統(tǒng)程序設(shè)計(jì)方法學(xué)中難于清晰地封裝并模塊化實(shí)現(xiàn)的設(shè)計(jì)決策,封裝實(shí)現(xiàn)為獨(dú)立的模塊。 Aspect是AOP的核心,它超越了子程序和繼承,是AOP將貫穿特性局部化和模塊化的實(shí)現(xiàn)機(jī)制。通過(guò)將貫穿特性集中到Aspect中,AOP就取得一種單一的結(jié)構(gòu)化行為---該行為在傳統(tǒng)程序中分布于整個(gè)代碼中--這樣就使Aspect代碼和系統(tǒng)目標(biāo)都易于理解。在AOP中,Aspect是AOP中的一階實(shí)體,AOP中的Aspect正如OOP中的類(lèi)?,F(xiàn)有對(duì)Aspect的認(rèn)識(shí)有錯(cuò)誤校驗(yàn)策略、設(shè)計(jì)模式、同步策略、資源共享、分布關(guān)系和性能優(yōu)化等。
    Aspect的實(shí)現(xiàn)和傳統(tǒng)開(kāi)法方法中模塊的實(shí)現(xiàn)不同。Aspect之間是一種松耦合的關(guān)系,各Aspect的開(kāi)發(fā)彼此獨(dú)立。主代碼的開(kāi)發(fā)者甚至可能沒(méi)有意識(shí)到Aspect的存在,只是在最后系統(tǒng)組裝時(shí)刻,才將各Aspect代碼和主代碼編排融合在一起。因此,主代碼和Aspect之間可以是一種不同于傳統(tǒng)“顯式調(diào)用”關(guān)系的“隱式調(diào)用”[5]。在軟件復(fù)雜性日益增加的今天,隱式調(diào)用有巨大的優(yōu)點(diǎn),因?yàn)槟骋粦?yīng)用的領(lǐng)域?qū)<遥惶赡軐?duì)分布、認(rèn)證、訪問(wèn)控制、同步、加密、冗余等問(wèn)題的復(fù)雜的實(shí)現(xiàn)機(jī)制很熟悉,因此就不能保證他們?cè)诔绦蛑羞M(jìn)行正確的調(diào)用。在當(dāng)前強(qiáng)調(diào)程序演化的情況下,這一點(diǎn)尤其重要,因?yàn)殚_(kāi)發(fā)人員很難正確預(yù)見(jiàn)到未來(lái)對(duì)程序的新需求。
    AOP 是一種關(guān)注點(diǎn)分離技術(shù),通過(guò)運(yùn)用aspect 這種程序設(shè)計(jì)單元,允許開(kāi)發(fā)者使用結(jié)構(gòu)化的設(shè)計(jì)和代碼,反映其對(duì)系統(tǒng)的認(rèn)識(shí)方式。要使設(shè)計(jì)和代碼更加模塊化、更具結(jié)構(gòu)化,使關(guān)注點(diǎn)局部化而不是分散于整個(gè)系統(tǒng)中。同時(shí),需使關(guān)注點(diǎn)和系統(tǒng)其他部分保持良好定義的接口,從而真正達(dá)到“分離關(guān)注點(diǎn),分而治之”的目的。