對於我而言,我需要尋找在一個XML文件中的特定節點,如果找到,將其刪除。我是否應該將搜索功能引入自己的方法中,並將功能刪除到自己的方法中?這樣做似乎更昂貴,因爲我將搜索xml文件一次以查看它是否存在並再次搜索以將其刪除。如果我將這兩個功能組合到一個單一的方法中,我可以在找到它的時候將其刪除。我在這裏正確理解SRP嗎?有沒有辦法違背單一責任原則做了不止一件事?
回答
你有什麼其他的原因/情況下,您正在搜索的xml文件?總的來說,不論遵守或違反某人的規則(這是我的規則;-)),在任何級別分開不同的工作是一件好事。分離這些函數可能會使代碼更容易理解,這可能會比性能上的微不足道的增益更重要。
問題是,你這樣做肯定違反了SRP,因爲你剛剛爲你的類創建了另一個改變理由的原因:'我需要它每秒處理一個16Mb XML文件5次'。 SRP是關於改變組織在類或模塊中的代碼。任何時候,有人用它作爲一種不涉及程序員鍵入內容的情況的隱喻,他們就會濫用它。 – soru 2010-07-19 23:53:56
您的平均XML解析器將創建知道父母的節點,所以你可以這樣做:
XmlNode node = this.FindNode(filter);
node.ParentNode.DeleteChild(node);
這種方式,你有分裂的兩種功能,但沒有任何開銷。
關於你的問題的核心:是的,搜索和在一個方法刪除違反了單一職責,但性能和SRP不要混用是很好在許多情況下,所以你必須決定什麼更重要。
PS:
示例不是(明知)與任何真實語言有關。
沒有,單一職責原則是不是代碼是怎麼寫的細節。這是關於如何將程序的功能劃分爲類。它說如果一個班級可能因一個以上的原因而改變,它應該是兩個班級。一個典型的例子是構建和格式化報告的類;報告的內容和報告的格式可能會在不同的時間發生變化,所以班級是重構爲二的好選擇。
你不會說你的類的功能責任是什麼,但是從你的類應該完成的任何工作的角度來看,搜索和刪除XML節點只是單個工作的一部分,並且在同一班級和同一個操作中進行操作並不違反SRP。
(在另一方面,如果你的類有很多領域邏輯的,也是一個有關處理XML很多螺母和螺栓,這將違反SRP)。
它確實違反Command Query Separation Principle我覺得去與SRP攜手並進。搜索和刪除是兩件事情可以改變,所以這些也可以被定義爲兩個單獨的責任。它們可以單獨進行單元測試,您可能在如何找到節點方面存在錯誤,但不在刪除中。您可能還想模擬刪除部分。它還爲您提供了查找和刪除之間的中間點(再次回到單元測試和調試)。
總而言之,我會說有很多好處來命令查詢分離,所以我儘可能地遵循它。
不要過早地優化您的代碼!以最可維護的方式/最好的設計書寫它,然後如果它是瓶頸,可以調整它。
- 1. 單一責任原則是否違規
- 2. 單一責任原則
- 3. 單一責任原則webapi
- 4. 「富域模式」能否違反單一責任原則?
- 5. 我的代碼是否違反單一責任原則?
- 6. 退出($ status)是否違反單一責任原則?
- 7. 什麼時候違反單一責任原則是合理的?
- 8. 嚴格遵守單一責任原則是否違反封裝?
- 9. 抽象工廠違反單一責任原則?
- 10. 違反Java核心迭代器中的單一責任原則
- 11. 瞭解單一職責原則
- 12. 幫助理解單一責任原則
- 13. 單一責任原則和課
- 14. 單一責任原則和知識庫
- 15. 單一責任原則 - 功能
- 16. 單一責任原則和Backbone.View
- 17. 「迴歸成功」的方法是否違反單一責任原則?
- 18. 如何在MVVM中構建ViewModel不違反單一責任原則?
- 19. 瞭解SOLID設計的單一責任原則
- 20. 有沒有辦法停止OnItemSaving事件?
- 21. 是單一責任原則OOP的一個規則?
- 22. 按單責任原則重構方法
- 23. PHPMD說違反單一職責原則具有布爾默認值參數
- 24. 是否實現多個接口違反單一職責原則
- 25. 正在調用其他代碼(SOLID)單一責任原則(SRP)違規?
- 26. 自並流測試模式是否違反單一責任原則?
- 27. 以下代碼中的類CommaDelimLog是否違反單一責任原則?
- 28. 您違反單一責任原則的最佳範例是什麼?
- 29. 生成器設計模式是否違反單一責任原則?
- 30. 實現某些東西的主類是否違反單一責任原則?
SRP說*應該只有一個原因讓你的班級改變*。就你而言,你已經處於方法級別,這意味着你不一定會通過你的方法做什麼來違反SRP,而是你的班級做什麼。如果你有一個操作XML文件的類,SRP不關心你是用兩種方法還是兩種方法來做。你應該更擔心違反DRY。 :) – bzlm 2010-03-10 15:34:58
@bzlm不需要長方法的規則呢? – 2014-12-31 12:18:48
@JimmyT。我知道沒有這樣的規則,也沒有一個理由。當然你沒有想到我在評論結尾提到的規則,你回答了? – bzlm 2015-01-01 11:08:48