理論匯整 - 物件導向的理論重點摘要

一、術語定義

 

物件(Object)

凡是生活中任何具體的人事物,或抽象的概念,皆可稱之為「物件」。若是以程式碼的觀點來看,「物件」就是一個已建立執行個體(Instant),並佔用一段記憶體空間的類別(Class)。

 

導向(Oriented)

這個詞在此處與引導或方向完全無關,若要以中文的思維來理解,導向就是「做為基礎」的意思,以○○為導向,意思就是「以○○為核心價值觀」,或是可以理解成「以○○為中心思想」。

 

物件導向(Object-Oriented)

透過上面對「導向」二字的釋義,就可以進一步將「物件導向」理解為,把「問題領域中的具體人、事、物或抽象概念彼此如何互動」,來當作解決問題的思考基礎與核心價值觀。

 

程序(Procedure)

可理解為解决问题的流程或步驟,最具體的例子大概就是到公部門辦事,或者出國旅遊,兩者都有一定的手續或流程。例如去公部門辦就業證,大致會有這些過程:準備好相關的文件證件和材料→到現場後抽號碼牌等候叫號→提交相關資料→等待審批→審批核準→通知領證。出國旅遊,一樣也有相關的流程要走:確定行程→申辦護照→申請目標國家的簽證→購買機票→按行程出發→到機場辦理登機→出關→登機。

 

程序導向(Procedure-Oriented)

透過前面對「程序」的釋義,同樣可以進一步將「程序導向」理解為,以「需要透過哪些流程或步驟來完成」作為解決問題的思考基礎,或者中心思想。

 

程式(Program)

這個詞的定義,範圍較廣,小從一行指令,幾行有特定用途的程式碼,一個小巧輕便能幫助你完成日常工作的工具,甚至是一套應用軟體,都可稱為程式。若要嚴格區分程式和軟體的差異,可以這麼理解:許多指令的集合,就可以構成不同用途的程式;而不同種類、不同性質的程式,可以組成一套軟體。

 

程式設計(Programming)

將電子化需求之思維,轉換為軟體系統的過程。

 

程序導向程式設計(Procedure-Oriented Programming)

又可稱為結構化程式設計,這是傳統的軟體建構方式,本質就是以軟體系統功能有哪些動作、流程或步驟,來思考如何實現電子化需求。

 

物件導向程式設計(Object-Oriented Programming)

以具體人事物,或抽象人事物之間的互動關係,來思考如何把電子化需求轉換為程式碼,並構築出一套軟體系統的一種理念與過程。

 

二、基礎觀念

 

類別(Class)

將物件轉換為程式碼之後的名稱。換言之,「類別」就是指具體人事物或抽象概念的實作程式碼。類別與物件,為一體之兩面。

 

方法(Medhod)

描述物件(或稱類別)行為的元素,在習慣上會使用動詞命名。

 

屬性(Property)

描述物件(或稱類別)特徵的元素,在習慣上會使用名詞命名。

 

欄位(Field)

外部類別不能直接存取,且只有特定作用範圍的變數,有時也是屬性的成員。

 

抽象(Abstraction)

雖然這並非物件導向領域獨有的概念,但卻是核心中的核心,物件導向的三大特徵,無一不是圍繞著抽象的精神來運作。抽象可以簡化複雜的問題,幫助程式人員建立問題的邊界,為具體的問題找到最適當的類別定義。在實務上,程式人員需要在問題領域中,把可變和不可變抽離。其中不可變的部份,在 C#.Net 是透過抽象類別或介面來定義,而可變的部份,則是透過子類別來定義。例如「武器」是不變的,所以用抽象類別來定義,而「雷射槍」、「手槍」、「自走砲」都屬於武器,而且各自有不同的外觀與操作,因此在外觀的部份,可以用子類別 LaserGun、HandGun、SelfPropelledGun 來定義;在操作方面,則是可以透過介面來定義,例如手槍只能「填彈」、「上膛」、「瞄準」、「扣板機」、「退彈殼」,可以歸在 IHandGunOperation 介面;雷射槍則有「瞄準」、「發射」兩種動作,可以歸在 ILaserGunOperation;而自走砲可能除了「填彈」、「瞄準」、「發射」、「退彈」之外,還可以移動,例如「煞車」、「加速」、「前進」、「後退」、「左彎」、「右彎」等等,屬於 ISelfPropelledGunOperation 介面。

 

封裝(Encapsulation)

係指將資料本身及資料的處理細節,放置於物件中的作法。資料封裝,能使物件的資訊,具有隱藏之特性。例如我們可以撰寫一個物件,讓程式設計師無法直接存取該物件的成員變數,並強迫程式設計師使用成員方法來變更或讀取成員變數內含值。如此即可避免資料成員變數,被有意或無意的取用或篡改。程式設計師只需知道如何呼叫成員方法,無需瞭解成員方法存取哪些成員資料,或是如何實作、呼叫成員方法。整體而言,封裝的目的,除了可達成抽象的資訊隱藏效果之外,主要就是能夠讓程式設計師、物件開發者各司其職、各守其份,彼此有清楚的權責劃分,以期能減低錯誤的發生機會。例如在「抽象」中的例子,雷射槍、手槍、自走砲,都分別繼承武器,並封裝在各自的子類別中,而它們的操作方式,則是封裝在相應的介面中。

 

多型(Polymorphism)

程式設計師能夠在設計開發階段,撰寫相同的指令,編譯器亦能夠在執行階段,根據不同的需求,執行不同的程式片段。而在 .Net C# 的架構中,多型是以繼承以及介面的機制來做基礎,例如我們可以先定義一個叫「球」的抽象類別,並給予一個「尺寸大小」的抽象屬性,再分別建立「籃球」、「網球」、「棒球」類別來繼承「球」,因為每種球的大小都不一樣,所以可以透過繼承抽象類別,來實現屬於自己的「尺寸大小」屬性,並且透過動態聯編,在執行階段決定方法的調用,這樣的作法稱為重寫(override)。又或者我們可以在一個類別裡,定義兩個同名方法,透過不同的參數特徵來區分用途,並且透過靜態聯編,在編譯連結階段就確定方法的調用,這樣的方式稱為多載(overload)。

 

繼承(Inheritance)

係指一個物件可以從其它物件,延續使用某些成員變數或成員方法。被繼承的物件稱為「基礎物件」或「基底物件」,而繼承其它物件的,則稱之為「衍生物件」。繼承,可讓物件開發者撰寫通用的程式碼,並將這些程式碼,以多種用途在不同的程式當中運用,如此即可達成程式碼重覆使用的目的。換句話來說,繼承允許在不改動原程式碼的基礎上做擴充,如此既可保留原來的功能,又可擴展新功能,有利於減少修改程式碼,提升軟體的開發效率。

 

三、類別關係

 

實作(Implementation)

具體形式為介面與類別與間的互生關係。例如在 C#.Net 體系裡,介面就是透過類別來實作。

 

泛化(Generalization)

具體形式為類別與類別之間的繼承、介面與介面之間的繼承,或者類別實作介面等等關係。在語意上來說,是某乙為一種某甲(is-a)的思維。換句話說,泛化所表達的,是類別與類別、類別與介面之間的縱向關係。例如在 C#.Net 裡,具體類別(籃球)就是從抽象類別(球)繼承而來,若是從泛化的語意思維來看,我們可以說籃球是一種球。

 

依賴(Dependence)

具體形式為類別與類別之間,有某種偶然性、臨時性的連結,即某個類別依賴於另一類別的定義;被依賴類別的變化,會影響到使用它的類別。也就是以參數的形式將類別乙傳入類別甲的方法、類別乙是類別甲某個方法的區域變數,或者由類別甲呼叫類別乙的靜態方法。在語意上來說,是某乙需要某甲(use a)的思維。例如在 C#.Net 裡,有個資料上傳工具可以做勾選上傳。在處理勾選上傳的 Transmitter 類別中,就呼叫了 GridViewOperation 類別的 GetCheckedValue 靜態方法,來取得已勾選資料的主鍵。

 

關聯(Association)

可視為一種較深化的依賴關係,具體形式為類別與類別,或類別與介面之間,有一種依賴性較強的關係,即類別乙是類別甲的全域變數。而關聯又可分為單向與雙向。雙向關聯,意指兩個類別互相知道對方的屬性和方法;單向關聯,則是只有一個類別知道另一個類別的屬性或方法。例如 C#.Net 的資料上傳工具,在上傳之前要先將本地資料轉換為 json 格式。在這個例子中,是以 JsonHelper 類別來處理轉換過程。又因為有些資料是主表-明細結構,所以需要再用 Json 類別當作容器,類別裡有主表屬性與明細屬性。於是就可以在 JsonHelper 類別中,建立一個 Json 類別的全域變數,然後讓不同類型的資料,在完成轉換後,分別將主表和明細的 json 內容,傳給 Json 的相應屬性。

 

聚合(Aggregation)

為關聯關係的一種,在語意上就是某甲中有某乙(has-a)的思維。以具體形式來說,就是整體與個體之間的關係,個體可以屬於多個整體,也可以讓多個整體共享。有關聯關係的兩個類別,屬於相同層級,但若是有聚合關係的兩個類別,就不在同一個層級。也就是類別甲可以包含類別乙,但類別乙不是類別甲的既定成員。再換個方式來說,如果類別甲是由類別乙聚合而成,那麼類別甲就包含類別乙的全域成員;若以外界立場來看,類別乙的創建就和類別甲無關,兩者各有自己的生命週期。舉個例子來說明聚合關係:電腦壞了,不代表印表機也不能用,接到別台電腦就行(生命週期不同,可屬於多個整體),若是在辦公室,還能把印表機設定成分享,讓所有同事使用(讓多個整體共享)。

 

組合(Composition)

也是一種關聯關係,在語意上就是有某甲就有某乙(contains-a)的思維。以具體形式來說,就是由代表整體的類別,負責代表個體類別的生命週期,也就是整體和個體兩者的生命週期一致。也就是如果類別甲是由類別乙組成,那麼類別甲就包含類別乙的全域成員,且類別乙必須在類別甲創建之後才能創建。舉個例子說明組合關係:俄羅斯方塊遊戲(遊戲代表整體),遊戲開始後,會陸續出現許多方塊(方塊代表個體,因遊戲開始而生),每個方塊都有不同的形狀,當方塊堆積到最頂端,遊戲即終止,方塊也不再產生(因遊戲終止而滅)。

转载于:https://www.cnblogs.com/hsw1976/p/4971597.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值