什麼是物件導向程式設計?

已完成

物件導向程式設計 (OOP) 是一種程式設計範例。 其基礎概念為將相關的資料和函式「分組」成資訊「島」。 這些小島稱為「物件」

無論使用哪一種範例,程式都會使用相同步驟以解決問題:

  1. 資料輸入:資料是從某處讀取,可能是檔案系統或資料庫之類的資料儲存體。
  2. 處理資料:資料經過解譯,可能還會被加以改變,以供顯示之用。
  3. 資料輸出:資料經呈現後,便可供真人使用者或系統讀取及互動。

OOP 與程序式程式設計的比較

讓我們透過比較 OOP 和其他範例 (程序式程式設計) 以嘗試定義 OOP。 程序式程式設計會透過呼叫程序解決指定的問題,呼叫程序也稱為函式或方法。 函式和變數的建構是為了解決上述各步驟所描述各種階段問題。

OOP 範例在這方面並無不同。 OOP 看待世界的方式讓其脫穎而出。 相較於程序式程式設計,OOP 會退一步,並擁有較好的全局觀。 OOP 不是只處理資料並將資料帶入下一個階段,而是嘗試了解操作資料的這個世界。 OOP 之所以能夠這麼做,是因為其能「模型化」所看到的內容。

OOP 模型化:識別概念

在模型化階段,您要查看定義域的描述,並嘗試分析有關發生情況的文字。 第一個步驟是找出執行者。 其之所以稱為執行者,是因為其有「動作」並執行動作。 例如,印表機 (執行者) 會列印 (動作)。

找出執行者後,您要查看它們在做「什麼」,亦即其行為。 然後,您要查看執行者的描述,以及執行該動作所需的任何資料。 執行者會成為物件,而特性會編碼為物件上的資料,行為則是同時將新增至物件的函式。

Diagram visualizing a printer printing.

其概念為可透過呼叫物件本身其函式來改變物件上的資料。 另外一種概念,就是物件彼此「互動」以獲得實際結果。

OOP 的優點

那為何要使用 OOP 呢? 為何不使用其他範例呢? 說得更明白一點,OOP 不比其他任何範例更好或更糟。 每種方法都有利有弊。 OOP 有一些不錯的優點,例如:

  • 資料封裝:資料封裝就是向系統的其他部分隱藏資料,只允許某些部分存取。 原因是資料保存「狀態」,而該狀態可由一或多個變數組成。 如果需要同時變更這些變數,您必須保護變數,且只允許透過公開方法存取,讓變更成為可預測。 OOP 具有存取層級之類的機制,讓物件的資料只能由物件本身存取或可公開取得。
  • 簡潔:建置大型系統是很複雜的工作,有許多問題需要解決。 能夠將複雜性拆分成較小的問題 (物件),表示您可「簡化」整體工作。
  • 容易修改:當您倚賴物件,並利用它們建立系統模型時,會更容易追蹤到系統需要修改的部分。 例如,您可能需要更正 Bug 或新增功能。
  • 可維護性:維護程式碼通常很困難,且會隨著時間變得愈來愈困難。 需要嚴守良好的命名形式和明確一致的架構,以及其他要求。 使用物件可讓您更容易找出程式碼需要維護的特定區域。
  • 再使用性:您可以在系統多個部分多次使用同一個物件定義,或許您也可以在其他系統中使用。 重複使用程式碼可節省時間和金錢,因為您需要撰寫的程式碼較少,卻可以更快達到目標。

建立 OOP 系統模型

軟體通常是為了解決需求,讓工作可以更快速、更有效率且更不容易發生錯誤而撰寫。 遇到需要加速進度的情況時,人類敵不過軟體。 使用 OOP 就像是建立練習的模型,因為要撰寫程式碼以執行其邏輯。 模型化就是學習如何識別執行者、所需的資料,以及發生的互動類型。 您只要閱讀對系統的描述即可建立系統的模型。

發票管理系統案例研究

讓我們來看看許多公司的燙手山芋:「發票管理」的手動流程。 許多公司都會收到發票,且需要準時支付。 延遲付款會產生延遲費用,造成金錢的浪費。 但是發票必須先行「處理」才能支付。 發票通常會先過好幾手,才會在某處登錄並予以支付。

此程序通常會從最初的排序階段開始,發票會在此傳送至適當的部門。 接下來,檢查發票的正確性,然後由具有適當授權層級的人員核准。 最後,支付發票。 若為小型企業,可能是企業主自己完成所有步驟。 若為大型公司,則可能涉及許多人和許多程序,使得發票管理成為複雜的活動。

Diagram showing a typical process flow for an invoice system.

此描述和 OOP 有何關係? 如果您採用前述的工作流程 (這通常為手動流程),並將其轉換成已編寫的軟體,您的第一件要務就是嘗試建立系統模型。 在發票管理的內容中,您可藉由閱讀對問題定義域的描述來開始了解執行者 (物件)、行為和資料。

如果將所述的定義域視為具有階段、輸入、處理和輸出,您即可開始填寫如下表中的內容:

階段 問題為何
輸入 發票
加工業 排序、核准、拒絕
輸出 付款

上表描述每個階段中發生的狀況。 您已能夠找到資料、資料在處理期間發生的狀況,以及最終的結果,也就是付款。 此時,仍然可使用您喜歡的任何範例來解決發票管理系統工作流程。 您要如何從這裡進入 OOP?

尋找物件、資料和行為

您可詢問下列問題以尋找系統的不同成品:

  • 互動的雙方是誰?
  • 一方要對另一方做什麼?

記住這類的問題,您即可使用陳述式。 讓我們醒目提示這些陳述式中的不同成品,以清楚顯示系統的重要部分。

  1. 「電子郵件服務」「發票」「傳送」給系統。

  2. 「發票」會按「參考碼」或由「分類人員」手動「排序」,以確保發票到達正確的部門。

  3. 「核准者」會根據「數量」的正確性和大小等因素,「核准」「拒絕」「發票」

  4. 「付款處理器」會依照提供的「付款資訊」來「支付發票」

您現在可擷取這些句子中的物件、資料和行為,並使用資料表加以組織,如下所示:

階段 演員 行為 資料
輸入 電子郵件服務 傳送 發票
輸入 系統 接收 發票
加工業 分類人員或系統 排序或路由 發票 (參考碼)
加工業 核准者 核准或拒絕 發票 (金額)
輸出 付款處理器 支付 發票 (付款資訊)

在發票管理系統的初始描述中發生了許多事。 已找到執行者 (物件)。 已識別重要資料,且已使用識別出的物件進行「分組」。 也找到了行為,使執行者 (物件) 彼此間的互動更加清楚。 如此一來,您就能夠找出「誰對誰」執行了何種行為。 此時您已完成初始分析,這是很棒的開始。 但問題還沒解決,您該如何將此分析轉換成程式碼? 我們要透過本課程模組所得到結果就是此問題的答案。

注意

實際的發票管理系統可能更為複雜,且會依賴更多的資料和邏輯。 能夠以這種方式建立系統模型,表示您使用了結構化的方法思考問題。