問題タブ [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.
command-query-separation - CQS の原則では、コマンドが値を返さないことを要求するのはなぜですか?
CQS の原則では、すべてのメソッドは、アクションを実行するコマンド、または呼び出し元にデータを返すクエリのいずれかである必要がありますが、両方であってはなりません。クエリが状態を変更することを期待しないため、クエリが他に何もしないことは理にかなっています。ただし、コマンドが追加の情報を返す場合は無害に見えます。戻り値を使用することも、無視することもできます。CQS の原則では、コマンドが値を返さないことを要求するのはなぜですか?
command-query-separation - コマンド クエリの分離: コマンドは void を返す必要がありますか?
CQS によって、コマンドが状況変数を返すのを防ぐ場合、成功しない可能性のあるコマンドをどのようにコーディングしますか? 例外に頼ることができないとしましょう。
リクエスト/レスポンスはすべてCQSに違反しているようです。
そのため、コマンドによって返されるステータスを示す「mother may I」メソッドのセットがあるように見えます。マルチスレッド/マルチコンピュータ アプリケーションでは何が起こるでしょうか?
サーバーのオブジェクトを 1 つ増やすように要求しようとしているクライアントが 3 つある場合 (オブジェクトには 0 ~ 100 の制限があります)。すべてができるかどうかを確認しますが、1 つが取得できます。他の 2 つは制限に達したため取得できません。ここでは、返されたステータスが問題を解決するように思えます。
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に複数の依存関係を注入します
前の質問の回答で与えられた提案に従って、デザインを変更しようと懸命に努力しています。しかし、次のようなものを取得できません。
現在、View Datacontext は ViewModel にバインドされているため、すべてのコントロールは VM のプロパティによって制御されます。これを Processor/Service または DialogHandler を使用して上記のパターンに変更するにはどうすればよいですか?
UI 要素の command プロパティにバインドされた Delegatecommands を使用しています。これらのコマンドを実行するとアニメーションのように特定のアクションが発生し、ユーザーコントロールが表示されます。コマンドパターンでそれを行う方法は?
可能な限り最善のアプローチでこれらすべての変更に対応するために、現在の実装の変更を開始するにはどうすればよいですか?
c# - プル解析と CQS
プル パーサーを作成していますが、文字を順番に読み取ることに大きく依存しています。パーサーの状態は、文字が読み取られるたびに変化するため、次の文字をどのように解釈するかを指定する「コンテキスト」があると言えます。
問題は、通常、クエリであるはずのメソッドがいくつかあることに気づきますが、それらは状態も変更します。
たとえば、次の方法があります。
ご覧のとおり、これは識別子を取得するだけでなく、状態も変更します。最後の文字が「=」の場合、状態は 1 になり、「;」の場合は状態が 1 になります。状態は別です。
これはCQSの原則に準拠しておらず、あまり好きではありません:(
しかし、これがパーサーであることを考えると、これが最善の方法かもしれません。私の質問は、CQS を壊さずにこれを行うためのより良い方法を考えてもらえますか?
ありがとう!
c# - イベント ソーシング インフラストラクチャの実装
アプリケーションにイベント ソーシングと CQRS パターンを実装します。サンプル コードをダウンロードしたCQRS の旅に触発されました。そこで、イベント ソーシングのインフラストラクチャ全体 (CommandHandlers、EventHandlers、Events、Envelopes など) を見つけましたが、それはかなりの量のコードであり、単純なイベント ソーシングにすべてのコードが必要だとは想像できません。
コマンド、イベント、およびイベントソーシングパターンで必要なものすべてを送信/登録するためのすべてのインフラストラクチャを含む、一般的なテスト済みのライブラリ/ナゲットパッケージ/プロジェクトを知っていますか? それとも自分で実装する必要がありますか?