【问题标题】:Should I add new methods to a class instead of using Single Responsibility Principle我应该向类添加新方法而不是使用单一责任原则吗
【发布时间】: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


【解决方案1】:

我同意你的观点,通过添加额外的功能,他们违反了 SRP 和打开/关闭原则,每次出现新的报告类型时,他们都会再次违反它。

我会保留 generate_report() 函数,但从具有函数 generate() 的接口类型“ReportType”添加一个参数。

这意味着例如您可以调用(请原谅我的 Java):

employee.generate_report(new CSVReport())

employee.generate_report(new HTMLReport())

明天如果你想添加一个 XML 报告,你只需从 Report 接口实现 XMLReport 并调用:

employee.generate_report(new XMLReport())

这为您提供了很大的灵活性,无需为新的报告类型更改员工,并且更容易测试(例如,如果 generate_report 具有复杂的逻辑,您可以创建一个实现 Report 接口的 TestReport 类并打印到用于调试和调用的输出流 generate_report(new TestReport()))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多