首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将函数放在不依赖于状态的类之外

将函数放在不依赖于状态的类之外
EN

Stack Overflow用户
提问于 2017-01-19 07:03:56
回答 2查看 295关注 0票数 2

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

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

例如:

代码语言:javascript
复制
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)

代码语言:javascript
复制
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)困扰着我,所以我不确定。我做了一些阅读,但没有找到针对这种情况的最佳实践的明确答案。

EN

回答 2

Stack Overflow用户

发布于 2017-01-19 07:24:04

这就是staticmethod的优势所在。

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

代码语言:javascript
复制
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'

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

代码语言:javascript
复制
>>> Dog.inspect_color('brown')
'Similar to chocolate'

在你的方法中:

代码语言:javascript
复制
>>> dog = Dog('red')
>>> dog.play_in_mud()
'Similar to chocolate'
票数 1
EN

Stack Overflow用户

发布于 2017-01-19 07:18:05

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

但很明显(according to this),Python并不真正做接口。其他更了解SOLID principles的人可以给出比我更好的建议。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41731023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档