問題タブ [command-query-separation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
448 参照

command-query-separation - CQS の原則では、コマンドが値を返さないことを要求するのはなぜですか?

CQS の原則では、すべてのメソッドは、アクションを実行するコマンド、または呼び出し元にデータを返すクエリのいずれかである必要がありますが、両方であってはなりません。クエリが状態を変更することを期待しないため、クエリが他に何もしないことは理にかなっています。ただし、コマンドが追加の情報を返す場合は無害に見えます。戻り値を使用することも、無視することもできます。CQS の原則では、コマンドが値を返さないことを要求するのはなぜですか?

0 投票する
2 に答える
1331 参照

command-query-separation - コマンド クエリの分離: コマンドは void を返す必要がありますか?

CQS によって、コマンドが状況変数を返すのを防ぐ場合、成功しない可能性のあるコマンドをどのようにコーディングしますか? 例外に頼ることができないとしましょう。

リクエスト/レスポンスはすべてCQSに違反しているようです。

そのため、コマンドによって返されるステータスを示す「mother may I」メソッドのセットがあるように見えます。マルチスレッド/マルチコンピュータ アプリケーションでは何が起こるでしょうか?

サーバーのオブジェクトを 1 つ増やすように要求しようとしているクライアントが 3 つある場合 (オブジェクトには 0 ~ 100 の制限があります)。すべてができるかどうかを確認しますが、1 つが取得できます。他の 2 つは制限に達したため取得できません。ここでは、返されたステータスが問題を解決するように思えます。

0 投票する
2 に答える
1167 参照

c# - 基本的な MVVM の現在の実装を SOLID パターンに準拠するように変更する

オンラインで入手できるMVVMの例で一般的に言及されている基本的な設計パターンを使用して、すべてのMVVMアプリケーションを作成しています。私がフォローしているパターンを以下に説明します。

モデル

このセクションには、プロパティとインターフェイス IDataService などを含む DTO クラスが含まれます。

プロキシー

このレイヤーには、次のような IDataservice を実装する Dataservice 呼び出しが含まれています。

ビューモデル

このレイヤーには、ViewModel と、すべてのデータを受け取るモデルおよびプロキシ レイヤーへの参照が含まれています。

すべての ViewModel は BaseViewModel を継承します。各 viewModel には、UI がイベントをトリガーしたときに実行される Delegatecommand も含まれています。次に、プロキシ層で DataService を呼び出してサーバーからデータを取得し、ビジネス ロジックを実行して、ビューにバインドされた ViewModel にプロパティを設定します。ビューごとに、ビューのデータコンテキストにバインドされた VM があります。ViewModel はアニメーションの開始も担当します。トリガーを使用してストーリーボードを開始します。これは、VM の列挙型にバインドされ、これらのトリガーの状態変更のために次の例のようになります。 mvvm-Friendly-visual-state-management-with-windows-phone-7/

意見

このレイヤーには、GeoLocation Service、AES 暗号化、ビュー間の NavigationService などの特定の依存関係を実装したすべてのビュー、ユーザー コントロール、およびビジネス ロジックがあります。

すべてのビューには .xaml および .xaml.cs ファイルがあります。.xaml.cs ファイルで、ビューのデータ コンテキストを次のように VM にバインドしました。

ここからすべてのバインディングが発生します。

私の問題は、最近、このパターンがSOLID設計パターンに従っていないという知識があったことです。これは、質問のこの回答で知ったものです: Simple InjectorはBaseClassに複数の依存関係を注入します

前の質問の回答で与えられた提案に従って、デザインを変更しようと懸命に努力しています。しかし、次のようなものを取得できません。

  1. 現在、View Datacontext は ViewModel にバインドされているため、すべてのコントロールは VM のプロパティによって制御されます。これを Processor/Service または DialogHandler を使用して上記のパターンに変更するにはどうすればよいですか?

  2. UI 要素の command プロパティにバインドされた Delegatecommands を使用しています。これらのコマンドを実行するとアニメーションのように特定のアクションが発生し、ユーザーコントロールが表示されます。コマンドパターンでそれを行う方法は?

  3. 可能な限り最善のアプローチでこれらすべての変更に対応するために、現在の実装の変更を開始するにはどうすればよいですか?

0 投票する
0 に答える
95 参照

c# - プル解析と CQS

プル パーサーを作成していますが、文字を順番に読み取ることに大きく依存しています。パーサーの状態は、文字が読み取られるたびに変化するため、次の文字をどのように解釈するかを指定する「コンテキスト」があると言えます。

問題は、通常、クエリであるはずのメソッドがいくつかあることに気づきますが、それらは状態も変更します。

たとえば、次の方法があります。

ご覧のとおり、これは識別子を取得するだけでなく、状態も変更します。最後の文字が「=」の場合、状態は 1 になり、「;」の場合は状態が 1 になります。状態は別です。

これはCQSの原則に準拠しておらず、あまり好きではありません:(

しかし、これがパーサーであることを考えると、これが最善の方法かもしれません。私の質問は、CQS を壊さずにこれを行うためのより良い方法を考えてもらえますか?

ありがとう!

0 投票する
5 に答える
23728 参照

c# - イベント ソーシング インフラストラクチャの実装

アプリケーションにイベント ソーシングと CQRS パターンを実装します。サンプル コードをダウンロードしたCQRS の旅に触発されました。そこで、イベント ソーシングのインフラストラクチャ全体 (CommandHandlers、EventHandlers、Events、Envelopes など) を見つけましたが、それはかなりの量のコードであり、単純なイベント ソーシングにすべてのコードが必要だとは想像できません。

コマンド、イベント、およびイベントソーシングパターンで必要なものすべてを送信/登録するためのすべてのインフラストラクチャを含む、一般的なテスト済みのライブラリ/ナゲットパッケージ/プロジェクトを知っていますか? それとも自分で実装する必要がありますか?