讀書筆記《Unix程式設計藝術》六
阿新 • • 發佈:2019-02-14
儘量把程式的複雜度從程式碼中轉移到資料中
- 資料比邏輯更容易駕馭,儘可能把設計的複雜度從程式碼轉移到資料中。
- 資料驅動程式設計:
- 把程式碼與程式碼要作用的資料劃分清楚,在需要改變程式邏輯時,只需要編輯資料而不是程式碼
- 例子:語法編輯器需要識別文件中的關鍵字,可將支援識別的關鍵字放在某個檔案中,每次程式執行前讀取,而不是把關鍵字硬編碼在程式中
- 專用程式碼的生成:
- 將一些程式碼的書寫轉移到使用自動化工具來完成
- 例子:可以用C寫一個程式來讀取配置檔案並生成對應的HTML文件
使用者介面設計
- 最小立異原則: 如有可能,儘量允許使用者將介面功能為委派給熟悉的程式來完成。不能委派時,效仿熟悉的程式的工作模式
- 設計介面時,應仔細考慮使用者群體的經驗和知識,嘗試去發現使用者已知程式與自己程式之間的功能相似性,然後效仿已知介面的相關部分
- 評價介面的幾個衡量值:簡潔,表現力,易用,透明和指令碼化能力
- 簡潔:一個事務處理需要的動作時間及複雜度有效的最低上限
- 表現力:介面能觸發相當廣泛的行為。有更強大的功能
- 易用:使用該介面時要求使用者需要記憶的東西
- 透明:對於使用者動作的效果,能自然地給出中間結果,有用的反饋和錯誤通知
- 指令碼化能力:介面能夠容易的被其他程式使用
幾種介面設計模式
- 過濾器模式:
- 接受標準輸入的資料,轉換後將結果傳送到標準輸出。如grep等
- Cantrip模式:
- 沒有輸入與輸出,只產生退出狀態數值。如rm, touch, clear等
- 源模式:
- 沒有輸入,產生輸出。如 ls, ps, who等
- 接收器模式:
- 只接受標準輸入,不傳送任何東西到標準輸出。如lpr等
- 編譯器模式:
- 無標準輸入與輸出,將錯誤資訊傳送到標準錯誤端。如gcc
- ed模式:
- 在程式啟動後需要與使用者進行持續對話
- “引擎和介面分離”模式:
- 將程式的引擎部分(程式的核心演算法和邏輯規則)從介面部分(接受使用者命令,顯示結果,提供歷史記錄等外部互動資訊)分離
- 過濾器模式:
- 介面沉默是金原則:不輸出任何無意義的或表示正確執行的雜亂輸出
複雜度
複雜度的三個來源:程式碼量,介面複雜與實現複雜
由不同的選擇帶來不同的陷阱:
- manularity陷阱: 關注實現或程式碼的規模,將很多底層任務拋給使用者
- blivet陷阱:關注程式碼庫的規模,使用極端晦澀複雜的實現技術,系統複雜度層層疊加,難以除錯
- adhocity陷阱:關注實現複雜度,拒絕使用統一但複雜的方式來解決一整類問題,更願意對問題個體編寫重複,專用程式碼
複雜度的特性:
- 本質複雜度:無法避免的,程式定義的複雜度。如硬體驅動程式必須要關注底層硬體介面引入的複雜度
- 選擇複雜度:為了實現某個期望的功能而引入的複雜度。如編譯器為了支援視覺化引入GUI方面的複雜度
- 偶然複雜度:由於設計不良或錯誤引入的複雜度。如重複程式碼,功能互相干涉的程式碼引入的複雜度