2023-06-11|閱讀時間 ‧ 約 5 分鐘

實戰系列『影像處理軟體設計』- [2] 物件導向理論簡介

一、類別

類別是物件導向領域裡最基礎的概念,也是物件導向分析和設計的基石。
所謂類別,就是站在個人的觀察角度,具有相似點的事物,就是同一類。

二、物件導向類別

物件導向的類別由兩部份組成:屬性和方法。
屬性:類別具有的特性。
方法:類別具有的功能。
實際設計程式時,可以用『屬性是名詞,方法是動詞』來判斷。
舉例來說:
這張數位影像的長度為 100 像素,寬度為 50 像素,色彩深度為 24 位元,這裡的長寬及色彩深度就是『數位影像』的屬性;
想獲取點位置在 X 50 像素,Y 在 20 像素的 RGB 彩色值,這裡的『獲取彩色值』就是『數位影像』的方法。
設計屬性的一個基本原則:屬性最小化原則,即『屬性不可再分』。
設計方法看似簡單,看到動詞就是一個方法,但實際操作遠沒這麼簡單。舉例來說:獲取彩色值用在 24 位元影像、32 位元影像跟 8 位元影像,都是同一個方法嗎?
如果都在同一個方法內,這個方法如何區分要獲取多少位元的數位影像呢? 只能增加一堆 if-else 來區分。
如果後續要新增獲取不同彩色空間的彩色值時,不就只能一直增加判斷式,變成大雜燴。
這裡引出設計方法的一個基本原則:方法單一化原則,即『一個方法只做一件事』
範例程式碼:

三、物件

物件就是一個真實存在的類別,物件導向是對現實世界的模擬,那物件就是現實世界存在的『物體』。
真正在軟體運行過程的是『物件』,而不是『類別』。
類別』是程式撰寫時,由程式人員分析歸納而來。
軟體類別:軟體設計過程中歸納總結出來的分類。
軟體物件:軟體實際運行過程中存在的物件。
軟體類別是對現實類別的模擬,但不是簡單的等同。除了實作現實類別相對應的功能,還會創造出許多現實中不存在的類別。
這個創造過程正是各種設計方法、設計模式、設計原則大顯身手的地方。

四、抽象類別

抽象類別是一種特殊的類別,它只能用於繼承,不能用來產生實體為具體的物件。
為什麼需要抽象類別? 為何要設計一種只能繼承,而不能產生實體的類別?
從設計的角度來看,抽象類別是根據類別抽象出來的,例如從鳳梨、芭樂、柳丁幾個普通類別,抽象出水果這個類別。但真的吃的時候,並沒有辦法吃的一個名為水果的東西。
從實作的角度來看,抽象類別與實作類別的不同之處在於:有的抽象類別擁有抽象方法(方法只有宣告,沒有定義),子類別必須自己定義這些抽象方法,而不能像普通的方法一樣,透過繼承就能獲得父類別的方法。

五、物件導向的三大核心特徵

封裝、繼承、多型是物件導向的三大核心特徵,判斷一種程式語言是否為物件導向的程式語言,就看其是否支援這三大核心特徵。
封裝資料的主要原因是『保護隱私』。在程序導向的設計中,資料結構是公開的,任何能取得資料的人都可以隨意修改,也允許以不同的方式修改。
如果資料被改錯了,那麼其他依賴此資料的函式會受到影響,甚至造成程式崩潰。
物件導向的類別封裝屬性後,對屬性的修改只能透過類別的方法進行,一來不會曝露內部的具體屬性;二來對屬性都是統一的操作,不會出現亂修改的情況。
封裝方法的主要原因是『隔離複雜度』。每個類別只需要關注自己負責的功能如何完成即可,如果需要其他類別配合,僅需呼叫類別的方法,而不用瞭解其內部的具體實作。
在現實世界中也常看到『隔離複雜度』的例子。例如想看電視只要輕輕一按搖控器按鈕,就可以看到電視節目的影像了,究竟電視機怎麼運作的,大多數人不知道也不關心。
讓我們用封裝範例來解釋『無封裝』的程序導向和『有封裝』的物件導向差在哪裡。
程序導向 = 演算法 + 資料結構
這裡的資料結構是公開的,每個地方都能看到和引用,否則程序導向中的各個處理流程就沒辦法處理。
實作程式碼如下:
物件導向 = 物件 + 互動
實作程式碼如下:

六、物件導向的封裝有三種方式

public
這種方式就是不封裝,直接對外公開。

protected
這種封裝方式對外不公開,但對朋友(friend)或子類別公開。

private
這種封裝方式對誰都不公開。

七、繼承

繼承是物件導向語言最基本的特徵,如果一種語言沒有繼承機制,就說不上是真正的物件導向語言。
在物件導向中,繼承的實際意義可以用遺傳來形容,程式設計師決定父類別遺傳什麼給子類別。

八、多型

在物件導向領域中,多型的真正涵意是:使用指向父類別的指標或參照,便能呼叫子類別的物件。
以下用實作程式碼來說明:
多型的特性,在物件導向程式設計領域具有十分重要的作用。多型遮罩了子類別物件的差異,允許呼叫者寫出通用的程式碼,而無須針對每個子類別撰寫不同的程式碼。
分享至
成為作者繼續創作的動力吧!
從 Google News 追蹤更多 vocus 的最新精選內容從 Google News 追蹤更多 vocus 的最新精選內容

作者的相關文章

一個工程師的創業之旅的沙龍 的其他內容

你可能也想看

發表回應

成為會員 後即可發表留言
© 2024 vocus All rights reserved.