【发布时间】:2016-10-12 14:17:42
【问题描述】:
我们举办了一次研讨会,向我的团队介绍了单一职责原则,以便我们在项目中使用它。 我使用了以下流行的示例:
class Employee:
save()
calculate_salary()
generate_report()
我要求团队判断这门课是否一切正常。每个人都告诉我,没关系。 但我在这里看到了三个违反 SRP 原则的行为。 如果我说应该从类中提取所有方法,我是对的吗? 我的推理:
save() 方法是更改数据库的原因。
calculate_salary() 方法是改变的原因,因为工资政策可能会改变。
generate_report() 方法是我们想要更改报告的呈现方式(即 csv 而不是 html)时更改的原因。
让我们采用最后一种方法。我想出了以下 HtmlReportGenerator 类。
class HTMLReportGenerator:
def __init__(self, reportable):
self.reportable = reportable
def generate_csv_report()
class CSVReportGenerator:
def __init__(self, reportable):
self.reportable = reportable
def generate_html_report()
现在,即使这个生成器的业务逻辑发生变化,它也不会触及 Employee 类,这是我的主要观点。此外,现在我们可以将这些类重用于 Employee 类对象以外的对象。
但是团队想出了一个不同的类:
class Employee:
save()
calculate_salary()
generate_html_report()
generate_csv_report()
他们明白自己违反了 SRP,但对他们来说没问题。
这就是我没有其他想法可以争取的地方))
对这种情况有什么想法吗?
【问题讨论】:
-
“他们明白他们违反了 SRP”。我简直不敢相信他们明白这一点。 SRP是达到目的的手段。这个目的是可维护性。孤立地看这样一个小例子时,通常很难看出拆分类的好处。
-
是的。很明显,当系统增长时,问题就会出现。但是他们认为为每种类型的报告创建一个新类是过分的。就像每次添加新方法一样容易。我只是不知道如何明确系统应该从一开始就可扩展)
-
这个问题可能属于程序员而不是SO。
-
对我来说,它们是 3 个不同的职责,应该分开。我目前正在学习,还有另一个角度可以看待这个问题。那就是“改变”。如果您希望发生这种变化,那么请继续分担责任。如果您绝对确定,不会发生特定的变化,并且希望尽量减少复杂性,那就顺其自然吧。
标签: python architecture solid-principles single-responsibility-principle design-principles