- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我们举办了一个研讨会,我向我的团队介绍了单一职责原则,以便我们在我们的项目中使用它。我使用了以下流行示例:
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/
如果有人能为我分解它,让我能理解它,我会非常感激。我知道它用于通过 apply 方法创建新对象。 Function.prototype.new = function () { var args
新版本的HADOOP中有一个方法。http://hadoop.apache.org/docs/current/api/org/apache/hadoop/fs/FileSystem.html#conc
根据支持库变更日志和 Fragment 类文档 ( https://developer.android.com/reference/android/support/v4/app/Fragment.ht
根据支持库更改日志和 Fragment 类文档 (https://developer.android.com/reference/android/support/v4/app/Fragment.htm
执行Async BigJob() 的无限运行任务的正确方法是什么?并且可以根据要求停止 提示:我正在尝试学习 [一种] 新方法来更新我现有的策略。 我有一个简单的程序(测试程序),它有一个开始 和停止
我将解释我的想法:我使用 python 作为谷歌应用程序引擎 + js + css 主项目将存储在 src 文件夹下,如下所示:\src \app <--- 这里是 gae 的所有 python 应用
我是一名优秀的程序员,十分优秀!