2009-07-13 10 views
6

プログラミングの初心者として、私は壁にぶつかったときにいつもバグしています。 現在、壁の1つは、共存するオブジェクトです。Java MVC - 私がそれを得るように感じていない

あなたは私の質問履歴に見ることができるように私は現在、私はMVCパターンを呼び出す何かを実装している、ブラックベリーのアプリケーションに取り組んでいますが、それは、私はあることを意味していると思い正確に何ではありません。

あなたは、あなたがこのようなグラフィック抄録に見える初心者プログラマを見て、あなたはその背後にあるアイデアを得ます。しかし、それを実装することは別のことです。

alt text http://www.ibm.com/developerworks/wireless/library/wi-arch6/theoretical.gif

、私はあなたにいくつかのブラックベリーの特定のものが含まれている私のいくつかのコードを、示しています:)読むのをやめませんが、私がやっているかを確認する必要があります。私のアプリケーション

public class ContactManager extends UiApplication 
{ 
    private static ContactManagerMainScreenModel MainScreenModel = new ContactManagerMainScreenModel(); 
    private static ContactManagerMainScreen MainScreenView = null; 

    public static void main(String[] args) 
    { 
     new ContactManager().enterEventDispatcher(); 
    } 
    public ContactManager() 
    { 
     MainScreenView = new ContactManagerMainScreen(MainScreenModel); 
     // Displays the Splashscreen then opens the Mainscreen 
     new SplashScreen(UiApplication.getUiApplication(), MainScreenView); 
    } 
} 

ため

メインエントリポイントMainscreenモデル

public class ContactManagerMainScreenModel 
{ 
    ContactManagerMainScreen v; 
    // Loading Local Storage 
    LocalContactStorage LocalContactStorage = new LocalContactStorage(); 

    // Define Data List 
    private Vector vContacts_Favorites; 

    public void register(ContactManagerMainScreen v) 
    { 
     this.v = v; 
    } 
    // Retrieve Favorite Contacts from Persistant Storage 
    public Vector getFavoriteContactsFromLocalStorage() 
    { 
     vContacts_Favorites = LocalContactStorage.getFavoriteContactsFromLocalStorage(); 
     return vContacts_Favorites; 
    } 
    // Put Retrieve Favorite Contacts from Persistant Storage 
    public void saveFavoriteContactsToLocalStorage() 
    { 
     LocalContactStorage.saveFavoriteContactsToLocalStorage(vContacts_Favorites); 
    } 
} 

MainScreenController

public class ContactManagerMainScreenController 
{ 
    private ContactManagerMainScreenModel _model = null; 
    private ContactManagerMainScreen _view = null; 

    public ContactManagerMainScreenController(ContactManagerMainScreen view, ContactManagerMainScreenModel model) 
    { 
     this._model = model; 
     this._view = view; 
    } 

    public void HideFavoriteList() 
    { 
     if(this._view._ContactList.getManager() != null) 
     { 
      this._view._ContactList.getManager().delete(this._view._ContactList); 
     } else 
     { 
      this._view._bottom_box.add(this._view._ContactList); 
     } 
    } 
} 

まだありますか?わかりました...ここ

私の問題は、私はポップアップボックスが、いろいろ書いたり他のものを隠して表示するように、UI要素を変更するには、コントローラを使用したいということ、です。

しかし、これらすべてのUIエレメントがビュー(ここではContactManagerMainScreen)で定義されているので、コントローラにビューへの参照を与える必要があります。これは私の共存する悲惨なものにつながります。

ビューが宣言される前にコントローラを作成できません。コントローラがUIElementsを変更できるようにする必要がなければ、(グラフィックスに示されているように)問題はありません。私が今やっている何を

は、ビューが理にかなっているコントローラ

controller = new ContactManagerMainScreenController(this , model); 

んを作成することですか?私はパターンを理解したいので、自分のコードゴミや好きなものを呼んでください:)ただ何かを学びたいだけです。

P.S.私は私の悪い英語のためのあなたの許しを請う:)

答えて

11

MVCは面白い抽象化ですが、いくつかの問題を抱えています。

実際にはコントローラとビューはペアになっていることがよくあります。理論的にはどちらか一方を置き換えることができるはずですが、実際には異なるビューのインターフェイスメカニズムが異なるためコントローラ&ビューが結合されます。

私は、Javaに関連する見た中で最高の説明はビューコードのあなたの部分が画面上にそれらのコンポーネントを配置する以外の何ものでもないので、ビューは、あなたのスイングのコンポーネントであるということです。

コントローラは、そのクラスの残りの部分、リスナー、およびビューとやり取りするコードの残りの部分です。

私の提案は、ビューとコントローラを隔離することについてあまり心配することではありませんが、モデルとビュー/コントローラの間に非常に強い隔離を維持しているということです。

EDIT/Advanced: コントローラーとビューが分離されていて、より柔軟なパターンを使用しましたが、それはもっと多くの作業を必要とします。私はStrutsがバインディングモデルを使用していると思います。もしあなたがそこに現れるかもしれないいくつかの抽象化テクニックを見たり、スイングコントロールをバインドすることについてのものを探したいのであれば。

+0

+1私は全く同意します。 – neuro

+0

+1これはまた、私の経験と結びついています。 – Zarkonnen

+0

(誰でも*ビューとコントローラーをちゃんと分離する方法があれば、私は非常に興味があります) – Zarkonnen

1

私の見解では、これは最初のデスクトップアプリケーションでモデル、ビュー、コントローラを最初に切り離そうとしたときに遭遇したものです。

Webアプリケーションでは、Webの本来の性質からMVCパターンが自然に適合しますが、残念なことに、オペレーティングシステムが通知で本質的な役割を果たすデスクトップアプリケーションに純粋なMVCパターンを適合させることはできません。これは通常、ダイアグラムに表示されているようにパターンが実装されるようにします。あなたが示されてきたパターンは本当にこのように実装する必要が

、私は(私は、Javaとの短い事件後、.NETに切り替えてきたので、心の中でそれを保管してください)思う:

public class ContactManagerMainScreenModel 
{ 
    ContactManagerMainScreen v; 
    // Loading Local Storage 
    LocalContactStorage LocalContactStorage = new LocalContactStorage(); 
    // Favorite list 
    boolean showFavoritesList = true; 

    public void register(ContactManagerMainScreen v) 
    { 
     this.v = v; 
    } 

    public void ShowOrHideFavoritesList() 
    { 
     if(showFavoritesList) 
     { 
      showFavoritesList = false; 
      v.RefreshView(this); 
     } 
     else 
     { 
      showFavoritesList = true; 
      v.RefreshView(this); 
     } 
    } 
} 

一方、コントローラはユーザーの操作を受け取る責任があります。したがって、「Toggle Favorites」というボタンがある場合、コントローラは_model.ShowOrHideFavoritesList()を呼び出すようになります。モデルはそれ自身を更新し、新しい状態を使用してビューを更新するように要求します。

ビューには、コントローラへの依存がなくなりました。

+0

もう一度、あなたの答えに感謝します。あなたの実装は、UI自体を直接制御するモデルにつながります。コントローラ全体を削除することをお勧めしますか? –

+0

いいえ、最後の2つの段落をコードの後に​​お読みください。コントローラーは、すべてのユーザー通知を処理します。別の例があります。ユーザーが "Add New Contact"をクリックすると、コントローラーは_model.AddNewContact(string firstName、string lastName)を呼び出します。モデルは、この連絡先を自身の内部状態に追加し、ビューでRefreshView(this)を呼び出します。 –

+0

私が言っていることは、コントローラーがすべてのユーザー通知をキャプチャして、モデルを更新する方法を決定する責任があるということです。その後、モデルは常にRefreshView(これ)を呼び出してビューを再表示します。 –

3

私はダイアグラムがとても良いとは思わないし、おそらくもっと混乱させます。

コントローラはモデルをビューに与える責任があります。モデルには、データ用のシンプルなアクセサが必要です。モデルとのやりとりや値の変更は、コントローラーを介して行わなければなりません。

このように、ビューは、モデルをユーザーに表示/提示する方法のみを知る必要があります。したがって、モデル上の操作(saveFavoriteContactsToLocalStorage()など)は、ViewクラスではなくControllerのメソッドでなければなりません。また、コントローラは、ビューの構築を参照する必要はありません。MVCパターン全体の意図した順序を逆にすることになります。

+0

私は彼のダイアグラムが正しいと信じています。問題は、MVCが優れた抽象化ではなく、すべてのツールキットが、それを設計した方法に合うように調整することです。いくつかは良い仕事をしていますが、そうでないものもあります。確かなことは、あなたがビューを変えれば、コントローラを変更することになります(これは理論に反する)。おそらく –

+0

。私は、WebコンテキストでMVCを使用することに本当に慣れています。この場合、コントローラは単にSpring MVCのようにViewとModelを返すだけです。私はそれがデスクトップ上ではかなり異なるかもしれないと思います。 –

2

私はBill Kに同意します。リッチクライアントを扱うときは、標準MVCはそれほど重要ではありません。イベント(ブラウザのクリック)があなたのビュー(HTMLレンダリング)とはかなり違っているので、Webアプリケーションを書き込むときは素晴らしいモデルです。

標準のGUIでは、より良いモデルはPAC(プレゼンテーション/抽象化/制御)と呼ばれるものです。プレゼンテーションは(ビュー+イベントハンドラ)であり、コントローラはプレゼンテーションと抽象との間のやりとりを管理する。そして抽象化はあなたのビジネスモデルです。

このようにすると、GUI部分(ビュー+ユーザーイベント)と抽象概念の間のリンクを管理するコントローラができます。開発するGUIのPACエージェントと、それらの間のきれいな分離があります。

PACに関連するMVCよりも優れた別の記事:HMVCかなり古いですが、実用的であり、理解するのに役立ちます。

関連する問題