【发布时间】: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 你能改变问题,这样就不是“哪个更好?”您提供了一个具体示例,但正如另一位评论者所说,这完全是基于意见的。
-
当然可以。只是进行了更改,使其更具体,更少基于意见。