談系統設計之面向對象設計方法
誤解
剛開始出道,從事C++編程,也瞭解了面向對象設計方法。
但是,那時以爲只有像C++、JAVA這樣的開發語言,纔有面向對象這種設計方法。
無處不面向對象
後來,到了HW公司後,從事內核開發,Linux 內核文件系統的瞭解,才發覺 “面向對象”無處不在。
Linux 內核設計也無處不面向對象,比如設備驅動模型、文件系統等都是採用面向對象的設計精髓。
舉個例子,Linux 的文件系統:
圖一:FILE
在Linux 中對每個文件抽象一個結構體File,該結構體含有一個成員文件的操作函數集合。
用面向對象的角度來說,是一個類File,一個類的FileOperationInterface,這兩個類再不同的文件系統類型中,是跟不同的
具體實現組合起來,滿足不同的文件系統的操作。
從而Linux 可以很方便地支持多種文件系統,只要各種文件系統根據接口契約來實現,就可以。
因此,面向對象設計的精髓:
1)抽象,尤其是對變化的地方,進行抽象,不同的文件系統可能根據其不同的空間管理、格式,讀、寫操作可能不一樣,
因此通過抽象的方式抽象一個文件操作函數集合。
2)針對接口編程,接口是一種契約,大家根據這種契約進行實現,就可以達到兼容、擴展、替換。
3)封裝,將變化的地方封裝成一些接口(類),防止不穩定的因素在整個系統中擴散。
4)組合,就像一個File 結構體 和不同的File 操作實現組合,形成了不同文件系統的特有操作。
再舉一個Linux 內核的CACHE,在Linux 內核中,Cache 支持一下的類型:
1)普通文件數據的緩存頁面(page)
2)目錄項的緩存頁面
3)塊設備文件的塊數據緩存頁面
4)進程用戶態數據的緩存頁面
5)特殊文件的緩存頁面,比如進程間通信的頁面SHM。
所有的緩存頁面是通過頁高速緩存來處理,打個簡單的比方是採用一個通用的線程來對這些不同類型的緩存進行預讀、刷盤、同步、刪除等操作。
通用也是利用面向對象的方法來處理:
圖二:CACHE
設計模式
藉此也談下對設計模式的一些看法,早期我學設計模式是4年前,那時沒有什麼工作經驗,因此實現任務時候,
總是想拿設計模式來套,結果是每次都會寫很多多餘的代碼,或者每次編碼總是寫塊頭很大的代碼。
其實,這也是早期沒有領會到本質,先生搬硬套,固化固化。
其實設計模式的本質是:
1)抽象
2)封裝、繼承
3)優先採用組合
關鍵是對問題的理解,從而發現適當的模式。
也就是說你面臨的問題是什麼,有不穩定的因素嗎?即存在變化點。
如果這是存在變化點,你就要去抽象、封裝。然後,你要考慮是耦合問題,以及考慮繼承是否會導致膨脹。
這時你的策略就是優先採用組合。
架構模式
架構這個問題太深了,但是架構常見的解決方法就是:
1)分層
2)抽象