# 單元二 資料抽象化 Data Abstraction ## 物件導向 :::success 物件導向三大特性: >1.封裝 >>在程式碼中設置權限,讓不同的物件之間有不同的存取限制,而不是把所有資料都攤在陽光下讓大家使用。 >2.繼承 >>可以不必一再撰寫重複的程式碼,不只節省心力和時間,更重要的是可以提高程式的可讀性,增加程式的結構化程度,並讓維護和新增功能時更加容易方便、減少錯誤。 >3.多型 >>同一個行為,但有不同的結果,可以讓我們更有彈性的設計,不會被侷限只能永遠特定型別才能被呼叫使用,而是可以不斷延伸擴展出來更多種型別。 在寫大型程式的時候利用物件導向可以大幅降低開發以及維護的時間和難度。 ::: :::warning 缺點 : >「基礎建設」較繁雜龐大。 > 執行效率較差。 > 對於初學者較不友善。 ::: ### Exception(例外處理): 程式在執行過程中可能會發生一些特殊情況的異常,例如:記憶體不夠、越界存取,所以我們可以用 try catch 來處理這種例外情形 可以防止程式因為特別的異常而直接終止。 #### 常見的exception |例外種類 |說明 | -------- | -------- | |std::exception |所有標準 C++ 例外的父類 |std::bad_alloc| new 配置記憶體失敗時拋出,可能是記憶體不足 |std::bad_cast |dynamic_cast 失敗時拋出 |std::bad_exception |無法預期的例外 |std::bad_typeid |typeid 拋出 |std::logic_error |程式碼邏輯異常拋出 |std::runtime_error| 執行期間的例外 |std::domain_error| Domain error exception |std::invalid_argument |無效的參數時拋出 |std::length_error| 建立長度太長時拋出,例外:std::string |std::out_of_range |存取越界時拋出,例如:std::vector |std::overflow_error| 溢位時拋出 |std::range_error |Range error exception |std::underflow_error |算術下溢時拋出 ## 抽象化: 抽象化並非實作,因此不該把這兩個混為一談。 ### Functional Abstraction 功能抽象化 僅描述某個 method 提供哪些功能。 ### Data Abstraction 資料抽象化 描述如何操作一組資料,而不是實作。 ### Abstract Data Types(ADT) 抽象資料型別 是一堆資料的集合,和一組針對資料的操作。 ## ADT(抽象資料型別) 用於設計與分析演算法、資料結構及軟體系統當中,而一個抽象資料型別通常定義了**資料型別(values)和操作方式(operations)** 可藉由不同的Data Structure來實作。 常見的ADT |No. |ADT |重點 | -------- | -------- | -------- | |1 |Set |每個物件只會出現一次,且無順序性 |2 |Sequences/List |每個物件可出現多次,且有順序性 |3 |Dictionary/Map |key-value pairs的集合物件,Key在此集合物件中不會重複 |4 |Stack |Last In, First Out(LIFO) |5 |Queue |First In, First Out(FIFO) |6 |Priority Queue |有優先等級的Queue,在Dequeue時會依照優先等級取值 |7 |Graph |由節點和關聯組成,在計算路徑時可以用 |8 |Tree |為沒有環狀的Graph,相比List可以有效率的儲存以及尋找資料。 ## C++ class :::success C++是一個物件導向的語言,因此有class 至於C語言,並沒有class ::: 類別是物件的藍圖。 C++ 中設計類別使用關鍵字 (keyword) class ,後面接大括弧宣告類別的成員 (member) ## Namespace 提供其內識別項 (類型、函式、變數等的名稱) 範圍的宣告式區域。 防止特別在程式碼基底包含多個程式庫時可能會發生的名稱衝突。