
1. 規則
1.1. 傳遞引數,回傳結果
1.1.1. 例外和中斷都不算回傳結果
1.2. 減少共享的可變資料結構能幫助你降低維護和除錯程式的代價
2. 耦合性
2.1. 軟體系統中各組件之間是否相互獨立
3. 內聚性
3.1. 系統的各相關部分之間如何協作
4. 無狀態的行為
4.1. 流水線中的函式不會由于需要等待從另一個方法中讀取變數,或者由于需要寫入的變數同時有另一個方法正在寫而發生中斷
4.2. 無須擔心鎖引起的各種問題
4.3. 充分發掘系統的并發能力
5. 副作用
5.1. 函式的效果已經超出了函式自身的范疇
5.2. 除了構造器內的初始化操作,對類中資料結構的任何修改,包括欄位的賦值操作
5.3. 拋出一個例外
5.4. 進行輸入/輸出操作
6. 無副作用
6.1. 純粹的
6.2. 如果一個方法既不修改它內嵌類的狀態,也不修改其他物件的狀態,使用return回傳所有的計算結果
6.3. 如果構成系統的各個組件都能遵守這一原則,該系統就能在完全無鎖的情況下,使用多核的并發機制,因為任何一個方法都不會對其他的方法造成干擾
6.4. 了解程式中哪些部分是相互獨立的
7. 不可變物件
7.1. 一旦完成初始化就不會被任何方法修改狀態
7.2. 一旦一個不可變物件初始化完畢,它永遠不會進入到一個無法預期的狀態
7.3. 執行緒安全的
8. 宣告式編程
8.1. 關注要做什么
8.2. 更加接近問題陳述
9. 命令式編程
9.1. 指令和計算機底層的詞匯非常相近
9.2. 專注于如何實作
10. 參考透明性
10.1. 沒有可感知的副作用
10.1.1. 不改變對呼叫者可見的變數
10.1.2. 不拋出例外
10.1.3. 不進行I/O
10.2. 如果一個函式只要傳遞同樣的引數值,總是回傳同樣的結果,那這個函式就是參考透明的
11. 記憶化
11.1. 快取
11.2. 對代價昂貴或者需長時間計算才能得到結果的變數值的優化
11.2.1. 通過保存機制而不是重復計算
12. 函式式編程
12.1. 程式有一定的副作用
12.1.1. 該副作用不會被其他的呼叫者感知
12.1.1.1. 如果沒人能感知的話,函式式也允許進行變更,這意味著可以修改區域變數
12.1.2. 呼叫者不需要知道,或者完全不在意這些副作用
12.2. 如果有副作用
12.2.1. 必須設法隱藏它們的非函式式行為
12.2.2. 否則就不能呼叫這些方法
12.2.3. 需要確保它們對資料結構的任何修改對于呼叫者都是不可見的,可以通過首次復制,或者捕獲任何可能拋出的例外實作這一目的
12.3. 函式式的函式或方法都只能修改本地變數
12.3.1. 所有的欄位都為final型別
12.3.2. 所有的參考型別欄位都指向不可變物件
12.3.3. 參考的物件都應該是不可修改的物件
12.4. 選擇使用參考透明的函式
12.5. 不應該拋出任何例外
12.5.1. 選擇在本地區域地使用例外,避免通過介面將結果暴露給其他方法,這種方式既取得了函式式的優點,又不會過度膨脹代碼
13. 區域函式式(partial function)
13.1. 大多數的輸入值都回傳一個確定的結果
13.2. 對另一些輸入值,它的結果是未定義的,甚至不回傳任何結果
13.2.1. 除法,如果除法的第二運算元是0
13.2.2. 開平方運算,開平方的引數為負數
13.2.3. 使用Optional型別
14. 純粹的函式式編程
14.1. 不提供像while或者for這樣的迭代結構
14.1.1. 這種結構經常隱藏著陷阱,誘使你修改物件
15. 遞回recursion
15.1. 函式式編程特別推崇的一種技術
15.2. 培養你思考要“做什么”的編程風格
15.3. 每個程式都能使用無須修改的遞回重寫,通過這種方式避免使用迭代
15.3.1. 采用遞回可以取代迭代式的結構,比如while回圈
15.3.2. 使用遞回,可以消除每步都需更新的迭代變數
15.4. 遞回的形式通常效率都更差一些
15.4.1. 因為每次執行遞回方法呼叫都會在呼叫堆疊上創建一個新的堆疊幀,用于保存每個方法呼叫的狀態(即它需要進行的乘法運算),這個操作會一直指導程式運行直到結束
15.4.2. 很容易遭遇StackOverflowError例外
15.5. 大多數時候編程的效率要比細微的執行時間差異重要得多
15.6. 尾調優化(tail-call optimization)
15.6.1. 撰寫方法的一個迭代定義,不過迭代呼叫發生在函式的最后
15.6.1.1. 呼叫發生在尾部
15.6.2. Java不支持這種優化
15.6.3. Scala、Groovy和Kotlin,支持對這種形式的遞回的優化
15.6.3.1. 最終實作的效果和迭代不相上下(它們的運行速度幾乎是相同的)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/543830.html
標籤:Java
下一篇:Acwing 327. 玉米田
