gpt4 book ai didi

python - 我应该向类添加新方法而不是使用单一职责原则吗

转载 作者:太空宇宙 更新时间:2023-11-04 05:21:56 25 4
gpt4 key购买 nike

我们举办了一个研讨会,我向我的团队介绍了单一职责原则,以便我们在我们的项目中使用它。我使用了以下流行示例:

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 和开/关原则,并且每次有新的报告类型他们都会再次违反。

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

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

employee.generate_report(new CSVReport())

employee.generate_report(new HTMLReport())

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

employee.generate_report(new XMLReport())

这给了你很大的灵 active ,不需要为新的报告类型改变员工,并且更容易测试(例如,如果 generate_report 有复杂的逻辑,你可以只创建一个实现 Report 接口(interface)的 TestReport 类并打印到用于调试和调用 generate_report(new TestReport())) 的输出流

关于python - 我应该向类添加新方法而不是使用单一职责原则吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40001010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com