web-dev-qa-db-ja.com

コマンドクエリの分離またはDRYを壊すことなく、データを更新して更新のリストを返す方法は?

少し複雑なJSONオブジェクトを更新してから、行われた変更のリスト(更新されたデータではない)を返す使用例があります。変更のリストを見つけるプロセスは、変更を加えるプロセスと非常に似ており、2つの方法を分離することを選択した場合、ある程度の冗長性がもたらされます。したがって、CQSおよびSRPよりもDRYを選択せず​​にこれを行う方法があるかどうか疑問に思っています。

3
Shreyas P Babu

すべての コマンドクエリの分離 (CQS)違反が等しく作成されるわけではありません。

有名な例は スタックのポップ です。ポップされたものを返すときにスタックを変更するpopコマンドの存在は、コマンドとクエリの明確な分離に違反します。ただし、CQSをフォローするためにpopを返すことはできないと多くの人が主張していますが、ここにはさらに深い違反があると主張します。 popをいじることなく軽減できるもの。

本当の問題は、スタックをポップし、ポップしたものをスタックに戻すコードを記述する必要があるかどうかです。 popを変更して修正することはできません。 peekを作成して修正します。

peekが存在する限り、CQSが要求する最も重要なことは違反されていません。つまり、状態を変更せずにクエリを実行する方法です。 peekpopが提供するものとまったく同じである場合、CQSの最も重要な部分は違反されていません。

純粋主義者は、popがCQSの下でまだ戻るべきではないと不満を言うでしょうが、私はそれらの1人ではありません。 peekpopのドキュメントでかなり簡単に見つけられる限り、これは問題を引き起こしません。これは私がCQSをフォローする方法です。ユーザーに強制的に変更してクエリを実行させないでください。それに続いて大きな利益があります。コマンドがクエリとして2倍になることを許可しないことは、人々にクエリを見つけてそれを使用することを強いるので、効果があるだけです。ええ。どちらにしても、peekをください。

さて、あなたは帰らなければならないと誰が言ったのですか?

アクティビティのログを記録しながら、JSONデータ構造の解析と変更を行っています。それをすれば、あなたは物を返すのではありません。変更されているものを拡張しました。シンプル。

ここではDRY違反はありません。これは、変更を見つけて変更するための解析コードを複製しなかったためです。実行すると、コードがより多くのことを言うようになりました。

ログファイルに入れたくないですか?それをユーザーに示す必要がありますか?アルゴリズムを渡して、ユーザーに出力を送信します。ログを使用するのと同じ方法で使用します。アルゴリズムは、何と通信しているかを知る必要はありません。変更が行われていることを宣言するため、対話するためのインターフェースが必要です。その分離はSRPを尊重します。

これには、変更のリストを見つけるための個別のプロセスと、変更を加えるプロセスの作成は含まれません。それはあなたが何を変えるかについてです。

これをさらに進め、JSONと変更の両方を折りたたむことができるため、これまでに行われたすべての変更の記録からJSONを構築できます。それは新しい考えではありません。そのgitの仕組み。

また、変更のリストを見つけるプロセスと変更を加えるプロセスを分離せざるを得なかったとしても、DRYに違反することを余儀なくされます。変更を加えるプロセスは、それらの変更がどこにあるべきかを知る必要があります。それらを見つけるプロセスも同様です。したがって、変更を見つける方法を1つと、変更を行う方法を2つ作成します。

それを行うと、検索と作成を分離したため、変更を加えなくても変更が行われる場所を見つけるクエリを簡単に作成できます。変更しないコードをプラグインするだけで、変更されないクエリが作成されます。

今DRYは少し違反する必要があります。x = 3; y = 3;は繰り返しのように見えるかもしれませんが、xとyは別のものを意味します。今のところ、同じ価値があることは気にしません。今後のプログラマーがそれらを個別に変更できるように、それらを別々にしています。反復的なコードでも同じです。すべてのキーストロークが同じかどうかは関係ありません。重要なのは、同じコードが存在していて、独立して変更できるかどうかです。これは、一方の変更が常に他方の変更を意味する場合にのみ問題になります。

6
candied_orange