この目的のために、xml ファイルで特定のノードを検索し、見つかった場合は削除する必要があります。検索機能を独自のメソッドに引き出し、機能を削除して独自のメソッドにする必要がありますか? xmlファイルを一度検索して存在するかどうかを確認し、再度検索して削除するため、この方法ではより費用がかかるようです。これら 2 つの機能を 1 つのメソッドに組み合わせると、見つけたらすぐに削除できます。ここで SRP を正しく理解していますか?
4 に答える
いいえ、Single Responsibility Principle は、コードの記述方法の詳細に関するものではありません。プログラムの機能をクラスに分割する方法についてです。クラスが複数の理由で変更される可能性が高い場合は、2 つのクラスにする必要があります。古典的な例は、レポートを作成してフォーマットするクラスです。レポートの内容とレポートの形式は異なる時期に変更される可能性が高いため、そのクラスは 2 つにリファクタリングするのに適しています。
クラスの機能的な責任が何であるかはわかりませんが、クラスが実行することになっている仕事の観点からすると、XML ノードの検索と削除はその 1 つの仕事の一部に過ぎず、それらを実行します。同じクラスで、1 回の操作で SRP に違反しません。
(一方、クラスに多数のドメイン ロジックがあり、XML の操作に関する多くの基本事項も含まれている場合、SRP に違反します。)
xml ファイルを検索している他の理由/状況はありますか? 一般に、誰かのルールを順守したり、違反したりすることに関係なく、あらゆるレベルで個別のジョブを分離することは良いことです (それが私のルールです ;-) )。これらの関数を分離すると (?)、コードがより理解しやすくなり、パフォーマンスの些細な向上よりも重要になる場合があります。
平均的な XML パーサーは、親を知っているノードを作成するため、次のようなことができます。
XmlNode node = this.FindNode(filter);
node.ParentNode.DeleteChild(node);
このようにして、両方の機能を分割しましたが、オーバーヘッドはありません。
あなたの質問の核心について:はい、1つのメソッドで検索と削除を行うことは単一の責任に違反しますが、パフォーマンスとSRPは多くの場合うまく混ざり合わないため、より重要なものを決定する必要があります。
PS:
例は (故意に) 実際の言語とは関係ありません。
これは、SRP と密接に関連していると思われるCommand Query Separation Principleに違反しています。検索と削除は変更可能な 2 つのことであるため、これらは 2 つの別個の責任として定義することもできます。それらは個別に単体テストできます。ノードを見つける方法にバグがある可能性がありますが、削除にはありません。削除部分をモックアウトすることもできます。また、検索と削除の間の中間点も提供します (これも単体テストとデバッグに戻ります)。
全体として、コマンド クエリの分離には多くの利点があると思いますので、可能な限り従うようにしています。
コードを時期尚早に最適化しないでください。できる限り保守しやすい方法/最適な設計で記述し、それがボトルネックである場合は微調整できます。