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

问题描述 投票:4回答:4

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

oop single-responsibility-principle solid-principles
4个回答
1
投票

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


1
投票

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

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

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

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

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


1
投票

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

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

(另一方面,如果你的类有很多域逻辑,并且还有许多关于操作XML的细节,那么它将违反SRP。)


0
投票

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

总而言之,我会说命令查询分离有很多好处,所以我尽量跟随它。

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

© www.soinside.com 2019 - 2024. All rights reserved.