# Object Oriented Design 物件導向設計

物件導向程式設計的題目通常敘述會很複雜，因為這類型的題目是希望可以模擬處理現實生活的問題，因為現實生活中，「資料」是會一直變動的，要考慮的邊角案例也多，而一般的演算法考題的輸入通常都是固定的，所以我們通常不用擔心運算途中，資料有增、刪、改的行為。

我的心得是物件導向程式設計的題目，首先要先想清楚資料應該要用什麼樣的資料結構來做處理，常見的 [LRU Cache 最久未使用演算法](https://garylai.gitbook.io/algorithm-and-data-structure/classic-problems/cache/lru-cache) 、 [LFU Cache 最近最少使用演算法](https://garylai.gitbook.io/algorithm-and-data-structure/classic-problems/cache/lfu-cache) ，其實問題核心的底層是我們要怎麼建立起需要的資料結構？像是題目中的雙向 `Linked List` 加上 `Hash Table` 的組合。如果說要幫助在面試時減少失誤，是不是可以想起來程式語言有類似的 API 可以實作？例如： LRU 題目中，真的非常非常清楚了概念後，絕大多數的時間是要實踐 `Linked List + Hash Table` ，不過在 Java 中可以用 `LinkedHashMap` 取代，在 Python 中，可以用 `OrderDict` 取代，我相信如果可以很清楚理解演算法加上清楚的資料結構理解，在面試的時候使用這些比較進階的 API 是會被允許的，當然如果面試的職位是需要實踐很多底層資料結構、演算法的職位，那被要求要從零寫出也是有可能的。

第二個難點是如何考量時間複雜度，因為物件導向設計的題目通常不會是一個資料結構可以完成的，又會有很多增、刪、查、改的操作，當選擇物件導向的題目的時候，也要考慮是重度寫、重度讀還是讀寫各半？最常見的就是現實世界資料是會一直進來的，一直進來的同時，我們又要一直保持著資料的排序，那我們應該是要在加入的時候就排序好？還是要在查詢的時候排序好？或是只要有操作就要檢查排序？當然也可以在一開始就想那有沒有什麼好用的有序資料結構？

第三個難點是「Corner Case 邊角案例」，物件導向設計的時候要考慮的情境非常多！這時候最好是可以將各種情況用狀態機的方式呈現，這樣在寫出來的時候，我們就可以透過狀態機的情況，去一個一個檢查，在程式中是否有考量到所有的情況。

最後是要注意的事項是，題目只會寫出主要的 API ，但是多數時候要自己去想是不是需要額外的變數，或是額外的函式可以幫助解題，有些操作是很重複的，例如 [Trie](https://garylai.gitbook.io/algorithm-and-data-structure/problems/trie) 這種資料結構非常愛考物件導向程式設計題，在其增、刪、查、改的時候都會要從頭遍歷，在面試時不求一定要寫出來，不過會很建議多練習，多試幾次後，就容易把需要整理出來的程式碼給整理好，可以減少寫錯的機率。


---

# 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://garylai.gitbook.io/algorithm-and-data-structure/problems/object-oriented-design.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.
