代码之家  ›  专栏  ›  技术社区  ›  MikeRand

有明确的定义,狭隘的重点课程…现在我如何在我的程序中完成任何事情?

  •  1
  • MikeRand  · 技术社区  · 14 年前

    我正在编写一个扑克手评估器作为我的第一个编程项目。我已经完成了三个类,每个类都很好地完成了其狭义的任务:

    HandRange=类似字符串的对象(例如“AA”)。getHands()返回字符串中每个特定指针的元组列表:

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

    Translation=一个字典,它将getHands的返回列表映射到对给定的求值器有用的值(是的,这可能会被重构到另一个类中)。

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

    我的问题是:如果我想通过shell UI或GUI连接到“domain”类,那么使用这些类的“domain”类应该是什么样的呢?现在,它看起来像一个装配线过程:

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

    这闻起来很好笑,因为当我应该使用OO时,感觉它是程序化的。

    谢谢,

    2 回复  |  直到 14 年前
        1
  •  3
  •   Alex Martelli    14 年前

    不要迷恋面向对象——毕竟Python支持多种范式!把用户定义的类型(AKA类)看作是构建块,它逐渐为您提供一种更接近您的域的“语言”,而不是通用语言/库原语。

    表演 一些东西(在您将提供的任何接口的命令下——命令行、RPC、web、GUI等等)——这些可能是模块级函数以及包含在某个类中的方法。如果您需要多个实例,并且最有可能的情况是操作涉及到更新“state”(类的实例变量比全局变量好得多)或者继承和/或极射开始起作用,那么您肯定需要一个类;但是,没有一个先验的理由去选择类而不是函数。

    如果你发现自己在写静态方法,渴望一个单例(或Borg)设计模式,写一个没有状态的类(仅仅是方法)——这些都是“代码气味”,应该提示你检查你是否真的需要一个类来处理你的代码子集,或者更确切地说,您是否可能过于复杂的事情,应该使用一个模块的功能,为您的代码的一部分(有时经过适当的考虑,你会发现一些不同的原因,喜欢一个类,这也没关系,但关键是,不要只是选择一个类而不是一个模块w/函数“反射”,没有批判性的思考它!)。

        2
  •  1
  •   jathanism    14 年前

    您可以创建一个扑克类,将这些绑定在一起,并初始化 __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...