面向物件程式設計(OOP)和函數語言程式設計(FP)的思考
阿新 • • 發佈:2019-02-15
最近看過不少 JavaScript 的類(實際是巢狀 function),自己也寫了一些,發現一個值得思考的問題。
有的作者可能為了提高一點效能,喜歡有事沒事把方法裡面的某個變數做成類的欄位(attribute)。而實際上,這些變數往往作用域在單個方法內一樣工作的很好,就是說從邏輯上講,是不需要在幾個方法之間分享這些變數的。比如:
var a;
var b;
function Foo(){
a =3;
b =4;
// }
function Bar(){
a =5;
b
// }
}
這樣做我認為帶來的後果就是增加了不必要的狀態資訊,如果類似於 Foo, Bar 這樣的方法一多起來,則會增加無意中修改欄位資訊(破壞狀態)導致出錯的可能性。我閱讀這樣的程式碼的時候是很擔心的。我寧願寫成這樣:
function SomeClass(){
function Foo(){
var a =3;
var b =4;
// }
function Bar(){
var a =5;
var b =6;
// }
}
函數語言程式設計(FP)中一個思想是,函式呼叫應該沒有“副作用”,就是不能依賴於狀態,也沒法修改狀態。這樣做的一個好處是每個函式都很容易理解,可讀性好。而我們平時用面向物件程式設計(OOP)用多了,會有一個感覺,有時候看別人的程式碼真的很不容易理解,特別在沒有註釋的情況下。經過了重構等技術處理後,一個核心方法你看下去,其中的真實執行步驟可能會分散到無數個分支,其中又有若干對物件狀態的依賴,和方法之間的協作等複雜關係,這就導致程式很難理解。
這麼說的目的倒不是否定 OOP, 追捧 FP. 我是覺得可以用這個思想來指導一點我們對類的設計方法。若非必要,不要往類裡面塞太多本不該屬於它的欄位,在不違背 DRY 原則的前提下,儘量限制變數的作用域到一個比較小的範圍。這樣也許能寫出更易理解的程式。