2010-03-10 62 views
4

對於我而言,我需要尋找在一個XML文件中的特定節點,如果找到,將其刪除。我是否應該將搜索功能引入自己的方法中,並將功能刪除到自己的方法中?這樣做似乎更昂貴,因爲我將搜索xml文件一次以查看它是否存在並再次搜索以將其刪除。如果我將這兩個功能組合到一個單一的方法中,我可以在找到它的時候將其刪除。我在這裏正確理解SRP嗎?有沒有辦法違背單一責任原則做了不止一件事?

+1

SRP說*應該只有一個原因讓你的班級改變*。就你而言,你已經處於方法級別,這意味着你不一定會通過你的方法做什麼來違反SRP,而是你的班級做什麼。如果你有一個操作XML文件的類,SRP不關心你是用兩種方法還是兩種方法來做。你應該更擔心違反DRY。 :) – bzlm 2010-03-10 15:34:58

+0

@bzlm不需要長方法的規則呢? – 2014-12-31 12:18:48

+0

@JimmyT。我知道沒有這樣的規則,也沒有一個理由。當然你沒有想到我在評論結尾提到的規則,你回答了? – bzlm 2015-01-01 11:08:48

回答

1

你有什麼其他的原因/情況下,您正在搜索的xml文件?總的來說,不論遵守或違反某人的規則(這是我的規則;-)),在任何級別分開不同的工作是一件好事。分離這些函數可能會使代碼更容易理解,這可能會比性能上的微不足道的增益更重要。

+0

問題是,你這樣做肯定違反了SRP,因爲你剛剛爲你的類創建了另一個改變理由的原因:'我需要它每秒處理一個16Mb XML文件5次'。 SRP是關於改變組織在類或模塊中的代碼。任何時候,有人用它作爲一種不涉及程序員鍵入內容的情況的隱喻,他們就會濫用它。 – soru 2010-07-19 23:53:56

1

您的平均XML解析器將創建知道父母的節點,所以你可以這樣做:

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

這種方式,你有分裂的兩種功能,但沒有任何開銷。

關於你的問題的核心:是的,搜索和在一個方法刪除違反了單一職責,但性能和SRP不要混用是很好在許多情況下,所以你必須決定什麼更重要。

PS:
示例不是(明知)與任何真實語言有關。

1

沒有,單一職責原則是不是代碼是怎麼寫的細節。這是關於如何將程序的功能劃分爲類。它說如果一個班級可能因一個以上的原因而改變,它應該是兩個班級。一個典型的例子是構建和格式化報告的類;報告的內容和報告的格式可能會在不同的時間發生變化,所以班級是重構爲二的好選擇。

你不會說你的類的功能責任是什麼,但是從你的類應該完成的任何工作的角度來看,搜索和刪除XML節點只是單個工作的一部分,並且在同一班級和同一個操作中進行操作並不違反SRP。

(在另一方面,如果你的類有很多領域邏輯的,也是一個有關處理XML很多螺母和螺栓,這將違反SRP)。

0

它確實違反Command Query Separation Principle我覺得去與SRP攜手並進。搜索和刪除是兩件事情可以改變,所以這些也可以被定義爲兩個單獨的責任。它們可以單獨進行單元測試,您可能在如何找到節點方面存在錯誤,但不在刪除中。您可能還想模擬刪除部分。它還爲您提供了查找和刪除之間的中間點(再次回到單元測試和調試)。

總而言之,我會說有很多好處來命令查詢分離,所以我儘可能地遵循它。

不要過早地優化您的代碼!以最可維護的方式/最好的設計書寫它,然後如果它是瓶頸,可以調整它。

相關問題