2010-07-21 46 views
1

我正在編寫一個撲克手評估器作爲我的第一個編程項目。我已經完成了三個類,每個類都很好地完成了其狹義定義的任務:有明確的,狹隘的課程......現在我怎麼在我的程序中完成任何事情?

HandRange =類似字符串的對象(例如「AA」)。 getHands()返回一個元組列表的字符串中的每個特定的手:

[(Ad,Ac),(Ad,Ah),(Ad,As),(Ac,Ah),(Ac,As),(Ah,As)] 

翻譯=映射從getHands到對於一個給定的評估有用的值(是的,這大概可以返回列表的字典重構爲另一個類)。

{'As':52, 'Ad':51, ...} 

計算器=需要從HandRange列表(如翻譯的翻譯),枚舉所有可能的手的對決,並提供每個贏得%。

我的問題:考慮到我可能想通過shell UI或GUI連接它,我應該使用所有這些類的「域」類應該是什麼樣子?現在,它看起來像一個流水線過程:

user_input = HandRange() 
x = Translation.translateList(user_input) 
y = Evaluator.getEquities(x) 

這聞起來好笑,因爲它感覺像程序時,我應該使用OO。

用更普通的方式:如果我花了那麼多時間來確保我的類是精確定義的,狹隘的聚焦,正交的,無論如何......當我需要使用時,如何在程序中實際管理工作流程他們全部連在一起?

感謝,

邁克

+0

「這聽起來很有趣,因爲當我應該使用面向對象時,它感覺像是程序性的。」算法不是固有程序性的嗎?它的實際問題是什麼? OO編程圍繞着核心程序編程。除此之外還可以指定哪些方面?你有一個更「程序性」的替代程序嗎? – 2010-07-21 15:43:46

回答

3

不要迷信面向對象 - 畢竟Python支持多種範例!將您的用戶定義類型(即AKA類)視爲構建塊,逐漸爲您提供更接近您的域的「語言」,而不是通用語言/庫原語。 (在命令行中,你會提供任何接口 - 命令行,RPC,Web,GUI,或其他語言)的某些內容。 ...) - 這些可能是模塊級函數,也可能是一些包含類的方法。如果你需要多個實例,你肯定會想要一個類,而且如果這些動作涉及到更新「狀態」(一個類的實例變量比全局變量更好),或者繼承和/或多態性起作用,那麼你肯定會想要一個類。但是,沒有先驗的理由更喜歡類功能,否則。如果你發現自己編寫靜態方法,渴望單例(或Borg)設計模式,編寫一個沒有狀態的類(只是方法) - 這些都是「代碼氣味」,它們會提示你檢查你是否確實需要爲你的代碼的子集創建一個類,或者說你是否可能過於複雜,並且應該爲你的代碼部分使用一個帶有函數的模塊。 (有時經過適當的考慮後,你會發現一些喜歡上課的不同理由,這也沒關係,但重點是,不要僅僅在一個模塊上選擇一個功能「通過反射」的功能,而不需要仔細考慮它!)。

1

您可以創建一個都在一起,打領帶這些intialize所有這些東西在__init__()方法的撲克類:

class Poker(object): 
    def __init__(self, user_input=HandRange()): 
     self.user_input = user_input 
     self.translation = Translation.translateList(user_input) 
     self.evaluator = Evaluator.getEquities(x) 

    # and so on... 

p = Poker() 
# etc, etc... 
相關問題