2009-09-11 125 views
0

問題我有範圍和封裝的通用問題。採取兩種方案:有關範圍和封裝

方案1:

// a global application level constant 
public static const IS_DEMO_MODE:Boolean = false; 

... // somewhere deep in the codebase 

private function _myFunction():void 
{ 
    if (IS_DEMO_MODE == true) { 
     // If Demo Mode do not allow this function to complete 
     return;  
    } 
    else { 
     // Function behaves normally 
     // Code ... 
    } 

} 

方案2:

// a global application level constant 
public static const IS_DEMO_MODE:Boolean = false; 

... // somewhere deep in the codebase 

// call the function and pass in the constant 
_myFunction(IS_DEMO_MODE); 


private function _myFunction(isDemoMode:Boolean):void 
{ 
    if (isDemoMode == true) { 
     // If Demo Mode do not allow this function to complete 
     return;  
    } 
    else { 
     // Function behaves normally 
     // Code ... 
    } 

} 

從功能上來講這兩個代碼片段做同樣的事是完全相同。我想了解編碼風格的更精細的一點,以及爲什麼一種方式可能比另一種方式更受歡迎?從封裝的角度來看,情況2似乎更好。但是場景1更加簡單,因爲條件中的布爾值只來自一個地方,即全局常量。您不必擔心函數調用,即在正確接收參數時可能傳遞錯誤的值。但情景2看起來很有價值,因爲您可以移除常量的依賴關係,並且可以使該函數的行爲更加動態。對此有何想法?我還有什麼其他的折扣嗎?

相同的概念和應用對象和類以及問題。但我只是以簡單的代碼示例的函數的形式來舉例說明。

回答

1

在第二種方法中,您可以使_myFunction生活在一個單獨的模塊中,不依賴於全局模塊 - 因此它更容易測試,更易於重用,並幫助您控制依賴關係圖,這往往會變得嚴重在大型代碼庫中的問題。如果插入依賴關係可以輕鬆避免,那麼只會使依賴關係圖問題變得更糟,並且很少有潛在的好處可能會爲此付出代價。事實上,爲了獲得這種優勢,一個很好的依賴模式就是明確的INJECT對象,否則會在模塊之間產生(通常是不希望的和不希望的)依賴關係 - 參見here作爲開始。作爲一個測試,鬆耦合和重用的狂熱分子,我逐漸成爲依賴注入的狂熱者,所以我不會夢想獲得一個全局常量,將它作爲參數傳遞是一個明顯的選擇......; )。

+0

感謝您的答覆亞歷克斯。這是有道理的。 – 2009-09-11 18:00:34

1

2將是優選的,如果你想相同的編譯單元針對兩個版本被鏈接(尤其是如在全局固定路徑共享庫),或者如果你在同一進程中運行多個實例。否則,如果您處於從源頭重建所有內容的情況並非障礙,則#1更好。

有些事情真的是全球性的。全局常量一點都不危險。