架構整潔之道一(編程範式)

前言

一個不想做架構師的程序員不是一個好程序員。
所以最近在看一本《架構整潔之道》覺得還不錯,這裏把看過的一些筆記和心得彙總一下。
以便後面自己可以溫故知新,也方便小夥伴們可以快速的認識到架構的真諦。扯遠了,進入正題。

編程範式

先從編程範式開始講起。目前常見的有3種編程範式:結構化編程、面向對象編程、函數式編程。每種範式的出現,都具有重大意義。
前兩種我們比較熟悉。後面一種其實出現的更早,只是作爲Java開發來說,是最近才慢慢開始接觸。
下面針對上面3種範式,進行一個簡單的說明解釋。

結構化編程

什麼是結構化編程,其實我們不知不覺都在使用,且聽我娓娓道來。一般機器的運行是按命令來執行的。
例如,在彙編時代,我們編排好一堆命令,讓機器去逐條執行,以操控各種硬件。當我們需要控制某些
流程時,就會用到類似goto的語句,讓機器執行完本條命令後,跳轉到另一條命令執行(這兩條命令並不是
按編排好的順序排放的)。這樣就能很靈活的控制程序的流程走向。但人類的思維是連續的,這種goto的
連續跳躍,使人類無法很好的理解程序的意向。於是我們打算做一些約束,同時發現了一套結構化定理:

任何程序都可以用順序、選擇和循環三種基本控制結構來表示。

即在Java的世界裏,我們的代碼是順序執行的,使用if-else來代表執行的選擇,使用for和while來控制循環。
這樣我們就可以很好的屏蔽類似goto語句的使用,使整個程序閱讀更加流暢,更加接近人類的理解,
有了以上的鋪墊,結構化編程可以總結到一句話:

結構化編程對程序控制權的直接轉移進行了限制和規範

面向對象編程

結構化編程思維,還是比較靠近機器運行的思維。那麼面向對象編程,就比較靠近人類的思維去編程了。
我們發現,簡單靠結構化思維編程,很難構建起一個龐大的應用。在編碼過程中,我們也會不知不覺的
把一些邏輯和數據封妝起來。形成一個可複用的組件。也許這就是人性思維。慢慢的,有人把這些習慣
總結成了一套方法論。並擴展了一些概念,讓這套理論更加貼切人類的客觀世界。對於面向對象編程有很多種說法
一種常見回答是:

面向對象是數據和函數的組合

還有一種回答是:

是一種對真實世界的建模

上面的總結都有道理,但也都不夠概全。這裏講一下其中有3個概念是面向對象的核心,即:

封裝、繼承、多態

封裝

在我看來,封裝就是把數據和函數組合到一起。類似Java的類,有變量和方法組成。同時,由於封裝的特性,
我們可以把一些內部使用的數據和函數隱藏起來。類似Java的權限控制,privite、protect、public等。

繼承

簡單點講,就是在封裝的基礎上,我們可以定義一個所謂的子類,去繼承父類的數據和函數。並根據需要,覆蓋
其中的一些數據和函數形成子類特有的行爲。這點,和現實中人類的DNA繼承極爲相似。

多態

上面講繼承時,說到了,子類可以覆蓋父類的函數,當多個子類都去繼承這個父類並覆蓋這個函數時,多態其實
已經就開始形成了。此時我們可以使用父類的引用,使用不同子類的實例,調用這個被覆蓋的方法,不同的子類實例
就會有不同的表現。所以多態可以用一句話來解釋即:

同一個操作(方法或者函數)作用於不同的對象時,可以有不同的解釋。

多態是非常有用的,我們可以使用依賴反轉把實例化子類的操作剝離出去時,我們的程序設計就天然的變
成了插件式架構,這個後面會細講,這裏先點到爲止。

函數式編程

這種編程思想主要是把運算過程儘量寫成一系列嵌套的函數調用。我自己簡單粗暴的理解是,把函數當作變量看待。且這些
函數有一些限定條件。即只要函數的入參是確定的,出參就是確定。函數不會改變任何變量狀態。存粹的函數式編程語言編寫
的函數沒有變量。在JDK1.8中,已經開始有函數式編程的影子了。

架構師會比較關心變量的可變性。因爲所有的併發問題,都是由於變量的可變性導致的。所以,在設計程序的時候,
我們往往需要把不會涉及到變量變更的邏輯,和需要操作變量變更的邏輯分離開來。前者就可以用函數式編程範式構建
函數。分成兩個獨立組件。前者因爲沒有對變量的操作,所以絕對線程安全。而且對單元測試也更加的友好。

總結

對於上面的編程範式,我們來總結一下:

結構化編程是對程序控制權的直接轉移的限制
面向對象編程是對程序控制權的間接轉移的限制
函數式編程是對程序中賦值操作的限制

總的來說,範式是限制編寫程序的靈活性,以達到人類友好閱讀的目的。所以業務架構從某種意義上來講
也是在某種領域中限制程序員的一些行爲,讓他往我們所希望的規範方向編碼。從而達到整個系統的簡潔。

相關推薦

架構整潔之道一(編程範式)
架構整潔之道二(設計原則)

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