没有明确的答案。尽管问题很狭窄,但解释不是。
对我来说,如果您愿意,它就像是Occam的Razor。这是我尝试评估当前代码的理想选择。很难用简单明了的话将其确定下来。另一个比喻是“一个主题”,它与“单一责任”一样抽象,即难以理解。第三个描述是“处理一个抽象级别”。
这实际上意味着什么?
最近,我使用一种编码样式,该编码样式主要包括两个阶段:
第一阶段最好形容为创意混乱。在这一阶段,我记下了思想的流逝,即原始又丑陋的代码。
第二阶段则完全相反。就像飓风过后清理一样。这需要最多的工作和纪律。然后,我从设计师的角度来看代码。
我现在主要在Python中工作,这使我以后可以想到对象和类。第一阶段 -我只编写函数,并且几乎随机地将它们分散在不同的模块中。在第二阶段中,当我掌握了一切之后,我将仔细研究哪个模块处理解决方案的哪一部分。在浏览这些模块时,主题浮出水面。一些功能在主题上相关。这些都是上课的好人选。在将函数转换为类之后-几乎完成了缩进并将其添加self
到python中的参数列表中;)-我使用SRP
像Occam的Razor一样将功能剥离给其他模块和类。
当前的示例可能是前几天编写小型导出功能。
压缩中需要csv,excel和组合的excel表。
普通功能分别在三个视图(=功能)中完成。每个函数都使用一种确定过滤器的通用方法和另一种检索数据的方法。然后,在每个功能中,导出的准备工作都已完成,并作为服务器的响应交付。
混合了太多抽象层次:
I)处理传入/传出的请求/响应
II)确定过滤器
III)检索数据
IV)数据转换
简单的步骤是在第一步中使用一个抽象(exporter
)处理II-IV层。
唯一剩下的是处理请求/响应的主题。在相同的抽象级别上,可以提取请求参数。所以我有这个观点一个“责任”。
其次,我不得不分解出口商,正如我们所见,出口商至少包括另外三个抽象层。
确定过滤器标准和实际检索几乎处于相同的抽象级别(需要过滤器才能获得数据的正确子集)。这些级别被放入数据访问层之类的东西中。
在下一步中,我分解了实际的导出机制:在需要写入临时文件的地方,我将其分为两个“职责”:一个是将数据实际写入磁盘,另一个是处理实际格式。
随着类和模块的形成,事情变得更清楚了,什么属于哪里。始终是一个潜在的问题,即课堂是否做得太多。
您如何确定每个班级应承担的责任,以及如何在SRP中定义责任?
很难给出一个食谱。当然,如果可以帮助的话,我可以重复神秘的“一个抽象层次”的规则。
对我来说,主要是一种“艺术直觉”导致了当前的设计。我对代码进行建模,就像艺术家可以雕刻粘土或绘画一样。
想象我是一个编码鲍勃·罗斯 ;)