對於面向對象設計問題,要設計的對象可能是真實世界的東西,也可能是某個技術任務,不論如何,我們都能以類似的途徑解決。以下解題思路適用於很多問題。
步驟1:處理不明確的地方
面向對象設計(OOD)問題往往會故意放些煙幕彈,意在檢驗你是武斷臆測,還是提出問題以釐清問題。畢竟,開發人員要是沒弄清楚自己要開發什麼,就直接挽起袖子開始編碼,只會浪費公司的財力物力,還可能造成更嚴重的後果。
碰到面向對象設計問題時,你應該先問清楚,誰是使用者、他們將如何使用。對某些問題,你甚至還有問清楚“5W1H”,也就是Who(誰)、What(什麼)、Where(哪裏)、When(何時)、Why(爲什麼)、How(如何)。
舉個例子,假設面試官讓你描述咖啡機的面向對象設計。這個問題看似簡單明瞭,其實不然。
這臺咖啡機可能是一款工業型機器,設計用來放在大餐廳裏,每小時要服務幾百位顧客,還要製作10種不同口味的咖啡。又或者,它可能是設計給老年人使用的簡易咖啡機,只有能製作簡單的黑咖啡就行。這些用例將大大影響你的設計。
步驟2:定義核心對象
瞭解我們要設計的東西后,接下來就該思考系統的“核心對象”了。比如,假設要爲一家餐館進行面向對象設計。那麼,核心對象可能包括餐桌(Table)顧客(Guest)、宴席(Party)、訂單(Order)、餐點(Meal)、員工(Employee)、服務員(Server)和領班(Host)。
步驟3:分析對象關係
定義核心對象之後,接下來要分析這些對象之間的關係。其中,哪些對象是其它對象的數據成員?哪些對象繼承自別的對象?對象之間是多對多的關係,還是一對多的關係?
比如,在處理餐館問題時,我們可能會想到以下設計。
-
宴席包括很多顧客。
-
服務員和領班都繼承自員工。
-
每一張餐桌對應一個宴席,但每個宴席可能擁有多張餐桌。
-
每家餐館有一個領班。
-
分析對象關係一定要非常小心——我們經常會作出錯誤假設。比如,哪怕是一張餐桌也可能包含多個“宴席”(在熱門餐館裏,“拼桌”很常見)。進行設計時,你應該跟面試官探討一下,瞭解你的設計要做到多通用。
步驟4:研究對象的動作
到這一步,你的面向對象設計應該初具雛形了。接下來,該想想對象可執行的關鍵動作,以及對象之間的關聯。你可能發現自己遺漏了某些對象,這時就需要補全並更新設計。
例如,一個“宴席”對象(由一羣顧客組成)走進了“餐館”,一位“顧客”找“領班”要求一張“餐桌”。“領班”開始檢驗“預訂”,若找到記錄,便將“宴席”對象領到“餐桌”前。否則,“宴席”對象就要排在列表末尾。等到其它“宴席”對象離開後,有“餐桌”空出來,就可以分配給列表中的“宴席”對象。
——摘自《程序員面試金典(第5版)》