【问题标题】:Placing a function outside of a class that doesn't depend on state将函数放在不依赖于状态的类之外
【发布时间】:2017-01-18 23:03:55
【问题描述】:

在研究最佳软件工程实践时,让我感到困惑的一件事是如何处理不改变状态或与状态交互的类中的方法。

this article我喜欢作者讨论数据和逻辑分离的方式。但是在尝试将其应用到实践中时,我遇到了一些情况,即我在类之外有一个奇怪的函数,它不会改变对象的状态,但在对象之外并不真正相关。

例如:

def inspect_color(color):
    if color == 'brown':
        return 'Similar to chocolate'

class Dog(object):

   def __init__(self, color):
       self.color = color

   def play_in_mud(self):
       self.color = 'brown'
       results = inspect_color(self.color)

对比

class Dog(object):

   def __init__(self, color):
       self.color = color

   def play_in_mud(self):
       self.color = 'brown'
       results = self.inspect_color()

    def inspect_color(self):
        if self.color == 'brown':
            return 'Similar to chocolate'

是否有一个通用的软件工程原则或最佳实践(来自任何合理的范式)建议应该遵循这些方法中的哪一个?由于多种原因,我的直觉告诉我顶部的更好,除了这样做:inspect_color(self.color) 困扰我,所以我不确定。我做了一些阅读,但没有找到关于此类案例最佳实践的明确答案。

【问题讨论】:

  • 这可能是题外话,因为它过于基于意见,但就其价值而言,我认为第一个更好。类膨胀是baaaad。
  • 感谢您的想法。有什么建议可以更好地解决这个问题吗?我希望有一个最佳实践,它不是基于意见的,而是好的。
  • 为什么这会困扰您? ——我以前也这么想,但原因只是不合理的条件,即“好”的 OOP 意味着总是写 obj.method()。这根本不是真的。除了习惯之外,没有客观的原因它不好(而且,老实说,它为调用事物的函数创建了一种不统一的语法这一事实;但无论如何在 Python 中都是如此,所以它不适用于这里)。
  • @jstaker7 你能改变问题,这样就不是“哪个更好?”您提供了一个具体示例,但正如另一位评论者所说,这完全是基于意见的。
  • 当然可以。只是进行了更改,使其更具体,更少基于意见。

标签: python oop


【解决方案1】:

这就是staticmethod 的用处。

静态方法不接收隐式的第一个参数。

class Dog(object):

    def __init__(self, color):
        self.color = color

    def play_in_mud(self):
        self.color = 'brown'
        results = self.inspect_color(self.color)
        return results

    @staticmethod
    def inspect_color(color):
        if color == 'brown':
            return 'Similar to chocolate'

你可以像函数一样使用它:

>>> Dog.inspect_color('brown')
'Similar to chocolate'

在你的方法中:

>>> dog = Dog('red')
>>> dog.play_in_mud()
'Similar to chocolate'

【讨论】:

  • 我不认为(或者更确切地说,我不同意)这是静态方法的好用处。方法与Dog无关;只有color。它根本不属于Dog。它可能属于同一个模块,但肯定不在类中。
  • 也许这是由于示例,但 OP 的替代方法是外部函数或以 self 作为第一个参数的实例方法。我认为将两者放在一起会形成一个静态方法。
  • ...或者只是使用外部函数。
【解决方案2】:

这并不是一个完整的答案,但我没有足够高的代表来发表评论。我不是 OOP 最佳实践方面的专家,但我的直觉是颜色分析功能最好作为一个接口来实现,因为这样可以将实现的细节留给给定的类,但可能会有一些跨类的标准化程度。

结果表明 Python 并没有真正做接口(@98​​7654321@)。其他更了解SOLID principles 的人可以提供比我更好的建议。

【讨论】:

  • 你说得对,OP 的示例是人为设计的,inspect_colour 作为在别处定义的函数是有意义的,以避免违反单一职责原则 (SOLID )。我在 Python 中使用静态方法,就像在 Java 或 C# 中使用它们一样 - 实现特定于不需要引用实例的类的功能(即self)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
相关资源
最近更新 更多