---
# System prepended metadata

title: Chapter 7 物件導向設計 Object Oriented Design
tags: [提升程式設計師的面試力]

---

###### tags: `提升程式設計師的面試力`

# Chapter 7 物件導向設計 Object Oriented Design
要求描繪類別與方法
以實作技術性問題或真實物件
了解你的程式風格
除了考設計模式
如何建構優雅、可維護的物件導向程式碼

## 如何解題

### 步驟1:處理模糊(認識需求)
題目常故意模糊
測試是否會自行假設或澄清問題
開發者需要搞清楚需求

> 你該問誰使用以及如何使用

檢查六個W
1. who
1. what
1. where 
1. when
1. how
1. why

ex: 咖啡機的物件導向設計
使用案例會大幅影響你的設計

### 步驟2:定義系統的核心物件
ex: 餐廳的物件導向設計
核心物件可能是 Table、Guest、Party、Order、Meal、Employee、Server、Host

### 步驟3:分析物件間的關係
那些物件是其他物件的成員?
有什麼物件繼承其他物件?
有多對多或一對多的關係嗎?

ex: 餐廳的物件導向設計
* Party 應該具有 Guest 陣列
* Server 與 Host 繼承自 Employee
* 每個 Table 有一個 Party ，每個 Party 有多個 Table
* Restaurant 有個 Host

可能會有錯誤的假設
單一 Table 可能有多個 Party

### 步驟4:檢視動作
已完成基本規劃，接下來是物件的動作與相互間的關係，某些物件必須修改設計。
* Party 來到 Restaurant ，Guest 向 Host 要求一個 Table。
* Host 查詢 Reseervation ，若有則指派 Table 給該 Party，不然 Party 就排到後面。
* Party 離開時，Table 被釋放並指派給清單中的 Party。

## 設計模式
Singleton & Factory 設計模式常用於面試。
去閱讀設計模式專書。

## 面試題目

### 7.1 撲克牌:
設計一般撲克牌的資料結構。
說明你如何製作此資料結構的子類別以實作二十一點。
> #153 "牌組"範圍很廣，思考合理範圍
> #275 要如何處理 Ace

* 擁有最高點數的玩家獲勝，其點數必須等於或低於21點；
* 超過21點的玩家稱為爆牌（Bust）。
* 2點至10點的牌以牌面的點數計算，J、Q、K 每張為10點。
* A可記為1點或11點，而2-10則按牌面點數算
* 兩張牌點數相加為21（一張A再加一張價值10點的牌）稱為「二十一點」（black jack）

### 解答
---

![](https://i.imgur.com/eTytXME.png)


### 7.2 客服中心: 
假設客服中心的員工有三個階層:客服、經理、總監。
來電會先分配給有空的客服，
若客服不能處理則轉給經理，
若經理沒空或不能處理則轉給總監。
設計此類別與資料結構。
實作 dispatchCall() 方法分配來電。
> #363 列出必須找出共通演算法的物件。
### 解答
---
![](https://i.imgur.com/S6wRRsi.png)


### 7.3 點唱機:
以物件導向原理設計點唱機。
> #198 先界定問題範圍並列出假設清單。可做出合理假設，但必須明確表示
### 解答
---
每個重要系統元件可以轉換成一個物件，每個動作可轉換成一個方法，讓我們討論一種設計方案。

接下來描述基本系統元件：
* 點唱機
* CD
* 歌曲
* 藝人
* 播放清單
* 顯示器（在螢幕上顯示細節）
接下來進一步細分並思考可能的動作。
* 建立播放清單（包括新增、修改、刪除、與隨機播放)
* CD選擇
* 歌曲選擇
* 安排歌曲
* 下一首

![](https://i.imgur.com/OoGb5Ad.png)

### 7.4 停車場:
以物件導向原理設計停車場。
> #258 停車場是多層的嗎?他支援什麼"功能"?要付費嗎?有什麼車型?

* 停車場有多層。每一層有多列停車格。
* 停車場可停機車、汽車、與巴士。
* 停車場有機車位、小型車、與大型車位。
* 機車可停任何停車位。
* 汽車可停一個小型車或一個大型車位。
* 巴土可停同一列五個連續的大型車位，不能停在小型車位。

![](https://i.imgur.com/vslbyHb.png)
