Posted on 2007-07-26 20:46
冰浪 閱讀(1167)
評論(2) 編輯 收藏 所屬分類:
Java
今天開始做一個(gè)新的模塊,叫“時(shí)限監(jiān)察”,這個(gè)模塊的功能是要對“辦件處理”的處理情況進(jìn)行一個(gè)監(jiān)察工作。也就是說兩者是緊密相關(guān)的。而我要做的工作就是針對辦件處理的結(jié)果或者說是記錄進(jìn)行一個(gè)過濾匯總,并對有關(guān)的記錄進(jìn)行處理。如某些辦件未能按時(shí)處理的,我就可以對此辦件記錄進(jìn)行通知,提醒相關(guān)人員進(jìn)行處理。
首先說明一點(diǎn)的是,有一個(gè)VO對象,在公司的產(chǎn)品開發(fā)框架中是一個(gè)值對象,但這個(gè)值對象并不是簡單功能角色上的VO,而即做為數(shù)據(jù)持久化操作中與數(shù)據(jù)庫表進(jìn)行對象關(guān)系映射的ORM Object,也是作用顯示層中的View Object,在這里我不討論此設(shè)計(jì)的優(yōu)缺點(diǎn),這不是我要說的方面。
在辦件處理模塊,某同事已經(jīng)創(chuàng)建了對應(yīng)的VO,在這里我稱之為APVO吧,而我在時(shí)限監(jiān)察模塊也需要用到它數(shù)據(jù)表中的數(shù)據(jù),進(jìn)行辦件情況的列表顯示,所以APVO對我而言是很有利用價(jià)值的,如果我能利用它,那我就需要重復(fù)創(chuàng)建此VO(或者說是其中大部分屬性)的工作了。對于此,我首先想到的是創(chuàng)建一個(gè)自己模塊的LMVO,并繼承APVO,這樣,我既可以擁有自己的私有成員,也可利用到APVO中的所需要成員屬性。如果這要求能夠?qū)崿F(xiàn),那么我就可減少不少工作量,而對于面向?qū)ο箝_發(fā)方法中也是常見的情況。
正當(dāng)我這么做時(shí),卻發(fā)現(xiàn)了一個(gè)問題,APVO中的成員屬性的訪問域全是“private”類型的,這讓我大失所望,我無法繼承這些成員屬性!
一般情況下,我們都習(xí)慣性將類成員變量的訪問域設(shè)為private類型,然后提供Setter和Getter方法,這樣的做法,我們也通常認(rèn)為是比較安全的作法,是符合封裝性要求的。但這樣的做法,讓很多沒有必要進(jìn)行private封裝的成員變量永遠(yuǎn)地失去了再利用的可能。在這種情況下,如果我還是不想重寫這些成員變量的話,就只能是直接用APVO,并在其中加入我更多的成員變量,但這并不我所希望的。也許你會(huì)說,“不用繼承,可以用組合,而且組合優(yōu)于繼承,不是嗎?”這句話本沒有錯(cuò),一般情況下可以這么法,而且最好這么做。但在某些情況,組合無法實(shí)現(xiàn)我的要求,就像在公司的開發(fā)框架中就無法進(jìn)行,VO中的成員變量只能是簡單的數(shù)據(jù)類型,如String,這樣在進(jìn)行數(shù)據(jù)庫操作時(shí)可以順利地對其取值和賦值,但如果組合了另一個(gè)VO對象的話,這個(gè)VO對象卻無法進(jìn)行取值和賦值。
所以,在設(shè)計(jì)類時(shí),要考慮到類的復(fù)用,所以對其成員變量的訪問域控制上,不要一概地設(shè)成private。我們可以設(shè)為protected或者是默認(rèn)訪問類型。單是這么做并不夠,我們還是要考慮安全性,也就是訪問控制。所以我們還要對其所在的包的結(jié)構(gòu)進(jìn)行設(shè)計(jì)。
我們不要簡單地按功能模塊的方式來設(shè)計(jì)包,要考慮到模塊間的邏輯關(guān)系,讓有關(guān)系的模塊的包設(shè)計(jì)成“父子包”的形式,而不是按功能模塊簡單地設(shè)計(jì)成平行結(jié)構(gòu),這不利于類之間的交互,也只有這樣,我們在前面說的設(shè)計(jì)類成員變量的訪問域才變得有意義。
如前面我提到的例子,我可以將我自己的包置于APVO所在包的子包下,再讓APVO的成員變量的訪問域聲明為protected,此時(shí)我將自己的LMVO繼承APVO,這不再行不通了!