在学习最佳软件工程实践时,让我感到困惑的一件事是如何处理类中的方法,这些方法不会改变状态,也不会与状态交互。
在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)困扰着我,所以我不确定。我做了一些阅读,但没有找到针对这种情况的最佳实践的明确答案。
发布于 2017-01-19 07:24:04
这就是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'发布于 2017-01-19 07:18:05
这真的不是一个完整的答案,但我没有足够高的代表来做一个评论。我不是OOP最佳实践方面的专家,但我的直觉是,颜色分析函数最好作为接口实现,因为这样可以将实现的细节留给给定的类,但在类之间可以有一定程度的标准化。
但很明显(according to this),Python并不真正做接口。其他更了解SOLID principles的人可以给出比我更好的建议。
https://stackoverflow.com/questions/41731023
复制相似问题