有一种方法不止一件事违反了单一责任原则吗?

时间:2010-03-10 15:32:37

标签: oop single-responsibility-principle solid-principles

出于我的目的,我需要在xml文件中搜索特定节点,如果找到,则删除它。我应该将搜索功能拉出到自己的方法中并将功能删除到自己的方法中吗?这样做似乎更昂贵,因为我将搜索xml文件一次以查看它是否存在并再次搜索以删除它。如果我将这两个功能组合到一个方法中,我可以在找到它时将其删除。我在这里正确理解SRP吗?

4 个答案:

答案 0 :(得分:1)

您的普通XML解析器将创建了解父母的节点,因此您可以执行以下操作:

XmlNode node = this.FindNode(filter);
node.ParentNode.DeleteChild(node);

这样你就可以拆分这两个函数但没有开销。

关于你的问题的核心:是的,在一种方法中搜索和删除违反了单一责任,但在许多情况下,性能和SRP不能很好地混合,所以你必须决定什么更重要。

PS:
示例不是(明知)与任何真实语言有关。

答案 1 :(得分:1)

您是否有其他原因/情况正在搜索xml文件?一般来说,在任何级别分离不同的工作都是一件好事,无论是否遵守或违反某人的规则(这是我的规则;-))。分离这些函数可能(?)也使你的代码更容易理解,这可能比在性能上获得微不足道的重要性更重要。

答案 2 :(得分:1)

不,单一责任原则与代码编写的细节无关。它是关于如何将程序的功能划分为类。它说如果一个班级可能由于多个原因而改变,那么它应该是两个班级。一个典型的例子是构建和格式化报告的类;报告的内容和报告的格式可能会在不同的时间发生变化,因此该课程很适合重构为两个。

您没有说出您的类的功能是什么,但是,从您的类应该完成的任何工作的角度来看,搜索和删除XML节点只是该单个作业的一部分,并且在同一个类中并且在一次操作中执行它们不会违反SRP。

(另一方面,如果你的类有很多域逻辑,还有很多关于操纵XML的细节,那就违反了SRP。)

答案 3 :(得分:0)

它确实违反Command Query Separation Principle,我认为这与SRP密切相关。搜索和删除是可以改变的两件事,因此这些也可以被定义为两个单独的职责。它们可以单独进行单元测试,您可能在查找节点时遇到错误,但在删除时没有。您可能还想模拟删除部分。它还为您提供了查找和删除之间的中间点(再次,这可以追溯到单元测试和调试)。

总而言之,我说命令查询分离有很多好处,所以我尽可能地遵循它。

不要过早地优化您的代码!以最易于维护的方式/最好的设计来编写它,然后如果它是瓶颈,您可以调整它。