《冒号課堂:程式設計範式與OOP思想》筆記一
首先,要有批判精神和獨立思考的能力。
第一課
學會不如會學,會學不如會用,會用不如被用
- 學會:知其所然
- 會學:知是以然
- 會用:人為我用(能将所學靈活運用到實際程式設計設計中)
- 被用:我為人用(能設計出廣為人用的應用程式)
IT行業不同于純數學,IT最高造詣是活學活用、廣為人用。
如果知識是水,我們要挖掘最先湧動的泉眼;如果知識是火,我們要捕捉起初點燃的火花;如果知識是樹,其樹大根深,不究立固之本則無以知過去;其枝繁葉茂,不握之幹則無以知其蓬勃茂盛,不察生長之點無以知未來。
首先,作者的文筆真的好。其次,IT行業大的紅利期已經過去了,正逐漸進行大浪淘沙。少關注架構,多關注架構背後的思想以及相對底層的知識。
知識之上是思想,思想之上是精神。
原理比單一知識點重要,終身學習、保持好奇比抱殘守缺重要。
AJAX:Asynchronous JavaScript And XML(異步的 JavaScript 和 XML)
領域特定語言(Domain Specific Language,DSL)
通用程式設計語言(General-Purpose Programming Language,GPPL)
- 第一代語言:機器語言
- 第二代語言:彙編語言
- 第三代語言:進階語言
- 第四代語言:面向問題語言(SQL,SPSS)
- 第五代語言:人工智能語言(Prolog,Mercury,OPS5)
面向問題語言:基本屬于DSL,隻面向某一領域的問題。評判語言優劣,要根據使用語言的主體和面向的對象。第四代和第五代語言與前三代語言的差別在于:重目标輕過程、重描述輕實作。
得形而忘意,無異舍本逐末;得意而忘形,方能遊刃有餘。
荃者是以在魚,得魚而忘荃;蹄者是以在兔,得兔而忘蹄;言者是以在意,得意而忘言。 ——《莊子 · 外物》
一個足夠複雜的應用軟體開發,為保證快速有效,通常采取的方法是:在宏觀管理上選取一些架構以控制整體的結構和流程;在微觀實作上利用庫和工具包來解決具體的細節問題。架構的意義在于使開發者在特定領域的 整體設計上不必重新發明輪子;庫和工具包的意義在于使開發者擺脫底層編碼,專注特定問題和業務邏輯。
架構和庫的使用,使軟體開發變得更加快捷。架構提供了項目的整體設計架構;庫透明化底層細節,提供了較高層次的抽象。
庫和工具包是為程式員帶來自由的,架構是為程式員帶來限制的。
學會閱讀源碼,看懂輪子,修輪子,造輪子。
SSH:Struts、Spring、Hibernate
第二課
指令式程式設計的世界觀是:程式是由若幹行動指令組成的有序清單。其方法論是:用變量來儲存資料,用語句來執行指令。
過程式程式設計是在指令式程式設計的基礎上引入了過程、函數。
- 結構化程式設計:提倡代碼具有嚴謹的邏輯結構。
- 任何程式都可用順序、選擇和循環這三種基本控制結構來表示。
- 滿足“單入口、單出口”(SESE)原則。
- 是馮 · 諾伊曼機的基本運作機制。
- 以行動為導向。
- 采用“自頂向下”的設計。
分而治之,解耦合
- 聲明式程式設計是以目标為驅動的。
- 聲明式程式設計主要包括函數式程式設計(FP)和邏輯式程式設計(LP)。
- 函數式程式設計将計算描述為數學函數的求值;而邏輯式程式設計通過一系列事實和規則來推導或論證結論。
- 除尾遞歸外,一般遞歸比疊代的開銷大。
聲明式程式設計的思想類似于抽象。
三種核心程式設計範式比較:
範式 | 程式 | 輸入 | 輸出 | 程式設計 | 程式運作 |
---|---|---|---|---|---|
指令式 | 自動機 | 初始狀态 | 最終狀态 | 設計指令 | 指令執行 |
函數式 | 數學函數 | 自變量 | 因變量 | 設計函數 | 表達式變換 |
邏輯式 | 邏輯證明 | 題設 | 結論 | 設計命題 | 邏輯推理 |
OOP的核心思想可泛化為:以資料為中心組織邏輯,将系統視為互相作用的對象集合,并利用繼承與多态來增強可維護性、可擴充性和可重用性。
OOP基礎特征:封裝性、繼承性和多态性。可維護性、可擴充性和可重用性是所有程式設計範式的目标,不為OOP獨有
沒有銀彈。(No silver bullet)
OOP不可能一統天下,需根據實際應用場景選擇或者綜合其他程式設計範式。
如果把整個流程看作一顆倒長的大樹,過程式程式設計自樹根向下,逐漸分支,直到每片樹葉,類似數學證明中的分析法,即執果索因的逆推法,逐漸求精;OOP則從每片樹葉開始,逐漸合并,直到樹根,類似數學證明中的綜合法,即執因索果的正推法,逐漸合并。
過程式程式設計,牽一發而動全身;OOP松耦合,較易維護。
接口粗粒度化:把一些函數包裝起來。
相比于重用性,OOP更具易用性:我們重用的是什麼?是類嗎 ?我覺得是類裡面的方法(函數)。也就是說,方法(函數)具有重用性,而OOP提供了類,這比過程式程式設計更易找到需要的函數,這展現了易用性。
函數是被動的實體,對象是主動的實體。過程式程式的世界是君主制的,主函數是國王,其他函數是臣民。OO程式的世界是民主制的,所有對象都是獨立而平等的公民。更進一步,封裝使得公民擁有個體身份,繼承使得公民擁有家庭身份,多态使得公民擁有社會身份。
那Java是不是就是“君主立憲制”:Java程式必須有一個主類,相當于議會,裡面放一些路由之類的控制元件,相當于議會做決策。主類裡的main方法相當于國王,負責表面上的各種安排。而其他類就相當于百姓之類,負責具體事務處理。
并發式程式設計,絕不是簡單調用幾個API,使用幾個關鍵字這般簡單。從宏觀的架構設計,到微觀的控制流和算法,可能都與串行式程式設計不同,還要結合運作程式的硬體特點。
并發式程式設計以程序為導向,以任務為中心,以資源共享與競争為主線,将系統子產品化。
過程式有函數子產品,對象式有對象子產品,并發式有系統子產品。不能獨立的看待每個子產品,還要考慮到子產品之間的互相關聯和作用。
并發式與對象式均為傳統程式設計的推廣:并發式程序個數為1時即為傳統的串行式程式設計,對象的方法個數為零即為傳統的資料類型;均将整個程式系統分解為若幹獨立的子系統,不同的是一個以任務為機關,一個以對象為機關;子系統之間均能交流合作,不同的是一個以競争為主題,一個以服務為主題。
合理的并發式設計應該做到:軟體易于重用、維護和測試;有效的利用資源,優化程式性能;保障程序安全和活性;減少性能損失和複雜度。
範式 | 體系 | 子產品 | 子產品關系 |
---|---|---|---|
過程式 | 君主體系 | 過程 | 授命與聽命 |
函數式 | 數學體系 | 函數 | 替換與合成 |
邏輯式 | 邏輯體系 | 斷言 | 歸納與演繹 |
對象式 | 民主體系 | 對象 | 交流與服務 |
并發式 | 生産體系 | 程序 | 競争與合作 |
對象式和并發式在傳統程式設計的基礎上,分别從不同的方向進行拓展:對象式在資料類型上進行推廣——允許運算作為資料類型的成員;并發式在執行順序上進行推廣——允許不同運算的執行在時間上交替或重合。