問題タブ [separation-of-concerns]

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 に答える
3356 参照

model-view-controller - MVC:モデルとエンティティオブジェクトは別々の概念ですか?

私はこのトピックに非常に慣れていないので、MVCを理解するための助けを少し前にここで尋ねました。私はそれをきちんと理解していると思いました、そしてこれは私がこの主題について最近書いたブログ投稿に文書化されています。私の理解は基本的にこれに要約されます:

コントローラー:要求を満たすために何をする必要があるかを決定し、必要に応じて収集/変更する必要のあるモデルを利用します。基本的には、特定のプロセスのマネージャーです。

ビュー:プレゼンテーションのみ。コントローラが必要なものを収集すると、特定のタイプのビューを作成し、情報を渡して、「これをユーザーに表示します」と言います。

モデル:アプリケーションの動作。コントローラが何かを抽出または変更するように要求すると、その方法を知っています。また、他のモデルをトリガーして関連タスクを実行することも知っています(私の理解では、モデルがStackOverflowで「何かに投票」しようとすると、そのモデルはバッジも付与する必要があるかどうかを尋ねます。コントローラーはそうしません。それを気にする必要があります)。

私の質問は、そのすべてが多かれ少なかれ正確であると仮定して、エンティティオブジェクトはどこから来るのですか?モデルとエンティティは同じものであり、各オブジェクトは独自のデータを永続化する方法を知っていますか、それともエンティティは独自に存在し、アプリケーション全体で使用される別個の概念ですか?

私のお金は後者にあります。これにより、モデルが独立して動作できるようになり、3つのレイヤー(モデル、ビュー、コントローラー)すべてがエンティティを利用して必要に応じてデータを渡すことができるからです。また、オブジェクトとデータベースの永続性は、分離する必要がある懸念事項のようです。

正直なところ、MVCについて読むほど、混乱が生じます。コアコンセプト(ロジックとは別のプレゼンテーション)を採用し、「MVC」ラベルについてあまり心配することなく、適切と思われる方法で実行する準備が整いました。

0 投票する
3 に答える
190 参照

ruby-on-rails - この Rails 3 Controller メソッドは私を太らせますか?

これは新しいアプリケーションで、Search コントローラーに index メソッドがあります。これはアプリケーションのホームページとしても機能し、デザイン パターンの観点から間違った道を進んでいるかどうかを判断しようとしています。

このメソッドはすでに 35 行の長さです。メソッドの機能は次のとおりです。

階層データのどの「レベル」を検索するかを決定するための 3 行の設定変数。

サブドメインがリクエストに含まれているかどうかに基づいて、いくつかのビュー変数を入力するための別の 10 行。

以下に基づいて 2 つのページのいずれかにリダイレクトする 10 行のセクション:

1) ユーザーがアクセス権を持っておらず、サインインしていて、まだアクセスをリクエストしていない場合は、「このブランドへのアクセスをリクエストするには、ここをクリックしてください」と伝えます。

2) ユーザーがアクセス権を持っておらず、サインインしており、既にアクセス権を要求している場合は、「あなたの要求を確認しています」と伝えます。

動的アレルを構築するためにさらに 10 行。

これらの懸念事項をどのように分離するか、または分離する必要があるかどうかさえ、頭の中ではっきりと理解できません。あなたが提供できる助けに感謝します!

0 投票する
1 に答える
49 参照

language-agnostic - クラスはインターフェースをサポートする必要がありますが、これには侵入的な方法でクラスにロジックを追加する必要があります。これを防ぐことはできますか?

データベースから大量のデータをロードし、そのデータに対してアルゴリズムを実行するC ++アプリケーションがあります(これらのアルゴリズムはCPUとデータを大量に消費するため、事前にすべてのデータをロードします)。データベースに戻しました。

データベース部分は、アプリケーションの他の部分からうまく分離されています。実際、アプリケーションはデータの出所を知る必要はありません。アプリケーションをファイルで起動することもできます(この場合、別のファイルモジュールがファイルをアプリケーションにロードし、最後にすべてのデータをファイルに保存します)。

今:

  • データベース層は、変更されたインスタンスを(完全なデータではなく)データベースに保存するだけでよいため、アプリケーションによって何が変更されたかを知る必要があります。
  • 一方、アプリケーションはデータの出所を知る必要がないため、データのインスタンスごとに状態の変化を維持することを余儀なくされていると感じたくありません。

アプリケーションとそのデータ構造を、データ(データベースまたはファイル)をロードおよび保存するレイヤーから可能な限り分離するために、起動後にインスタンスが変更されたかどうかに関する情報でアプリケーションのデータ構造を汚染したくありませんか否か。

ただし、データベースレイヤーを可能な限り効率的にするには、アプリケーションによって変更されたデータを判別する方法が必要です。

データは数GBのメモリを簡単にいっぱいにする可能性があるため、すべてのデータを複製して保存しながらデータを比較することはできません。

アプリケーションアルゴリズム内のパフォーマンスが非常に重要であるため、アプリケーションデータ構造にオブザーバーを追加することもできません(すべてのオブザーバーをループして仮想関数を呼び出すと、アルゴリズムに重大なパフォーマンスのボトルネックが発生する可能性があります)。

他の解決策はありますか?または、邪魔な方法でアプリケーションクラスにロジックを追加したくない場合は、「モジュラー」になりすぎないようにしていますか?これらの場合、実用的である方が良いですか?

ORMツールはこの問題をどのように解決しますか?また、アプリケーションクラスに一種の変更状態を保持するように強制しますか、それともクラスに変更オブザーバーを強制しますか?

0 投票する
3 に答える
298 参照

c# - データベースフィールドを2回、1回はデータベースで、もう1回はリポジトリ/モデルで宣言しないようにするにはどうすればよいですか?

最近、 Pro ASP.NETMVCFrameworkを読み始めました。

著者は、リポジトリを作成し、インターフェースを使用して迅速な自動テストを設定することについて話します。これは素晴らしいですね。

ただし、ORMを使用してC#データアクセスクラスを自動生成する代わりに、データベース内の各テーブルのすべてのフィールドを2回宣言する必要があるという問題があります。1回は実際のデータベースで、もう1回はC#コードで宣言します。

これは素晴らしいプラクティスであり、見た目も素晴らしいTDDを可能にすることを私は理解しています。しかし、私の質問は次のとおりです。

データベースとC#コードの両方でフィールドを2回宣言する必要がある回避策はありませんか?C#コードを自動生成するものを使用することはできませんが、C#ですべてのビジネスロジックを手動で作成したり、テーブルごとにリポジトリ(および偽のロジック)を作成したりすることなく、TDDを実行できますか?

0 投票する
3 に答える
6041 参照

model-view-controller - JSF2 マネージド Bean で MVC を実装するためのベスト プラクティス

私が取り組んでいる Web プロジェクトの複雑さが増すにつれて、MVC 構造を含める必要性がますます緊急になっています。私のモデル クラスは適切に定義されていますが、ビューとコントローラーのコードは一緒になってしまう傾向があります。私はサイトでもかなり重い AJAX を使用しており (主に RichFaces jsFunctions)、状況が少し複雑になっています。

JSF2 を使用して MVC を実装するための優れた戦略を見つけた人はいますか? プロジェクトに別のフレームワーク (Spring MVC など) を導入したくありません。

これまでのいくつかのアイデアのうち、まだ始めていないもの

  • 重い ajax を使用するページの場合、選択したタブ、選択した項目を記憶し、フィルター処理されたデータのリストを提供するための「ビュー」Bean を用意します。
  • モデルの変更などのアクションを処理する「コントローラー」Bean を用意する
  • JSF ページとコントローラの間を行き来する「コマンド」Bean があります。jsFunction はコマンド Bean にパラメーターを設定し、呼び出しcommand.execute()により、コマンド Bean はコントローラー Bean の正しいメソッドを呼び出してアクションを実行します。「コマンド」Bean には、完了時に呼び出される JavaScript が含まれている場合があります。また、再レンダリングするページの領域を指定することもできます。

何かご意見は?

編集

私がよく目にするのは、ユーザーの選択を追跡し、モデルを更新し、フィルターされたリストを取得するなど、 あらゆることを行うマネージド Beanです。

現時点では JSF 1.2 を使用しているため、アクション/アクションリスナーをパラメーターで使用することはできません。たとえば、マネージド Bean にはm_selectedDate、 への呼び出しで選択された日付をバックエンドに供給することだけを目的とするような変数が含まれていますupdateFilteredItemsBasedOnDate()。余分な変数は一時的なものにすぎないので、なくなるといいですね。パラメータ付きのJSF 2のELが役立つはずですが、代替ソリューションが利用可能かどうか知りたいです。

MVC をマネージド Bean に適用する方法や、すべてを実行しようとする大きな Bean にならないように関心を分離する方法があるかどうか、興味があります。

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

php - 関心の分離-MVC構造のどこでflush()を実行するか(コントローラーとサービスレイヤー)

ZendフレームワークとDoctrine2をORMとして使用するPHPを使用するアプリケーションがあります。私の質問は、コントローラーが基礎となるモデルと永続層についてどれだけ知っておくべきかに関するものです。理想的には、これは自分自身では「何もない」と言えます。コントローラーは、エンティティが永続化される方法とタイミングについて何も知らないはずです。しかし、これが常に最善の解決策であるとは限らないと思います(?)。

私は「関心の分離」の設計ガイドラインに従おうとしました。これは、モデルでCRUD操作を実行するサービスレイヤーを作成することで実現しました。次の例を参照してください。

ご覧のとおり、コントローラーは永続性について何も知りませんが、この結果を得るには、サービスレイヤーのcreateXXX()またはupdateXXX()メソッドへのすべての呼び出し内でpersist()とflush()の両方を実行する必要があります。私はむしろこのようなことをしたかった:

しかし、これによりDoctrine2が失敗します。これは、オブジェクトをデータベースに間違った順序で永続化するためです。特権はセクションの前に永続化されます(Doctrineに順序付けられた方法でこれを実行するように指示できる場合はdunno ??)。特権は、まだ永続化されていないセクションのIDを誤って取得します。

とにかく、ここでの大きな問題は、すべてのオブジェクトが作成され、リレーションが設定されるまで、フラッシュを延期する必要があるかどうかです。目標は、データベースへのすべての書き込みを行う1つのトランザクションを持つことです。これは、コントローラーによってトリガーされる必要があります(これは、オブジェクトとリレーションの構築が行われることを知っている唯一のトランザクションであるため)。これにより、コントローラーを「汚染」します。永続性レイヤー?

0 投票する
4 に答える
604 参照

asp.net-mvc - CRUD LINQ コードはどこに行くのですか? ASP.NET MVC

私は現在、プロジェクトで ASP.NET MVC フレームワークを使用しています (ほぼ初めてです)。

データモデルとしてLinq2SQLを使用しています..

この種のコードはどこに置くべきですか:

現在、コントローラーにこのようなコードがあり、取得したデータをビューに渡します..

これでよろしいですか?

そうでない場合、linq2sqlデータモデルにこの種のコードを含めるにはどうすればよいですか?

ありがとう

ダニエル

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

domain-driven-design - ドメインを介してカプセル化された永続性、またはリポジトリを介した永続性?

私のドメインモデルがリポジトリを認識/気にする必要がない場合、.UpdateOrder(...)CRUD-Update をカプセル化する のような動作はどのようにリポジトリと連携しますか? ドメインサービス経由?

さて、私のリポジトリには、私の.UpdateOrder(...). それはいいです。しかし、誰かにリポジトリで Update メソッドを使用してほしくないので、エンティティでの動作を実行してもらいたい (代わりに UpdateOrder() を使用する)。私のドメインモデルが不変条件を満足する方法に似ていることを望みます-それは設計上(プライベートセットプロパティなど)-私のリポジトリはエンティティを「更新」/永続化するための代替方法を公開しません。

これは単にアクセス修飾子の問題であり、Repo パブリックに Update メソッドがないことで解決されます。または、「より良い」答えはありますか?DDD忍者を助けてください。

0 投票する
1 に答える
192 参照

model-view-controller - データ注釈は関心の分離に違反しますか?--asp.net mvc

asp.net mvcで、モデルのデータ注釈を使用したカスタム検証と検証メッセージがある場合、関心の分離に違反しませんか?つまり、カスタム検証はビジネスロジックに関連している可能性があり、エラーメッセージはローカリゼーションなどのビュー固有のパラメータを使用して検証する必要がある可能性がありますか?

これについてのあなたの意見や見解は何ですか。そして、関心の分離を適切に行いながら、データを検証するための最良の方法は何でしょうか。

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

web-services - Visual Studio 2010 Pro で .NET 4.0 Web サービス プロジェクトを作成するにはどうすればよいですか?

Web サービス テンプレートは .NET 4.0 プロジェクト リストになく、.NET 3.5 のみですが、サービスはモデル/データベース関数を含む .NET 4.0 アセンブリに依存する必要があります。そのアセンブリは、必要なデータ プロバイダー (dotConnect for MySQL) のため、4.0 に依存します。

Web サービスは、このビジネス ロジック アセンブリへの参照を必要とするため、引数をアセンブリに渡して盲目的に返すことができます。しかし、データ プロバイダーに問題なく、.NET 4.0 アプリケーション プールで Web サービス プロジェクトを実行できますか?

Ultimate ではなく Visual Studio 2010 Professional を使用しています (これにはテンプレートがあります)。これを回避する方法はありますか?