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

在python中,有状态对象和无状态计算之间的分隔放在哪里?

  •  1
  • Rickard  · 技术社区  · 16 年前

    下面哪个代码片段是最“pythonic”的?在这个例子中,计算是微不足道的,但在现实生活中可以假设是复杂的。

    class A(object):
        """Freely mix state and calcs - no good I presume"""
        def __init__(self, state):
            self.state = state
    
        def calc_with_state(self, x):
            return (self.state + x)**2
    

    class B(object):
        """Separate state from calc by a static method"""
        @staticmethod
        def inner_calc(u, v):
            return (u + v)**2
    
        def __init__(self, state):
            self.state = state
    
        def calc_with_state(self, x):
            return B.inner_calc(self.state, x)
    

    class C(object):
        """Break out the calculation in a free function"""
        def __init__(self, state):
            self.state = state
    
        def calc_with_state(self, x):
            return outer_calc(self.state, x)
    
    def outer_calc(u, v):
        return (u + v)**2
    
    5 回复  |  直到 16 年前
        1
  •  5
  •   David Berger    16 年前

    正如朗肖特所写。问题很简单,就是

    平的比嵌套的好。

    看:将状态与计算分离是一个很好的设计原则,但这并不意味着你会怎么想,至少我不能从这个例子中推断出你的想法。我们要确保州政府不会 改变 以便在下次计算时不重新初始化该状态时完成计算。如果state对于某个特定的计算是只读的,那么就不必在文体上强制重定向以避免直接读取它。也就是说,除非计算 状态足够复杂,需要单独的单元测试。那么,无论如何,B或C将是首选,但是 只有当为 u 而不是实例化 A .

        2
  •  1
  •   SilentGhost    16 年前

    我认为这取决于你的具体项目。是 cal_with_state 仅适用于此特定类,或者该方法需要在许多不同的对象之间共享?不同的班级分享吗?

    任何一种方法都不或多或少有点像蟒蛇,使用一种可以满足您的项目的方法。干的可不是脓毒症。

        3
  •  0
  •   Singletoned    16 年前

    我个人认为这取决于可恢复性。如果计算是可以与其他对象一起使用的(它看起来确实是这样),那么第三个示例是最可重用的。如果计算完全绑定到对象或永远不会被重用,则第一个示例。我认为第二个例子在大多数情况下是错误的。

        4
  •  0
  •   mmmmmm    16 年前

    A怎么了?它只在一个地方进行计算,并且不修改状态,所以用状态计算是一种不改变状态的方法,也是一种“简单”行为。如果状态很复杂,它会停止将大量参数传递到计算函数中。

    但是,如果可以将状态作为参数(如C所示)来编写计算,则可以将计算分离出来。这样做的好处包括可以对不属于C类的数据执行此计算,还可以将此函数用作传递给C的数据,这样就可以使具有C状态的Calc_调用不同的计算函数

    我看不出b有什么好处,因为inner_calc没有使用类,所以也可以是一个自由函数。

    所以我可能会先把它写下来,然后如果想重用计算,让类使用不同的计算,或者如果计算代码太大,可以重构成C类

        5
  •  0
  •   mjv    16 年前

    不管是静态方法还是全局方法,将计算结果分解都没有任何好处 关于国家意识 . 唯一的一个小优势是,代码显式地显示了在计算中考虑了对象的哪些状态属性(显示在函数调用的级别,而不是必须在类a中的方法逻辑中读取)

    引入无状态(静态、全局)或实例方法可能还有其他好处:

    • 可重用性
    • 代码可读性和总体管理

    但如前所述,这些结构 对国家管理本身没有帮助 . 对我来说,A方法似乎是相当合法的(而且是蟒蛇式的)。的确 戴维伯杰 打败我们,提醒我们…

    平的比嵌套的好!

    .