2013-04-04 66 views
0

我是新來的OOP和我用Python寫一個小工具,它使用JSON負載從網絡Bitcoin() class檢查比特幣的價格,它監視價格Monitor(),通知臨界值時,滿足Notify()用戶,並使用一個控制檯界面Interface()爲現在要這樣做。我還應該創建一個類嗎?如果它只能有一個實例?

我創建了一個Bitcoin()類,可以從JSON負載中讀取價格和卷。 __init__定義使用套接字連接到Web。由於這個類的每個實例都會導致一個新的套接字,所以我只需要/希望運行這個類的一個實例。

  1. 類仍然是最好的方法來解決這個問題嗎?
  2. 讓其他類和實例與我的Bitcoin()實例交互的最佳方式是什麼?
  3. 我應該全球一個Bitcoin()實例嗎?將實例作爲參數傳遞給每個需要它的類?

回答

0

面向對象是一個工具,而不是一個目標,你可以決定是否使用它。如果你使用Python模塊,你可以實現封裝,而不用寫「class」。

+0

我的目標是學習OOP,所以它可以是我可以訪問的工具。我希望能夠使用這個項目,因爲它看起來小到可以實現這個目標。 – pedram 2013-04-04 17:38:59

+0

好吧,一個Python模塊是一個對象。它具有屬性和方法。它爲其內部提供了封裝。你唯一不能做的就是創建多個實例。另外,從模塊派生並不是真的支持,儘管你可以創建一個擴展或覆蓋另一個模塊的模塊。建議:嘗試應用面向對象的原則,看看它是如何工作的,記住可能有其他方法。 – 2013-04-06 11:25:48

2

這對我而言是SRP違反,您Bitcoin類可能不應該負責的第一件事:

  • 開放插座,
  • 解析結果,
  • 渲染輸出。

我不知道詳細信息,但從我的角度來看,您應該將該功能拆分爲更小的類/函數(僅使用模塊),其中一個將負責從Web檢索數據。還請記住,全球狀態是邪惡的(在某些情況下,單身可以被描述爲全球狀態)。

從我的角度來看,還有一點就是在構造函數中打開一個套接字。這不是可測試的,當然你可以模擬/存根套接字,但從我的角度來看,當類需要所有依賴作爲構造參數時更好。通過這樣做,你也可以注意到一些具有廣泛責任的類(如果你的構造函數需要更多的3,4參數,它肯定可以被簡化)。

+0

謝謝,分班可能是要走的路。我也很討厭全局變量。存儲價格和數量的首選方式是什麼,以便在需要時可供其他類使用? – pedram 2013-04-04 17:41:33

+1

一如既往..它取決於(:我知道TDD在任何時候都不是那麼好,但是在大多數情況下,它可以用體面的設計創建可測試的代碼(: – 2013-04-04 17:50:31

1

http://www.youtube.com/watch?v=o9pEzgHorH0

我不知道該如何視頻相關的是爲您的項目(無碼實際上讀)。但是,也許你會回答你的問題。至少你會學到一些新的東西,那就是這裏的東西。

+0

謝謝,那是值得的時間看着它,雖然對初學者來說可能有點複雜,因爲它需要一些編程經驗。 – 2013-04-06 11:48:50

1

如果我是你,我的代碼會是這樣的:
(爲每個組作業類,這是不是你在做什麼)

class Interface: 
    ''' Handle UI ''' 
    ... 

class Connect: 
    ''' Handle web interface ''' 
    ... 

class Bitcoin: 
    ''' Handle the calculations ''' 
    ... 

class Notify: 
    ''' Notifier ''' 
    ... 

總之,分割你的類成更小更簡單的類

現在對於你的問題:

  1. 是的,因爲你手頭上有一個「複雜十歲上下」的問題,你在使用Python,所以它肯定更容易地創建一個面向對象的版本比非OOP一。所以,除非你有充分的理由不堅持,否則堅持OOP。
  2. 就你而言,它可能是傳遞實例作爲參數。
  3. 這是一個好主意。這消除了範圍造成的問題,如果你對它們沒有很好的理解。
    但是請記住,您傳遞的是引用而不是值,因此操縱實例可以影響實例傳遞給其他類。

注:在類的構造函數打開一個套接字是不是一個好主意。如果你有一種方法,它可能會更好。

相關問題