1. 程式人生 > >面向物件程式設計(OOP)和函數語言程式設計(FP)的思考

面向物件程式設計(OOP)和函數語言程式設計(FP)的思考

最近看過不少 JavaScript 的類(實際是巢狀 function),自己也寫了一些,發現一個值得思考的問題。

有的作者可能為了提高一點效能,喜歡有事沒事把方法裡面的某個變數做成類的欄位(attribute)。而實際上,這些變數往往作用域在單個方法內一樣工作的很好,就是說從邏輯上講,是不需要在幾個方法之間分享這些變數的。比如:

function SomeClass(){
    
var a;
    
var b;
    
function Foo(){
        a 
=3;
        b 
=4;
        
// dot.gif    }
    
function Bar(){
        a 
=5;
        b 
=6;
        
//dot.gif    }
}

這樣做我認為帶來的後果就是增加了不必要的狀態資訊,如果類似於 Foo, Bar 這樣的方法一多起來,則會增加無意中修改欄位資訊(破壞狀態)導致出錯的可能性。我閱讀這樣的程式碼的時候是很擔心的。我寧願寫成這樣:

function SomeClass(){
    
function Foo(){
        
var a =3;
        
var b =4;
        
// dot.gif    }
    
function Bar(){
        
var a =5;
        
var b =6;
        
//dot.gif    }
}

函數語言程式設計(FP)中一個思想是,函式呼叫應該沒有“副作用”,就是不能依賴於狀態,也沒法修改狀態。這樣做的一個好處是每個函式都很容易理解,可讀性好。而我們平時用面向物件程式設計(OOP)用多了,會有一個感覺,有時候看別人的程式碼真的很不容易理解,特別在沒有註釋的情況下。經過了重構等技術處理後,一個核心方法你看下去,其中的真實執行步驟可能會分散到無數個分支,其中又有若干對物件狀態的依賴,和方法之間的協作等複雜關係,這就導致程式很難理解。

這麼說的目的倒不是否定 OOP, 追捧 FP. 我是覺得可以用這個思想來指導一點我們對類的設計方法。若非必要,不要往類裡面塞太多本不該屬於它的欄位,在不違背 DRY 原則的前提下,儘量限制變數的作用域到一個比較小的範圍。這樣也許能寫出更易理解的程式。