2016-12-26 45 views
1

我有一些麻煩,決定構建某個類的最佳方式。課程將採用一些字符串作爲設置,方法將根據設置創建不同種類的圖表。例如,蟒蛇如何構造這個類

。它可以被稱爲是這樣的...

c = ChartEngine(type='line', labels='foo bar', data='1, 2', data2='3, 4') 
chart = c.make_chart() 

IDK,如果它是最好地安排此爲一類,或者只是一個功能,將調用其他功能在同一模塊中...... IDK如果我只是把__init__函數中的邏輯將設置爲調用make_chart函數或者如果有其他方法。

def __init__(*settings*): 
    self.type = type 
    self.labels = labels 
    self.data = data 
    .... 

make_chart(self.type, self.labels, self.data): 
    if self.type == "line": 
     line_chart(settings) 
    elif self.type == "bar": 
     bar_chart(settings) 
    ... 

你會如何構建這樣的類?

+0

您最好調用'make_chart(type)'而不是顯式檢查並傳遞相同的值。 –

+0

對於一個,我會在if/elif測試中使用'=='而不是'='。另外,這有點太寬泛 - 它可能最終會被關閉,因爲它主要是基於意見的。 –

+0

是的,這取決於你自己的習慣。至於我,我想將設置保存在'__init__'中,並通過讀取已經保存的設置明確地調用'make_chart'。 – Acepcs

回答

2

這是一個設計問題。根據問題的性質,你可以使用許多主觀方法。您最好喜歡以這樣一種方式設計您的程序,以使您的源代碼通常可以解耦,從而使未來的更改變得微不足道。但過度工程是一件事情,所以要考慮到手頭的要求。各種方法可以產生某些好處。以下是一個示例方法。

你可以打電話ChartEngine如你所提到)主控制類,它可以通過Chart子類調度的各種圖表。然後你可以實現一個名爲Chart的基類,它可以作爲各種變體的超類。你的程序的性質適合繼承超過我的意見(再次,許多不同的方法可以使用)。

class Chart(object): 
    def __init__(self): 
     pass 
    def draw(self): 
     pass 
    ... 

然後延伸/通過的Chart繼承覆蓋基類的功能。然後,您可以實現像一個Line類,例如:

class Line(Chart): 
    pass 

class Bar(Chart): 
    pass 

至於ChartEngine,你可以能有類必須爲每個類似於一個MVC Web應用程序的路線不同圖表類型的調度方法。一種方法可能是設置一個跟蹤各種圖形及其相關調度方法的字典。

class ChartEngine(object): 
    type_to_dispatch = {"bar" : dispatch_bar, "line" : dispatch_line} 
    def __init__(self, type, labels, data): 
     self.type = type 
     self.labels = labels 
     self.data = data 
     ... 

    def make_chart(self): 
     type_to_dispatch[self.type]() 
    def dispatch_line(self): 
     pass 
    def dispatch_bar(self): 
     pass 
+0

我喜歡這個想法。它看起來像在'dispatch'方法中,圖表類型('Chart'子類)將被立即執行,對嗎? – deltaskelta

+0

就是這個想法。我留下了那些不完整的東西,因爲你可以用很多方法去解決這個問題。你甚至可以創建一個'Dispatch'類來定義如何分配一個圖表,這樣你就可以避免任何重複的代碼。或者你可以在那裏調用你的構造函數。很多選擇。 – ospahiu

3

使用測試作爲設計工具。爲你想要的一個微不足道的功能寫一個測試。讓它失敗,然後寫出讓它通過的最小代碼。然後用其他功能編寫另一個測試,讓它失敗等。使用此開發週期(TDD),您可以從用戶角度進行設計,並對您的實施進行適當的封裝和抽象。您可能想了解pytest模塊。

乍一看,我會說你的班級在你計劃時會知道太多不同的事情。閱讀關於SRP和其他SOLID原則,讓您開始處理此事。最重要的是,只實現你現在需要的東西,僅此而已。

Finaly,ChartEngine看起來像抽象工廠模式的用例,這很難用優雅的代碼來實現。從最簡單的用例開始,並儘早重構。

+0

這實際上是一個非常好的主意,因爲它有助於自然而有機地發展圖表引擎,而無需花費時間在前期設計完美的解決方案。對象以Java方式定位可能不是最好的解決方案,因爲Python已經在語言本身中內置了很多工廠模式,支持MRO和操作符重載等多重繼承。 – Eddie