コマンド/クエリの分離は、オブジェクトを作成してそのIDを返すメソッドに適用されますか?


12

ビジネスプロセスを呼び出すサービスがあるとします。このプロセスは、データレイヤーを呼び出して、データベースにタイプAのオブジェクトを作成します。

その後、データレイヤーの別のクラスを再度呼び出して、データベースにタイプBのインスタンスを作成する必要があります。外部キーのAに関する情報を渡す必要があります。

最初のメソッドでは、オブジェクトを作成(状態の変更)し、1つのメソッドでそのID(クエリ)を返します。

2番目のメソッドには、保存用の1つ(createA)とクエリ用の2つ(getId)の2つのメソッドがあります。

    public void FirstMethod(Info info)
    {
        var id = firstRepository.createA(info);           
        secondRepository.createB(id);
    }

    public void SecondMethod(Info info)
    {
        firstRepository.createA(info);
        var key = firstRepository.getID(info);
        secondRepository.createB(key);
    }

私の理解から、2番目の方法は、コマンドクエリの分離に完全に従います。しかし、作成したばかりのオブジェクトを取得するためにデータベースを照会するのは無駄で直観に反すると思います。

このようなシナリオでCQSをどのように調整しますか?

CQSに続くのは2番目の方法だけですか?その場合は、この場合に使用するのが望ましいですか?


2
AとBを任意の頻度で一緒に作成する場合、おそらくストアドプロシージャを両方同時に作成します。次に、Bが最初に作成される可能性、またはBがなくてもAが作成される可能性を切り取ります。
リャサル

ゲームの後半にステップインして、outパラメーターを使用するオプションを提供します。技術的には戻り値ではありません!;)

回答:


13

CQSは、絶対的なルールではなくガイドラインです。厳密なCQSでは不可能なアクティビティの例については、Wikiの記事を参照してください。

ただし、この場合、CQSを保守する必要がある場合は、クライアント側でID(GUIDなど)を作成するか、クライアントがオブジェクトを作成する前にシステムからIDを要求できます。オブジェクトを作成してからクエリを実行するよりも(ただし、単にID列を使用するよりも困難です)。

個人的には、IDを返し、CQSが適さない状況の1つと呼びます。

例を含む別の良い記事:Martin Fowler


3

方法論に従い、それが悪い道をたどると思われる場合、それを再評価する必要があります。

新しく作成されたオブジェクトの識別子は、戻りパラメータとして有効なものであることがわかります-それは単に便利であるだけでなく、「良い」こともわかります。

いずれにせよ、「コマンドクエリの分離」に精通していませんが、コマンドがコマンド実行に関する情報を返すことを許可していないことは非常に疑わしいです。 「オブジェクトが正常に作成され、IDがxxxである」から「オブジェクトが正常に作成された」とは考えられません。


-1

CQSに続くのは2番目の方法のみです。

CQSは、優れたコーディングプラクティスを促進するためのガイドラインであると考えています。開発時に適切なコーディング方法を使用します。このメソッドにリソースが重要なコードが含まれていることが後でわかった場合でも、最適化できます。

早すぎる最適化はすべての悪の根源です:)


2番目の方法で特に良い点は何ですか?
CheatEx

2番目の方法が「良い」とは言いませんでした。私はそれがCQSパラダイムに従うと言った。CQSに従わない場合、2番目の方法はあなたには向いていないと思います。あなたは何人かの人々がCQSに従うことを試みる理由を知りたい場合は、参照http://en.wikipedia.org/wiki/Command-query_separationを
cheesusは改造発射の停止を言う

あなたは、CQSが優れたコーディング慣行を奨励していると言いました。それが真実なら、2番目の方法で何らかの「良さ」を観察する必要があります。それはどこにある?
CheatEx

どうやら、私が提供したリンクを読んでいないようです。CQSキャッチフレーズ:質問しても答えは変わりません。最初のメソッドには、「答え」を提供するメソッド(「createA」)がありますが、尋ねるたびに答えが変わります。2番目の方法では、これはありません。これが「良さ」です。明確にするために:私はCQSの純粋主義者ではありません。毎回それに従うわけではありません。
cheesusはmodの発動を停止すると言います
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.