1. 程式人生 > >讀書筆記《Unix程式設計藝術》六

讀書筆記《Unix程式設計藝術》六

儘量把程式的複雜度從程式碼中轉移到資料中

  • 資料比邏輯更容易駕馭,儘可能把設計的複雜度從程式碼轉移到資料中。
  • 資料驅動程式設計:
    • 把程式碼與程式碼要作用的資料劃分清楚,在需要改變程式邏輯時,只需要編輯資料而不是程式碼
    • 例子:語法編輯器需要識別文件中的關鍵字,可將支援識別的關鍵字放在某個檔案中,每次程式執行前讀取,而不是把關鍵字硬編碼在程式中
  • 專用程式碼的生成:
    • 將一些程式碼的書寫轉移到使用自動化工具來完成
    • 例子:可以用C寫一個程式來讀取配置檔案並生成對應的HTML文件

使用者介面設計

  • 最小立異原則: 如有可能,儘量允許使用者將介面功能為委派給熟悉的程式來完成。不能委派時,效仿熟悉的程式的工作模式
  • 設計介面時,應仔細考慮使用者群體的經驗和知識,嘗試去發現使用者已知程式與自己程式之間的功能相似性,然後效仿已知介面的相關部分
  • 評價介面的幾個衡量值:簡潔,表現力,易用,透明和指令碼化能力
    • 簡潔:一個事務處理需要的動作時間及複雜度有效的最低上限
    • 表現力:介面能觸發相當廣泛的行為。有更強大的功能
    • 易用:使用該介面時要求使用者需要記憶的東西
    • 透明:對於使用者動作的效果,能自然地給出中間結果,有用的反饋和錯誤通知
    • 指令碼化能力:介面能夠容易的被其他程式使用
  • 幾種介面設計模式

    • 過濾器模式
      • 接受標準輸入的資料,轉換後將結果傳送到標準輸出。如grep等
    • Cantrip模式
      • 沒有輸入與輸出,只產生退出狀態數值。如rm, touch, clear等
    • 源模式
      • 沒有輸入,產生輸出。如 ls, ps, who等
    • 接收器模式
      • 只接受標準輸入,不傳送任何東西到標準輸出。如lpr等
    • 編譯器模式
      • 無標準輸入與輸出,將錯誤資訊傳送到標準錯誤端。如gcc
    • ed模式
      • 在程式啟動後需要與使用者進行持續對話
    • “引擎和介面分離”模式
      • 將程式的引擎部分(程式的核心演算法和邏輯規則)從介面部分(接受使用者命令,顯示結果,提供歷史記錄等外部互動資訊)分離
  • 介面沉默是金原則:不輸出任何無意義的或表示正確執行的雜亂輸出

複雜度

  • 複雜度的三個來源:程式碼量,介面複雜與實現複雜

  • 由不同的選擇帶來不同的陷阱:

    • manularity陷阱: 關注實現或程式碼的規模,將很多底層任務拋給使用者
    • blivet陷阱:關注程式碼庫的規模,使用極端晦澀複雜的實現技術,系統複雜度層層疊加,難以除錯
    • adhocity陷阱:關注實現複雜度,拒絕使用統一但複雜的方式來解決一整類問題,更願意對問題個體編寫重複,專用程式碼
  • 複雜度的特性:

    • 本質複雜度:無法避免的,程式定義的複雜度。如硬體驅動程式必須要關注底層硬體介面引入的複雜度
    • 選擇複雜度:為了實現某個期望的功能而引入的複雜度。如編譯器為了支援視覺化引入GUI方面的複雜度
    • 偶然複雜度:由於設計不良或錯誤引入的複雜度。如重複程式碼,功能互相干涉的程式碼引入的複雜度