web-dev-qa-db-ja.com

何を使うの? MVC、MVP、MVVM、または…?

Javaプロジェクトを開始して、デスクトップアプリケーションを開発します。プレゼンテーション層パターン(MVC、MVP、MVVMなど)として何を使用しますか?

...可能であれば、いくつかの小さな例を使用して... :-)

36
Andrea

実際、あなたが探している究極の投稿は この回答this answerfrom Karsten Lentzsch(of JGoodies fame) スイングフレームワークとベストプラクティススイングフレームワークとベストプラクティススレッド。

こんにちは、

私は数年前からSwingアプリを作成しており、多くの人がエレガントだと感じています。また、開発者にSwingを効率的に操作する方法を教えています。アプリケーションを構造化してアセンブルする方法、日付をバインドして検証する方法、Swingで適切に設計された画面を検索、設計、レイアウト、実装する方法です。

オンラインで利用できるSwingの「ベストプラクティス」はないと思います。そして、誰もが「ベスト」プラクティスを提供できるとは思えません。なぜなら、アプローチ、技術的にうまく機能するもの、理解しやすく、操作しやすいものについて、Swing開発者とソリューションプロバイダーの間で話し合う必要があるからです。また、ベストプラクティスでは、誰がどのような結果品質を達成できるかを説明し、制作時間と制作コストについて説明します。しかし、私はこれらの情報をオンラインやSwingの本で見つけることはできませんでした。

私の意見では、Swingアプリを構築するための優れたプラクティスと情報の欠如は、開発者がSwingを開始するときに直面する最大の障害です。私が一緒に仕事をしたほとんどの開発者は、デザインの検索、レイアウトの実装、パネルの構築、データのバインド、イベントの処理、さまざまなコードパーツとコードレイヤーの配置に時間がかかりました。そして、私が見た多くのSwingアプリは最悪だ。視覚的なデザインが貧弱であることに加えて、理解するのが難しく、小さな変更でさえ多くの費用がかかります。通常、開発者には、どのコードを配置するか、関心の分離する方法、物事を結び付ける方法、アクションを操作する方法、アプリを起動する方法、UIの状態を保存および復元する方法がわかりませんでした。ほとんどの開発者は従うべきガイドラインを欠いています。

しかし、平均的な開発者は、手で取っただけで、約3〜10日でSwingをうまく使用できることがわかりました。ほとんどすべての質問は、コード、ライブラリ、アプリケーションアーキテクチャ、パターン、一般的なプログラミングプラクティス、適切に設計された例、チュートリアルなどで回答または対処できます。私は、3層アーキテクチャを中心に構築されたSwing開発プロセスを教えています。ドメイン、ツール、およびプレゼンテーションレイヤーを分離し、それは生産的なレイアウトシステムに基づいています。ほとんどの部分はプログラムで行われていますが、開発者はすぐに結果を得ることができ、コードとビジュアルデザインの両方が非常に一貫したものになります。これにより、開発者の生産性が大幅に向上する可能性があります。Swing作業がプロジェクト作業のかなり小さな部分を占める程度までです。

それで、あなたは何ができますか?さらに「エンタープライズアプリケーションアーキテクチャのパターン」については、MartinFowlerのドラフトを検討することを強くお勧めします。これらのパターンは、SwingおよびSwingアーキテクチャに不慣れな開発者にとっても、SwingおよびSwingチームで非常にうまく機能することがわかりました。最初に、「プレゼンテーションモデル」、「分離ドメイン」、「分離プレゼンテーション」のパターンを選択します。私は個人的に、Model-View-Presenterパターン(MVP)よりもプレゼンテーションモデル(Smalltalkersのアプリケーションモデル)を好みます。ただし、MVPは真の十分に研究された代替手段です。

Fowlerのパターンは、中規模のSwingアプリケーションに適した拡張性を備えた3クライアント層アーキテクチャと組み合わせることができます。これは、ドメインレイヤー、プレゼンテーションレイヤー、および仲介モデルレイヤーで構成されます。このアーキテクチャの概要は、データバインディングのプレゼンテーションで説明しました。 MVPベースのアプリは、これら3つのクライアント層でも構成できます。

Swingアプリケーションの重要なタスクは、データバインディングです。つまり、ドメインオブジェクトとドメインオブジェクトのプロパティをSwingコンポーネントに接続する方法です。基本的に、データを前後にコピーしたり、ドメインオブジェクトからUIコンポーネントにアダプターのチェーンを構築したりできます。コピーのアプローチは理解しやすく、Swingやデータバインディングに不慣れな人にとっては多くの場合最初の選択肢です。これは良い選択だと思います。一方、コピーすると、ビューの同期がはるかに困難になります。アダプターチェーンと自動または半自動更新により、ドメインデータをUIにバインドするために必要なコードの量を大幅に減らすことができます。欠点は、このアプローチを理解するのがはるかに難しいことです。ご指摘のとおり、Swingは、テキストフィールドのバインドに使用できる再利用可能で柔軟なモデルの優れた抽象化を提供しません。ドキュメントインターフェイスは、一般的なデータアクセスには適していません。文字列、ブール値、数値、日付など、単一値データの汎用的で強力かつ柔軟なモデルを追加することを目的としたValueModelインターフェイスを提供するライブラリがいくつかあります。

本当のSwingアプリケーション開発プロセスを説明しているSwingの本を私は知りません。理想的には、そのような本は、上記のパターン、アーキテクチャ、およびデータバインディング技術を組み合わせて、Swingでそれを実装する方法を説明します。とにかく、まさにそれを行うSmalltalkアプリケーション開発プロセスに関する10年前のドキュメントがあります。 OracleのJClientアーキテクチャとドキュメントはそれほど完全ではありませんが、Java開発者にとっては読みやすいかもしれません。Fowlerパターン、3層アーキテクチャ、およびSwingに関するデータバインディングについてのプレゼンテーションを提供します。これらのパターンの実装と自動データバインディング。私のバインディングライブラリのチュートリアルソースは、アダプタチェーンとValueModelインターフェイスを理解するのに役立つ場合があります。MVPパターンの最適なドキュメントは、DolphinSmalltalkのドキュメントにあります。

アーキテクチャとデスクトップパターンセットを選択したら、次のより基本的なSwingタスクに対処する必要があります。1)ターゲットプラットフォームセットに適したプロフェッショナルなルックアンドフィールのセットを選択して外観を改善します。2)役立つレイアウトシステムを選択します。適切に設計された一貫性のある画面をすばやく構築し、3)データ検証ソリューションを選択し、4)日常のSwingタスク用のソリューションのバッグを入手します。

Swingアーキテクチャの概要を説明し、データバインディングと一般的なSwingタスクに対処するプロジェクトがいくつかあります。たとえば、SunのJDNC、OracleのJClient/ADF、Spring RCP、NetBeansプラットフォームです。私は、オープンソースのJGoodiesライブラリに基づいており、すべての公開JGoodiesツールとデモ用のソリューションとソースのバッグを追加したSwingソリューションの商用スイートを提供しています。これらの情報源は、上記のすべての問題を結び付ける方法を説明することを目的としています。

いわゆる「MVC」フレームワークに関する私の標準的な警告を追加しましょう。 SwingはMVCを使用せず、変更されたパターンを使用します。 MVCは、特にSwingのコンテキストでは、しばしば誤って引用され、誤解されます。また、MVCはアプリケーションではなくUIコンポーネントに適しています。したがって、MVCではなく、Swingアーキテクチャを反映して機能する概念、ソリューション、およびライブラリを探すことをお勧めします。

MVCパターンの発明者コミュニティは、1993年頃にApplicationModel(現在はプレゼンテーションモデルとして知られています)を導入しました。 MVPは少し後に続きました。私の意見では、これら2つのパターンはMVCよりもSwingにはるかに役立ちます。最近、プレゼンテーションモデルのパターンをより多くの聴衆にもたらした環境は、新しいアーキテクチャ「Pollock」に移行しました。興味のある読者は、プレゼンテーションモデルと組み合わされることが多いアダプタチェーンとの違いをグーグルで確認できます。

最後になりましたが、個人的な声明です。以前に使用した他のツールキットやフレームワークよりも、Swingの方がはるかにうまく機能します。より少ないコードでより多くのことができ、コードはより適切に構造化され、保守が容易になり、結果をすばやく得ることができます。

お役に立てれば。よろしく、Karsten Lentzsch

参考資料:ファウラーのさらなるパターン- http://martinfowler.com/eaaDev データバインディングのプレゼンテーション- http://www.jgoodies。 com/articles / Smalltalkアプリ開発プロセス- http://www.cincom.com/downloads/pdf/AppDevGuide.pdf MVPパターンドキュメント- http://www.object-arts.com/EducationCentre/Patterns/MVP.htm SunのJDNCプロジェクトホーム- http:// jdnc.dev.Java.net/ OracleのADF FAQ- http://www.Oracle.com/technology/products/jdev /htdocs/905/adffaq_otn.html SpringRCPプロジェクトホーム- http://www.springframework.org/spring-rcp.html NetBeansプラットフォームホーム- http://www.netbeans.org/products/platform/ JGoodies Swing Suite- http://www.jgoodies。 com/products/index.html

KarstenとJGoodiesを知らないなら、私を信じてください、この男は彼が話していることを本当に知っています。彼の回答を参考として投稿した資料を注意深く読むことを強くお勧めします。具体的には、彼のデスクトップパターンとデータバインディングのプレゼンテーションを必ず確認してください。驚いたことに、私は 新しいバージョン よりも 古いバージョン を好みます。

MVCとMVPについての彼のスライドを引用させてください。

  • はい、Swingはextended形式のMVCを内部的に使用します
  • ただし、MVCはコンポーネント用、MVPはアプリケーション用

そして要約から:

しかし、私はこれを説明する上でKarstenよりも良い仕事をすることはできません。せいぜい彼を言い換えることができます。だから彼を読んでください!

また、 Desktop Java学習用デモ (より正確にはScottVioletの answer /)もご覧ください。 )。

52
Pascal Thivent

これは、同じ画面を3回実装するために使用されるJavaの3つのGUIパターンを比較する記事です。

ZKを使用したイベント駆動型GUIパターンの実装Java AJAXフレームワーク、Simon Massey、Sachin K Mahajan

フレームワークや言語が異なれば、MVP、MVC、MVVM、MVVMPなどと感じるものがわずかに異なるため、この記事では、議論しやすい短いM__モニカではなく、MartinFowlerによって付けられた長い名前のパターンを注意深く参照しています。約。

明らかに、ZKはWebまたはモバイルデスクトップのようなプログラミング環境ですが、パターンはSwingまたは別のファットクライアントフレームワークにも同様に適用できます。ただし、特定のデスクトップ環境に適したデータバインディングフレームワークがなければ、MVVMを試すことはあまり現実的ではありません。したがって、この初期のプレゼンテーションでは、「プレゼンテーションモデル」パターンに、「MVVM」と呼ぶ代わりに、Model-View-Binderのモニカ「MVB」が付けられています。

ZKのデザインパターン:Java MVVM as Model-View-Binder、Simon Massey

3
simbo1905

この記事:Hello ZK MVVM をご覧ください。 ZKはMVPとMVVMの両方をサポートしており、この記事はあなたの選択にいくつかの洞察を提供するかもしれません-プログラミングモデルはSwingに似ていますが、それはWebフレームワークであると考えられています。

2
Tom Yeh

あなたの質問は本当に曖昧なので、私はあなたがより多くの情報を見つけるためにグーグルを使うことをあなたに勧めます。とにかく、デスクトップアプリケーションをJavaで実行したいので、おそらくSwingを使用するので、SwingはMVCパターンを念頭に置いて設計されていることを指摘したいと思います。とにかく、いくつかの追加のインターフェイスを使用して、MVPに簡単に変更できます。

パターンがわからない場合は、MVCを使用することをお勧めします。あなたははるかに多くの例を見つけるでしょう。

私の2セント。

0
Carlos Tasada