出于我的目的,我需要在 xml 文件中搜索特定节点,如果找到,则将其删除。我应该将搜索功能提取到它自己的方法中并将功能删除到它自己的方法中吗?这样做似乎更昂贵,因为我将搜索 xml 文件一次以查看它是否存在并再次搜索以将其删除。如果我将这两个功能组合成一个方法,我可以在找到它时立即删除它。我在这里正确理解 SRP 吗?
4 回答
您的普通 XML 解析器将创建知道其父节点的节点,因此您可以执行以下操作:
XmlNode node = this.FindNode(filter);
node.ParentNode.DeleteChild(node);
这样,您就拆分了两个功能,但没有开销。
关于您问题的核心:是的,在一个方法中搜索和删除违反了单一职责,但性能和 SRP 在许多情况下并不能很好地混合,因此您必须决定更重要的是什么。
PS:
示例与那里的任何真实语言都没有(故意)相关。
您是否有任何其他原因/情况正在搜索 xml 文件?一般来说,在任何级别分离不同的工作是一件好事,无论是否遵守或违反某人的规则(这是我的规则;-))。分离这些函数可能(?)也使您的代码更易于理解,这可能比性能上的微不足道的增益更重要。
不,单一职责原则不是关于如何编写代码的细节。它是关于如何将程序的功能划分为类。它说,如果一个类可能因为不止一个原因而改变,那么它应该是两个类。一个经典的例子是构造和格式化报告的类;报告的内容和报告的格式可能会在不同的时间发生变化,因此该类是重构为两个的好候选。
你没有说你的类的功能责任是什么,但是,从你的类应该完成的任何工作的角度来看,搜索和删除 XML 节点只是那个单一工作的一部分,并且完成它们在同一类和一个操作中不违反 SRP。
(另一方面,如果你的类有很多领域逻辑,并且还有很多关于操作 XML 的具体细节,那么它就会违反 SRP。)
它确实违反了我认为与 SRP 密切相关的命令查询分离原则。搜索和删除是可以改变的两件事,因此也可以将它们定义为两个单独的职责。它们可以单独进行单元测试,您可能会在如何找到节点时遇到错误,但在删除时不会。您可能还想模拟删除部分。它还为您提供了查找和删除之间的中间点(这又回到了单元测试和调试)。
总而言之,我想说命令查询分离有很多好处,所以我尽可能地遵循它。
不要过早地优化你的代码!以最可维护的方式/最好的设计编写它,然后如果它是一个瓶颈,你可以调整它。