2008-12-18 96 views
1

我正在寫一些數據分析軟件,並決定採用這樣的方法:

OOP和MVC編程風格

EPN:
模型/ data.py < - 模型定義
模型/ reader.py < - 如何將數據讀入模型
視圖/ gui.py < - 主GUI框架(WX)
視圖/ dialogs.py < - 不同的對話框(WX)
epn.py < - 控制器

對於gui和數據之間的通信,我使用了wx.lib.pubsub。因此,當按下按鈕「調製指數」,epn.py捕捉消息和命令:

self.view.control_panel.displayModulationIndex(self.data.getModulationIndex()) 

其中self.data.getModulationIndex()是:

def getModulationIndex(self): 
    m = self.mean_flux 
    f = self.fluxes 
    # other things 

在另一方面我可以寫它爲:

def getModulationIndex(self, m, f) 
    # other things 

,並稱呼其爲:

m = self.data.mean_flux 
f = self.data.fluxes 
self.view.control_panel.displayModulationIndex(self.data.getModulationIndex(m, f)) 

從我的角度來看,第一個例子更好(更短,封裝,更加防錯)。但是測試它很難---你不能只在一些模擬對象上調用該方法。

希望這一次是明確

問候
CHRISS

+0

什麼阻止你在調用方法之前設置這些字段? – 2008-12-18 09:51:30

回答

3

例1: 「更好(更短,封裝,更多的防錯)」

不是真的。

  • 示例1函數調用不比示例2短;您必須在調用函數之前設置實例變量,而不是將值作爲參數傳遞。這是相同的代碼。

  • 示例1函數調用不再被封裝。封裝是整個的屬性,而不是單獨的方法。方法只是方法,它們經常有爭論,因此它們清晰,明顯,可替換且易於測試。

  • 示例1函數調用在任何意義上都不是錯誤證明。您可能忘記設置實例變量,因爲您會忘記在函數調用中傳遞實例變量。

    當你有明確的參數(例2)時,Python可以檢查你是否提供了正確數目的參數。在示例1中,沒有爲您完成檢查。

實施例1: 「較硬測試」

同意。

摘要

實例變量是特殊的。它們反映了某物的存在狀態。對於模型對象,他們是嚴肅的事務,因爲他們經常是持久的。對於GUI對象,它們是「現在正在顯示的內容」,通常是暫時的。

請勿過度使用實例變量。實例變量應該有意義且重要。不僅僅是垃圾變量的東西,沒有一個適當的家在其他地方。

方法函數只是函數。在面向對象的世界中,它們仍然只是功能。它們將輸入參數映射到輸出結果(或對象狀態更改)。通過所有有意義的論點。

+0

謝謝你的回答。 1.更短:我的意思是控制器層的呼叫時間更短。 2.封裝:控制器層不能干擾數據邏輯,不會將錯誤的數據傳遞給一個函數。 3.與2.一樣我在這裏展示的方法,只對班級成員工作,所以沒關係我猜 – chriss 2008-12-18 11:42:49