《冒號課堂:編程範式與OOP思想》筆記二

《冒號課堂:編程範式與OOP思想》筆記二

第三課 常用範式

超級範式,元編程

泛型編程:Generic Programming,GP

GP基本思想:將算法與其作用的數據結構分離,並將後者儘可能泛化,最大限度地實現算法重用。以算法爲起點和中心點。

函子:在範疇論中,函子是範疇間的一類映射。函子也可以解釋爲小范疇範疇內的態射。

STL有三要素:算法、容器和迭代器。算法使一系列切實有效的步驟;容器是數據的集合,可理解爲抽象的數組;迭代器是算法與容器之間的接口,可理解爲抽象的指針或遊標。

容器通常以迭代器的形式參與過程。算法串聯數據,如脊貫肉;數據實化算法,如肉附脊。

泛型思維:對指定集合中滿足指定條件的元素進行指定處理。

泛型編程不僅能泛化算法中涉及地概念(數據類型),還能泛化行爲(函數、方法、運算)。

Java泛型實現原理:類型擦除,編譯爲字節碼時參數類型會在代碼中被擦除,單獨記錄在Class文件的attributes域內,而在使用泛型處做類型檢查與類型轉換。

多態與泛化:多態性(polymorphism),可簡單概括爲“一個接口,多種方法”。是指相同對象收到不同消息或不同對象收到相同消息時產生不同的實現動作。泛化(Generalization)定義了一般元素和特殊元素之間的分類關係,是一種“a-kind-of”關係。泛化和繼承不是一回事,其中心對象不同,如“蘋果繼承了水果,水果泛化了蘋果。”

Lex、Yacc:能根據格式標準生成相應地解析器代碼。是編寫編譯器和解釋器的工具。設計編寫DSL

領域特定語言(DSL)一般通過現成的編譯器生成器首先轉化爲第三代的高級語言。

元編程(Metaprogramming,MP)作爲超級範式的一個體現是,它能提升語言的級別。進一步思考,便是語言導向式編程(Language-Oriented Programming,LOP),其思路是,在建立一套DSL體系之後,直接用它們來編寫軟件。

MP,LOP都是提供越來越高級的抽象,使編程語言更符合人類思考的方式。越來越專業化,應用的領域也越來越狹窄。
在這裏插入圖片描述

如果處理一些複雜、非標準格式的文檔,可以考慮用元編程;如果整個業務邏輯複雜多變,可以考慮利用現有的DSL或創造新的DSL來處理業務。

針對小的業務要求,可以利用使用中的編程語言自帶的特性進行元編程;對於大而複雜的業務系統,可以考慮設計一個新的DSL以適應業務要求。

元編程應用:IDE通過嚮導、、拖放控件等方式自動生成源碼;UML建模工具將類圖轉換爲代碼;Servlet引擎將JSP轉換爲Java代碼;Spring、Hibernate等框架和工具能從配置文件、annotation/attribute等中產生代碼。

IDE內置的代碼生成功能,一方面侷限性很大,另一方面無法自動化和版本化。

IDE下自動生成的代碼本身可以被記錄,但產生代碼時的行爲卻不能被記錄。可以自編無需人機交互的元程序來生成代碼,只須將元程序的數據來源版本化。

產生式編程(Generative Programming),自動生成源代碼。其更看重代碼的生成。而靜態元編程看重的是生成代碼的可執行性。此外,動態元編程並不生成源代碼,但能在運行期間修改程序。

元編程是編寫、操縱程序的程序。在傳統的編程中,運算是動態的,但程序本身是靜態的;在元編程中,二者都是動態的。

元編程寫出一套規則,利用這套規則生成適應特定情況的源代碼。“正則表達式”

切面範式

面向切面編程:Aspect Oriented Programming,AOP

關注點分離:Separation of Concerns,SoC

儘量減少重複代碼:Don’t Repeat Yourself

抽象是前提,分解是方式,模塊化是結果。

我們先將業務中的對象抽象爲現實實體和邏輯實體(抽象),再根據業務邏輯將對象和行爲提取出來(分解),分別將對象和行爲用代碼實現(模塊化)。

抽象與分解的原則:單一化,正交化。每一個模塊職責明確專一,模塊之間相互獨立,即高內聚低耦合。

人類能同時處理的邏輯實體至多六個。所以代碼儘可能簡單、清晰。結合《代碼大全》看

AOP將每類橫切關注點封裝到單獨的Aspect模塊中,將程序中的一些執行點與相應的代碼綁定起來。單個的執行帶你稱爲接入點(join point)。例如調用某個對象的方法前後;符合預先指定條件的接入點集合稱爲切入點(pointcut)。再如所有以set爲命名開頭的方法;每段綁定的代碼稱爲一個建議(advice)。

  • Aspect – a standard code/feature that is scattered across multiple places in the application and is typically different than the actual Business Logic (for example, Transaction management). Each aspect focuses on a specific cross-cutting functionality
  • Joinpoint – it’s a particular point during execution of programs like method execution, constructor call, or field assignment
  • Advice – the action taken by the aspect in a specific joinpoint
  • Pointcut – a regular expression that matches a joinpoint. Each time any join point matches a pointcut, a specified advice associated with that pointcut is executed
  • Weaving – the process of linking aspects with targeted objects to create an advised object

面向切面編程,根據需要,動態的將重複的代碼切入到指定類的指定位置上的方法

切入的代碼片段是建議,多爲重複且與切入類關係不大的代碼;切入的類和方法稱爲切入點。切入點與建議組成了切面。切入的過程稱爲編織。編織分爲靜態編織:通過修改源碼或字節碼在編譯期、後編譯期或加載期嵌入代碼;動態編織:通過代理等技術在運行期實現嵌入通過AOP,可以將幾個類共有但關係都不大的代碼封裝到切面中,按需切入。滿足了“高內聚,鬆耦合”要求

AOP的實施分爲三步:切面分解、切面實現和切面合成。需要程序員編碼的部分在第二步。

在這裏插入圖片描述

AOP更適合與大中型程序。對於小型程序,AOP帶來的複雜度和性能損耗可能遠大於便利。

OOP只能沿繼承樹縱向方向重用,AOP可以沿橫向方向重用。

事件驅動

基於事件驅動的系統一般提供兩類內建事件:一類是底層事件或稱原生事件,在GUI系統中這類事件直接由鼠標、鍵盤等硬件設備觸發;一類是語義事件,一般代表用戶的行爲邏輯,是若干底層事件的組合。比如鼠標拖放。

程序員也可以創建用戶自定義事件。模擬用戶鼠標點擊或鍵盤輸入等產生事件,稱爲合成事件。

WinForm,爬蟲

創建一個能響應用戶操作的win32窗口共分四步:註冊窗口類別、創建窗口、消息循環和窗口過程。

消息和事件從嚴格來說不是一回事,消息是Windows內部最基本的通信方式,事件需要通過消息來傳遞。是消息的主要來源。每當用戶觸發一個事件,系統都會將其轉化爲消息並放入相應程序的消息序列中。

函數指針是C和C++用來實現callback的一種方式。此外,抽象類、接口、C++中的泛型函子和C#中的委託都可以實現callback。

Java實現:

//文件1 聲明callback函數

public interface callbackF{
    pubilc void doSomething(int para1,int para2,int result);
}

//文件2 實現callback函數
public class Test implements callbackF{
    private int a = 0;
    private int b = 0;
    
    public Test(int a, int b){
        this.a = a;
        this.b = b;
    }
    @Override
    public void doSomething(int a, int b, int result){
        System.out.println(a+b+result);
    }
}

//文件3 調用callback函數
 
public class CallF{
    public void helpDoSomething(int para1,int para2, callbackF callbacked){
        int res = para1 + para2;//對其進行操作
        callbacked.doSomething(para1, para2, res);//調用callback函數
    }
}

在這裏插入圖片描述

同步回調和異步回調都使調用者不再依賴被調者,將二者從代碼上解耦,異步調用更將二者從時間上解耦。

控制反轉(Inversion of Control,IoC):一般用callback來實現,其目的是降低模塊之間的依賴性,從而降低模塊的耦合度和複雜度。

依賴反轉原則(Dependency-Inversion Principle,DIP):高層模塊不應依賴底層模塊,它們都應依賴抽象;抽象不應依賴細節,細節應依賴抽象。

依賴注射(Dependency Injection,DI):動態的爲一個軟件組件提供外部依賴。

獨立是異步的前提,耗時是異步的理由。

只有獨立了,才能將其剝離出來;因爲無用的過程消耗了大量時間,所以要進行異步處理。

事件驅動式編程的三個步驟:實現事件處理器;註冊事件處理器;實現事件循環。

觀察者模式又名發行/訂閱模式,既是事件驅動式的簡化,也是事件驅動的核心思想。MVC架構是觀察者模式在架構設計上的一個應用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章