# Object Oriented Programming

> 介紹物件導向程式設計的核心概念，及三大支柱。

## 歷史：

物件導向程式設計的雛形，早在1960年的Simula語言中即可發現，當時的程式設計領域正面臨著一種危機：**在軟硬體環境逐漸複雜的情況下，軟體如何得到良好的維護？**

物件導向程式設計在某種程度上通過強調**可重複性**解決了這一問題。20世紀70年代的Smalltalk語言在物件導向方面堪稱經典——以至於30年後的今天依然將這一語言視為物件導向語言的基礎。 (copy from Wiki)

## 從高階語言的設計發展來看，大概可分為四個部分：

### 1. 非結構化程式設計 (Unstructured Programming)

非結構化程式設計把所有的敘述寫在主程式(main)中去執行，資料都設為全域(global)，可想而知規模稍為大一點的程式會讓程式碼變得很凌亂，而且不易維護，同樣的動作就複製同樣的程式碼去達成目標。

### 2. 結構化程式設計 (Structured Programming)

結構化程式設計引入了函數(function)及回傳(return)的概念，把一些程式碼敘述包成函式讓主程式呼叫使用。一樣的動作就呼叫一樣的函數。

### 3. 模組化程式設計 (Modular Programming)

隨著程式的規模越來越大，結構化程式設計會有越來越多的函數，產了管理不易的問題。模組化的概念就是把功能相似的函數包成一個模組，主程式跟各模組要求資料、函數來達成所需要的功能。

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

同樣的，更多的模組只會讓程式變得更複雜。而且資料在模組中是全域的，無法完整的描述現實世界的情況。物件導向程式設計以『資料』為主體構成物件，物件有其『方法』可以與別的物件進行運作。

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

把真實世界的事物抽象化為物件。

### 抽象化？ Abstraction?

舉個例子，試著描述何謂電腦，底下是五個人的回答：

A：一種計算設備。

B：由滑鼠、鍵盤、螢幕、主機構成的裝置。

C：可以提供服務、解決問題的物品。

D：一種可以讓你熬夜爆肝的惡魔玩具。

E：可以快速執行指令的東西(?。

不管你的答案是什麼，你在腦海裡試著描述的這個動作就叫『抽象化 (Abstraction)』。 一般來說抽象化的越詳細，越能表述你想要描述的物體，但實務上還是要依現實需求去思考抽象化的程度。

### 好處？ Benefits?

1. 程式的可重複利用性 (Reusability)

   程式設計師可以重複的使用母類別(super class)的程式。
2. 軟體原型 (Software Prototyping)

   類別的發展可以視為一顆軟體IC，使系統的開發更簡單且有效率。

## 三大支柱：

1. 封裝 (Encapsulation)
2. 繼承 (Inheritance)
3. 多型 (Polymorphism)

接下來章節會討論OOP三大支柱。

要知道的是，物件導向只是一種『設計概念 (design concept)』，而不是一種程式語法，只是Java是純物件導向，所以要學Java一定要弄清楚物件導向。

設計類別要從『資料(data)』的觀點出發，而不是從方法的觀點。以資料為主體產生類別，再去設計其方法(method)。

設計重點要在於物件之間的互動(interaction among objects)，而非流程控制(control flow)。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://yubin551.gitbook.io/java-note/object_oriented_programming.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
