物件式程式設計方法 作者:夏寒 (轉)

worldblog發表於2008-01-06
物件式程式設計方法 作者:夏寒 (轉)[@more@]

式設計方法 作者:夏寒 

  本世紀60年代中期,物件式語言誕生,和以前傳統的程式設計方法相比,物件式程式設計給我們開闢了全新的"視聽"空間,物件式程式設計引進了異於以前過程式程式設計的概念和術語;怎樣用物件式程式設計方法實現中的規則集......

  本世紀60年代中期,物件式語言誕生,和以前傳統的程式設計方法相比,物件式程式設計給我們開闢了全新的"視聽"空間,物件式程式設計引進了異於以前過程式程式設計的以下幾個概念和術語:
  1、物件,物件式程式設計中的物件是物件式程式執行中的概念,是類的例項化,它模擬了現實世界中具體存在的物件,有自己的屬性(包括自己特有的屬性和同類物件的共性)。屬性的作用有:與其他物件通訊,表現為特徵;反映自身狀態變化,表現為當前的屬性值。因此,靜態的看,物件式程式設計中物件可以表示為(介面,資料,操作),動態的看,物件可表示為具有輸入輸出功能的自動機。
  2、類,是物件式程式中的一個靜態概念,它是對客觀世界中一組具有共同屬性的事物的抽象,類提供的是物件例項化的模板,它包括了這組事物的共性,在程式執行過程中,類只有被例項化成物件才起作用。類的概念是物件式程式設計的基本概念,是支援模組化設計的設施。
  3、繼承性,反映的是類與類之間抽象級別的不同,根據繼承與被繼承的關係,可分為衍類和基類,基類也稱為父類,衍類也稱為子類,正如"繼承"這個詞給我們的字面提示一樣,子類將從父類那裡獲得所有的屬性和方法,並且可以對這些獲得的屬性和方法加以改造,使之具有自己的特點。一個父類可以派生出若干子類,每個子類都可以透過繼承和改造獲得自己的一套屬性和方法,由此,父類表現出的是共性和一般性,子類表現出的是個性和特性,父類的抽象級別高於子類。繼承具有傳遞性,子類又可以派生出下一代孫類,相對於孫類,子類將成為其父類,具有較孫類高的抽象級別。繼承反映的類與類之間的這種關係,使得程式人員可以在已有的類的基礎上定義和實現新類,所以有效的支援了構件的複用,使得當需要在中增加新特徵時所需的新程式碼最少。
  4、多型性,與一名多用、動態定連緊密聯絡在一起。多型的一般含義是,某一論域中的元素可以有多種解釋。多型性在形式上表現為一個方法根據傳遞給它的引數的不同,可以呼叫不同的方法體,實現不同的操作。將多型性對映到現實世界中,則表現為同一個事物隨著環境的不同,可以有不同的表現形態及不同的和其他事物通訊的方式。動態定連是將方法名與相應的方法體聯絡起來的設施,它使得特徵能自動適用於物件。將多型的概念應用於物件式程式設計,增強了程式對客觀世界的模擬性,使得物件式程式具有了更好的可讀性,更易於理解。程式設計語言中提供了多種支援多型的設施,如一名多用、類屬,繼承機制是物件式語言中所特有的支援多型的設施。
  5、動態定連,正如上所講,動態定連是與多型相關聯的概念,動態定連側重於實現級,它所實現的功能就是將變數與其值、過程呼叫與相應可程式碼的確定和關連。對於多型變數來說,編譯時刻只能確定其多型變化的範圍(即動態型別集),對多型操作來說,實現該操作的程式碼只能在執行時刻確定。動態定連設施增加了程式設計語言的簡明性和易擴充性。
  物件式程式設計基於上述的基本概念,與傳統程式設計方法相比有了很大的改進。傳統程式設計方法是基於功能的、自頂向下的"黑箱法";物件式程式設計方法是基於物件的,自底向上?quot;白箱法"。與物件式程式設計方法相比,傳統程式設計方法在以下幾點上存在著明顯的不足:
  1、"黑箱法"是基於功能的,功能是易變的,因而程式具有不穩定性、易變性,難以適應系統進化中的變動,往往功能的變化就意味著重新設計。
  2、"黑箱法"不能對客觀世界進行直接模擬,因而從概念上講是間接的,人機互動語言的自然性較差,增加了程式開發人員維護程式的難度。
  3、"黑箱法"基於功能,導致了程式的層次感較差,可擴充性、可移植性均較差,軟體構件難以複用,軟體的開發通常無法借用已有的勞動。
  物件式程式設計方法------"白箱?quot;,在以下幾點有明顯的優勢:
  1、 用"類"、"物件"的概念直接對客觀世界進行模擬,客觀世界中存在的事物、事物所具有的屬性、事物間的聯絡均可以在物件式程式設計語言中找到相應的機制,物件式程式設計方法採用這種方式是合理的,它符合人們認識事物的規律,改善了程式的可讀性,使人機互動更加貼近自然語言,這與傳統程式設計方法相比,是一個很大的進步。
  2、 物件式程式設計方法是基於問題物件的,問題物件的模板是現實世界中的實在物件,物件式程式設計從內部結構上模擬客觀世界,與基於功能模擬的傳統程式設計方法相比,問題物件比功能更穩定,功能也許是瞬息萬變的、也許一天變一個樣、也許十天半月變一個樣,而問題物件卻相對穩定,因而模擬問題物件比模擬功能使得程式具有較好的穩定性,也減輕了程式人員的工作難度。
  3、 物件式程式中提供了若干種增加程式可擴充性、可移植性的設施。如繼承設施、多型設施、介面設施。繼承設施和多型設施前已提及。介面是一個物件供外部使用者呼叫的設施,外部使用者透過呼叫一個物件的介面對該物件進行操作,完成相應功能,使得該物件的狀態改變,或對其他物件進行動作,以實現生成新的物件或與其他物件通訊的目的。介面設施的設定還有諸多益處,介面可看作一個物件與外界保持聯絡的視窗。一個物件透過介面從外界獲得資訊,也透過介面將資訊傳遞出去,體現出一個物件由生成到活動到消亡的整個過程,介面的設定體現了物件的自治性和封閉性。自治性如上所述,物件透過與外界的訊息傳遞,完成一個活動週期(生成,活動,消亡),物件與外界的訊息傳遞都是透過介面完成的;封閉性是指物件僅僅透過介面與外界互通訊息,實現自身狀態的改變,外界不可以直接對物件狀態進行操作,物件內部的私有屬性是對外界遮蔽的。在某些物件式程式設計語言中,如,介面還可以實現類間的多重繼承功能,並且避免了通常的多重繼承也稱為"鑽石繼承"所帶來的屬性繼承路徑不確定的問題。說明一個介面型別,以介面型別作為父類的子類只繼承父類的約定而不繼承實現,透過這種方法來解決實現的繼承屬性中路徑不確定的問題,同時又實現了多重繼承功能。
  4、 物件式程式中類與類之間的關係有繼承關係、引用關係,這兩種關係模擬了客觀世界中事物間"是"和"有"的關係。當客觀世界中存在兩種事物,假設為事物A和事物B。如果A和B之間存在A中"有"B這樣的關係,那麼在用物件式程式模擬的時候,我們需要在類A和類B之間建立允引關係,A為引用類,B為允用類,且A中存在變數設為x,有x:B這樣的語句;如果A和B之間存在"是"這樣的關係,如A是B的一種特例,那麼在用物件式程式模擬的時候,類A和類B間是繼承關係,A為衍類,B為基類,在實現類A的繼承部分,需要有Inherit B這樣的語句。類間這兩種關係的引入,給程式人員提供了很大的方便,可以在系統原有的類的基礎上生成新類,節省了時間和空間。

  下面以我在專案中所用到的物件式程式設計為例,說明我對物件式程式設計的認識。
  防火牆是用來維護網路的有效工具。我們在專案中開發的防火牆產品由包過濾和各級應用構成,包過濾和應用代理透過配合工作可以有效實現保護內部網安全、阻止外部網訪問內部網的功能,但是包過濾和應用代理怎樣區分哪些是允許訪問內部網的,哪些是允許訪問誆客??衿韉撓沒В?餼託枰?幸桓鍪孿仍級ǖ墓嬖蚣??謖飧齬嬖蚣?薪?魅飯娑ê戲ǖ腎P(範圍)、合法的、合法的訪問時間、以及特定的使用者透過特定的IP(範圍)在特定的時間段裡可以享受的特定服務,規則集中的每條規則應至少包括以下幾個域:使用者名稱、信源的IP地址、信宿的IP地址、使用者要求的服務名、防火牆對使用者的訪問做出的動作,包括接受,拒絕,、規則發揮作用的有效時間,包括起始時間和結束時間,透過使用規則,來包過濾和應用代理的行為,產生拒絕某個使用者訪問,拒絕從某個IP來的訪問的效果。
  以下討論的便是怎樣用物件式程式設計方法實現防火牆中的規則集。根據物件式開發過程,首要工作是識認應用領域中的基本物件及其相互關係,將客觀世界中的實在物件抽象問題物件,透過對防火牆應實現的各功能的分析以及對各功能模組之間關係的分析,我們確定防火牆的規則集應起到約束各功能模組工作的作用,規則集應作為包過濾、應用代理模組工作的指導模組而存在,各功能模組在發揮具體功能前應先檢查規則集,透過傳遞給規則集相關引數,實現與規則集模組的通訊,匹配每條規則,獲得從特定IP來的特定使用者在特定時間裡訪問內部網的特定時該功能模組應該採取的動作,是允許訪問、拒絕訪問、認證使用者身份、還是跟蹤使用者訪問資訊,透過以上分析,我們明確了我們所要實現的規則集是由若干條單個規則,經過組織後形成的集合,每條規則由相關的域組成。防火牆規則集若作為一個具有自治性、封閉性的物件實體,還需要有和其他物件實體通訊的能力,如防火牆管理員要能夠對規則集進行各種操作,包括規則的新增、刪除、檢查,將這些用物件式程式設計語言實現的話,就表現為規則集類的移出特徵,在問題物件中規則集也需要有相應的特徵。因為規則集是由規則組成的,每條規則有自己獨立的域,對規則集的匹配實際上是對每條規則的匹配,因此每條規則需要有匹配這樣的對外屬性,規則集與規則的關係?quot;有"的關係,將規則抽象成另一個問題物件,規則類與規則集類存在允引關係。這樣我們便完成了由實在物件向問題物件的轉化,下一步便是確定該用什麼樣的物件來模擬問題物件。根據最常規的表示方法,規則集用連結串列表示,連結串列中的每個元素表示一條規則,連結串列有表頭和表尾,連結串列中的每個元素用一個指標指向下一個元素,基於連結串列的操作有:AddRule,表示新增一條規則;RemoveAll,表示刪除所有規則;CheckRule,表示檢查規則集,同時返回檢查結果。規則用另一個類表示,類中的各個屬性對應於規則中的各個域:RuleID,是每條規則相互區別的唯一標誌;UserList,表示使用者名稱;DestBegin,DestEnd,表示信宿的IP範圍;Begin,SourceEnd,表示信源的IP範圍;DestPortBegin,DestPortEnd,表示信宿的埠範圍;Action,表示匹配成功的功能模組應該採取的動作;BeginTime,EndTime,表示規則有效的起止時間;ServiceName,表示允許的服務名;NextItem,指向下一條規則。規則類上的操作有:CheckRule,表示規則的匹配,它需要分別對規則的使用者名稱、信源IP、信宿IP、信宿埠、有效時間進行匹配,它是對規則集類中CheckRule的具體實現。這樣確定了計算機物件後,就可以著手實現了,以下是我們實現規則集和規則的例子:(用C++程式碼表示)
class CRule
{
private:
CRule_Item *pRuleListHead, //表頭
*pRuleListTail; //表尾
public:
CRule(void);
~CRule(void);
... ...
void RemoveAll(...);
void AddRule(...);
bool CheckRule(...);
};
class CRule_Item
{
public:
int RuleID; //目標規則號
CUserList UserList; //使用者名稱
unsigned int DestBegin,DestEnd; //All in order
unsigned int SourceBegin,SourceEnd;
DestPortBegin,DestPortEnd;
char Action; //動作
SYSTEMTIME BeginTime; //規則有效的起始時間
SYSTEMTIME EndTime; //規則有效的結束時間
CString ServiceName;
CRule_Item *NextItem;

private:
... ...
bool IsSourceValid(...); //判斷信源IP是否有效
bool IsDestValid(...); //判斷信宿IP是否有效
bool IsDestPortValid(...); //判斷信宿埠是否有效
bool IsTimeValid(...); //判斷是否為規則的有效時間
bool IsUserValid(...); //兩個IsUserValid是函式多型
bool IsUserValid(...); //表示的例子,判斷使用者名稱是否有 效
public:
CRule_Item(void);
~CRule_Item(void);
bool CheckRule(...);
};
  注:用"..."表示的部分在程式中已經實現,在這裡略去。
  我們在專案實現中透過利用物件式程式設計方法,充分感受到它的種種便利之處,透過它編出的程式有了較好的可讀性和可複用性,便利了程式人員,也便利了普通使用者。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-996738/,如需轉載,請註明出處,否則將追究法律責任。

相關文章