Classes vs. Data Structures 讀後思考

Bob 大叔前天更新了博客 Classes vs. Data Structures , 對 面向對象中的 Object 與面向過程當中的 Data Structure 做了一番比較,頗有意思。html

在文章中,Bob 大叔經過問答的形式,從 Class 與 DataStructure 的定義中推導出Class 與 Data Structure 是一對相對的存在。二者在三方面存在相對關係:編程

  • Classes make functions visible while keeping data implied. Data structures make data visible while keeping functions implied.(Classes 中函數是顯性的而數據是隱含的,Data Structure 中數據是顯性的而函數是隱含的)
  • Classes make it easy to add types but hard to add functions. Data structures make it easy to add functions but hard to add types.(Classes 易增長類型,不易增長函數; Data Structure 易增長函數而不易增長類型)
  • Data Structures expose callers to recompilation and redeployment. Classes isolate callers from recompilation and redeployment.(Data Structure 直接暴露給調用方,改變後須要從新編譯和部署,Classes 改變後無需從新編譯和部署)

注意,這裏討論的 Class 與 Data Structure 是 C,Java 等類 C 語言中的概念,而不是 Lisp,Haskell 等函數式語言中的概念。數據結構

從第一條來看,咱們須要從新審視之前在語言中被認爲是數據結構的對象。List Map 等容器在日常的觀點中是屬於數據結構的,但它們其實只是暴露了可操做的函數而已,數據結構是隱藏在具體實現中的,所以其屬於類而不是數據結構。開發中使用的 DTO 因爲只含有數據,雖然是表面是類,本質倒是數據結構的。函數

類是對具體世界的建模,對外暴露的是 API,也就是它能作什麼,這是咱們瞭解一個類的途徑。若是咱們認同類對具體世界的建模是合理的話,咱們對具體世界的認識也是從世界展現給咱們的行爲開始的。子曰:「察其言而觀其行」,這應該是咱們認識一我的的第一步。設計

從第二條來看,類增長類型容易而增長行爲困難,數據結構相反。人若要長出第三隻胳膊來,不知道須要多少萬年的進化,造我的就容易多了。code

第三條是從依賴方向上說的,全部依賴數據結構的源文件在數據結構有修改時都須要從新編譯,耗時比較長;類將行爲和實現分離,使用方只須要依賴接口就能夠了,對實現不用關心,當實現有變化時,只須要編譯變化的類,兩者的關聯是在運行時關聯起來的。當你須要分配任務時,你只需指定誰誰幹什麼,不須要操心怎麼作,各人有各人的實現方式,但最終你知道的就是活作完了。htm

類和數據結構其實就是面向對象和麪向過程不一樣設計哲學的體現,從分析來看,面向對象更符合咱們平時對世界的認知。面向過程的編程方法將數據徹底暴露出來,更符合計算機的認知,計算機就是 CPU 圍繞着寄存器、內存來運算。從設計上看,面向對象比面向過程抽象層級更高,更適合大規模的業務,小巧的業務使用面向過程會更輕便一些。對象

相關文章
相關標籤/搜索