###### 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)