---
# System prepended metadata

title: 程序導向 vs 物件導向
tags: [OOP]

---

---
title: 程序導向 vs 物件導向
tags: OOP
---


軟體開發的過程
===

往往因見解不同而改了又改，改了又改...
![](https://i.imgur.com/HGJba9D.jpg)
[圖片來源](http://synn-solis.blogspot.com/2009/05/blog-post_30.html)

物件導向的主要優勢在於增加了程式的<font color="#F00">**重用性、靈活性、擴充性**</font>，降低[耦合性](https://zh.wikipedia.org/wiki/%E8%80%A6%E5%90%88%E6%80%A7_(%E8%A8%88%E7%AE%97%E6%A9%9F%E7%A7%91%E5%AD%B8))。


程序導向 vs 物件導向
===

程序導向(Procedure-Oriented)
---

- 主要考慮系統需要逐步執行哪些<font color="#F00">**程序(process)**</font>完成

- 架構是以處理的<font color="#F00">**功能(function)**</font>劃分系統各個模組

物件導向(Objected-Oriented)
---

- 不要先問系統要作到什麼功能，先問有哪些東西可以讓系統做到這些功能！
  主要考慮需以使用哪些<font color="#F00">**物件(object)**</font>交互配合完成

- 架構是以抽象層面處裡，以<font color="#F00">**類別(class）**</font>劃分各個系統模組

- 各類別強調使用<font color="#F00">**方法(method)**</font>完成功能

- 特性：
	1. [封裝(Encapsulation)](https://hackmd.io/@BrianYu36359/HyDVrK_Yd)
	
	2. [繼承(Inheritance)](): 待補
	
	3. [多型(Polymorphism)](): 待補
	
	4. [(抽象)(Abstraction)](): 待補


物件導向如何設計
===

- 必須滿足<font color="#F00">**SOLID**</font>原則:
	1. [單一職責原則 Single Responsibility Principle (SRP)](): 待補
	
	2. [開放封閉原則 Open-Closed Principle (OCP)](): 待補
	 
	3. [里氏替換原則 Liskov Substitution Principle (LSP)](): 待補
	
	4. [介面隔離原則 Interface Segregation Principle (ISP)](): 待補
	 
	5. [依賴反轉原則 Dependency Inversion Principle (DIP)](): 待補

- 可使用<font color="#F00">**UML(Unified Modeling Language)**</font>將系統的功能與結構畫成模型與藍圖，再進行開發。: 待補
    
- 可使用<font color="#F00">**設計模式(design pattern)**</font>，而設計模式（design pattern）是對軟體設計中普遍存在（反覆出現）的各種問題，所提出的解決方案。: 待補


結論
===

| 程序導向                 | 物件導向                                               |
|:------------------------ |:------------------------------------------------------ |
| 效能高、使用記憶體空間低 | 易維護、易復用、易擴充套件、低耦合、符合人類的思維習慣 |


補充
===

其實程序導向的語言也可以仿物件導向的方式撰寫，可參考[這篇](https://hackmd.io/@sysprog/c-oop)。