天天看點

《冒号課堂:程式設計範式與OOP思想》筆記一《冒号課堂:程式設計範式與OOP思想》筆記一

《冒号課堂:程式設計範式與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時即為傳統的串行式程式設計,對象的方法個數為零即為傳統的資料類型;均将整個程式系統分解為若幹獨立的子系統,不同的是一個以任務為機關,一個以對象為機關;子系統之間均能交流合作,不同的是一個以競争為主題,一個以服務為主題。

合理的并發式設計應該做到:軟體易于重用、維護和測試;有效的利用資源,優化程式性能;保障程序安全和活性;減少性能損失和複雜度。

範式 體系 子產品 子產品關系
過程式 君主體系 過程 授命與聽命
函數式 數學體系 函數 替換與合成
邏輯式 邏輯體系 斷言 歸納與演繹
對象式 民主體系 對象 交流與服務
并發式 生産體系 程序 競争與合作

對象式和并發式在傳統程式設計的基礎上,分别從不同的方向進行拓展:對象式在資料類型上進行推廣——允許運算作為資料類型的成員;并發式在執行順序上進行推廣——允許不同運算的執行在時間上交替或重合。

繼續閱讀