胡文娟
【摘要】 計(jì)算機(jī)軟件開(kāi)發(fā)的代碼重用是一個(gè)終極目標(biāo)。本論文以JAVA軟件開(kāi)發(fā)為例,說(shuō)明了組成支持代碼重用的一種方法的三個(gè)步驟。
【關(guān)鍵詞】 JAVA 代碼重用
一、引言
計(jì)算機(jī)軟件開(kāi)發(fā)的代碼重用是一個(gè)終極目標(biāo),然而,重用可能難以實(shí)現(xiàn),因?yàn)閭鹘y(tǒng)面向?qū)ο缶幊谭椒ㄔ诳芍赜眯苑矫娲嬖谝恍┎蛔恪1菊撐囊訨AVA軟件開(kāi)發(fā)為例,說(shuō)明了組成支持代碼重用的一種方法的三個(gè)步驟。
二、JAVA軟件代碼重用的三個(gè)步驟
第一步
將功能移出類實(shí)例方法:由于類繼承機(jī)制缺乏精確性,因此對(duì)于代碼重用來(lái)說(shuō)它并不是一種最理想的機(jī)制。執(zhí)行單一概念性任務(wù)的任何方法都應(yīng)該是獨(dú)立的,并應(yīng)將其作為要重用的首選方法。
要實(shí)現(xiàn)這一點(diǎn),必須返回到過(guò)程式編程,將代碼移出類實(shí)例方法并將其移入全局可見(jiàn)的過(guò)程中。
在 Java 中,方法不能脫離類而存在。但是,可以使方法成為單個(gè)類的、公共可見(jiàn)的靜態(tài)方法。如可以采用類似下面的一個(gè)類:
class Polygon {..
public int getPerimeter() {...}
public boolean isConvex() {...}
public boolean containsPoint(Point p) {...}
.. }
并將其更改為類似以下的形式:
class Polygon {..
public int getPerimeter() {return pPolygon
computePerimeter(this);}
public boolean isConvex() {return pPolygon.isConvex(this);}
public boolean containsPoint(Point p)
{return pPolygon.containsPoint(this, p);}
..}
以上事例中所實(shí)現(xiàn)效果就是,客戶端代碼不再非要通過(guò)繼承 Polygon 來(lái)重用其功能。現(xiàn)在這一功能在 pPolygon 類中是以過(guò)程為單位提供的。
第二步
將非基本數(shù)據(jù)類型的輸入?yún)?shù)類型轉(zhuǎn)換為接口類型:通過(guò)接口參數(shù)類型而非通過(guò)類繼承利用多態(tài)性,這是在面向?qū)ο缶幊谭椒ㄖ袑?shí)現(xiàn)可重用性的真正基礎(chǔ)。可重用性是通過(guò)編寫(xiě)接口,而不是通過(guò)編寫(xiě)類來(lái)實(shí)現(xiàn)的。
將以上的論述應(yīng)用到第一步的結(jié)果,一旦某個(gè)功能塊可作為一個(gè)全局可見(jiàn)的獨(dú)立過(guò)程,就可以通過(guò)將它的每個(gè)類級(jí)輸入?yún)?shù)類型轉(zhuǎn)換為接口類型,從而進(jìn)一步提高它的可重用性。
例如,假定有一個(gè)全局可見(jiàn)的靜態(tài)方法:
static public boolean contains(Rectangle rect, int x, int y) {...}
該方法旨在判斷給定的矩形是否包含給定的位置。此處應(yīng)該將 rect 參數(shù)的類型從類類型 Rectangle 更改為接口類型,如下所示:
static public boolean contains(Rectangular rect, int x, int y){...}
Rectangular could be the following interface:
public interface Rectangular {
Rectangle getBounds();}
現(xiàn)在,可描述為 Rectangular 的類的對(duì)象都可作為 rect 的參數(shù)傳遞給 pRectangular.contains()。通過(guò)放寬對(duì)可傳遞給方法的參數(shù)的約束來(lái)提高方法的可重用性。
第三步
選擇耦合性較小的輸入?yún)?shù)接口類型:在執(zhí)行第二步時(shí),應(yīng)該選擇能充分描述過(guò)程對(duì)參數(shù)的要求且累贅最少的任何接口來(lái)替代給定的類類型。參數(shù)對(duì)象要實(shí)現(xiàn)的接口越小,任一特定類能實(shí)現(xiàn)該接口的機(jī)會(huì)就越大。如果有如下這樣一個(gè)方法:
static public boolean areOverlapping(Window window1, Window window2) {...}
該方法旨在判斷兩個(gè)(假定為 rectangular)窗口是否重疊,如果該方法僅要求它的兩個(gè)參數(shù)提供它們各自的 rectangular坐標(biāo),則簡(jiǎn)化這兩個(gè)參數(shù)的類型以反映這一事實(shí):
static public boolean areOverlapping(Rectangular rect1, Rectangular rect2) {...}
以上代碼假定前面的 Window 類型對(duì)象也能實(shí)現(xiàn)Rectangular。現(xiàn)在可以重用任何 rectangular 對(duì)象的第一個(gè)方法中所包含的功能。
三、小結(jié)
以上三步旨在改進(jìn)用更傳統(tǒng)的面向?qū)ο蠓椒ň帉?xiě)的現(xiàn)有代碼。將這三個(gè)步驟與面向?qū)ο缶幊探Y(jié)合使用即可構(gòu)建一種新的方法,可用這種新方法編寫(xiě)以后的JAVA代碼,這樣編寫(xiě)代碼將提高方法的可重用性和內(nèi)聚性,同時(shí)也會(huì)減少方法的相互耦合及復(fù)雜性。