大家好,我是寒草????,一隻工作一年半的草系碼猿????
如果喜歡我的文章,可以關注 ➕ 點贊,與我一同成長吧~
一起學習交流,成為更優秀的工程師~
總覽
上一篇文章: 寒草與《架構整潔之道》|樹葉飛舞,故事開始????簡要介紹了什麼是設計與架構,以及架構的價值所在,本篇文章将介紹程式設計範式。
程式設計範式指的是程式的編寫模式,與具體的程式設計語言關系相對較小。這些範式會告訴你應該在什麼時候采用什麼樣的代碼結構。直到今天,我們也一共隻有三個程式設計範式:
- 結構化程式設計
結構化程式設計對程式控制權的直接轉移進行了限制和規範。Dijkstra 論證了使用 goto 這樣的無限制跳轉語句将會損害程式的整體結構,也是這位 Dijkstra 最先主張用我們現在熟知的 if/then/else 語句和 do/while/until 語句來代替跳轉語句的。
- 面向對象程式設計
面向對象程式設計對程式控制權的間接轉移進行了限制和規範。
- 函數式程式設計
函數式程式設計對程式中的指派進行了限制和規範。
這三個程式設計範式都從某一方面限制和規範了程式員的能力。沒有一個範式是增加新能力的。也就是說,每個程式設計範式的目的都是設定限制。這些範式主要是為了告訴我們不能做什麼,而不是可以做什麼。
另外,我們應該認識到,這三個程式設計範式分别限制了 goto 語句、函數指針和指派語句的使用。
結構化程式設計
可推導性
程式設計是一項難度很大的活動。一段程式無論複雜與否,都包含了很多的細節資訊。如果沒有工具的幫助,這些細節的資訊是遠遠超過一個程式員的認知能力範圍的。而在一段程式中,哪怕僅僅是一個小細節的錯誤, 也會造成整個程式出錯。
對于上面的問題,Dijkstra 提出的解決方案是采用數學推導方法。即:程式員可以用代碼将一些己證明可用的結構串聯起來,隻要自行證明這些額外代碼是正确的,就可以推導出整個程式的正确性。
Dijkstra 在研究過程中發現了一個問題: goto 語句的某些用法會導緻某個子產品無法被遞歸拆分成更小的、可證明的單元,這會導緻無法采用分解法來将大型問題進一步拆分成更小的、可證明的部分。
goto 語句的其他用法雖然不會導緻這種問題,但是 Dijkstra 意識到它們的實際 效果其實和更簡單的分支結構 if-then-else 以及循環結構 do-while 是一緻的 。 如果代碼中隻采用了這兩類控制結構,則一定可以将程式分解成更小的、可證明的單元。
Bohm 和 Jocopini 證明了人們可以用順序結構、分支結構、循環結構這三種結構構造出任何程式。這個發現非常重要: 因為它證明了我們建構可推導子產品所需要的控制結構集與建構所有程式所需的控制結構集的最小集是等同的。 這樣一來,結構化程式設計就誕生了。
科普一下:
順序結構和分支結構的正确性可以用枚舉法證明,但是循環結構需要采用**數學歸納法**:具體來說就是,首先要用枚舉法證明循環 1 次的正确性,接下來再證明如果循環 N 次是正确的,那麼循環 N+1 次也同樣也是正确的。
GOTO 是有害的
這是一段有趣的故事:
1968 年,Dijkstra 曾經給 CACM 的編輯寫過一封信 。 這封信後來發表于 CACM 3 月刊,标題是 Go To Statement Considered Harmfu/1, Dijkstra 在信中具體描繪了他對三種控制結構的看法。
由于當時還沒有網際網路,大家還不能直接上網發帖來對 Dijkstra 進行冷嘲熱諷,他們唯一能做的,也是大部分人的選擇,就是不停地給各種公開發表的報刊的編輯們寫信。
有的信件的措辭并不那麼友善,甚至是非常負面的。但是,也不乏強烈支援者。總之,這場火熱的争論持續了超過 10 年 。
中間吐槽一句:
這一幕像極了現在網上的各種罵戰,哈哈哈
這場辯論最終還是逐漸停止了。原因很簡單: Dijkstra是對的。随着程式設計語言的演進,goto 語句的重要性越來越小,最終甚至消失了。如今大部分的現代程式設計語言中都己經沒有了 goto 語句。
現如今,無論是否自願,我們都是結構化程式設計範式的踐行者了,因為我們用的程式設計語言基本上都己經禁止了不受限制的直接控制轉移語句。
功能性降解拆分
既然結構化程式設計範式可将子產品遞歸降解拆分為可推導的單元,這就意味着子產品也可以按功能進行降解拆分。這樣一來,我們就可以将一個大型問題拆分為一系列進階函數的組合,而這些進階函數各自又可以繼續被拆分為一系列低級函數,如此無限遞歸。更重要的是,每個被拆分出來的函數也都可以用結構化程式設計範式來書寫。
通過采用這些技巧,程式員可以将大型系統設計拆分成子產品群組件,而這些子產品群組件最終可以拆分為更小的、可證明的函數。

其中思想至今仍被沿用????
結束語
結構化程式設計範式中最有價值的地方就是,它賦予了我們創造可證僞程式單元的能力。這就是為什麼現代程式設計語言一般不支援無限制的 goto 語句。更重要的是,這也是為什麼在架構設計領域,功能性降解拆分仍然是最佳實踐之一。
最後還有一句話印象深刻:一段程式可以由一個測試來證明其錯誤性,但是卻不能被證明是正确的。
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
少年向來不識天高地厚
放眼處皆自負才高八鬥
雖是自命風流
倒也坦誠無憂
我愛這樣的少年
謙和而狂妄
驕傲又坦然☀️