ITで遊ぶ

GUIアプリケーションを書く時のオブジェクトの設計

ウェブの世界ではMVC(Model, View, Controller)とクラスを分けて書くことが多い。

しかし、Java, PythonなどでGUI(Graphic User Interface)を伴うアプリケーションを書く時にはこのとおりにやるとうまくいかないようだ。

今、Pythonでプログラムを書いている。

GUIはTkinterで書いている。

最初、MVCのようにコントローラーをメインにして、Tkinterの画面をクラスにしてみた。
これをやると、ユーザーがGUI操作をした途端に書けなくなる。
例えば、リストボックスに眼、鼻、口と並んでいたとしよう。
ユーザーが鼻をクリックしたら、鼻にかんするデータを別リストボックスに出したい。
当然、データベースにクエリーをかけ、結果をリストボックスに書き出したい。

しかし、画面がクラスだとコントローラーにイベント(リストボックスの「鼻」が押されたよ)をコールバック関数で返すしかなくなる。
クラスのコールバック関数の設定はやっかいで、GUIのクラスからデータベースクラスを呼んだほうが簡単だよね、となる。

それならばコントローラーってなんの意味があるの?となってしまう。ひとつのクラスのコールバックを羅列していてコントローラーといえるだろうか?画面遷移を伴うからコントローラーが有効なんだと思う。

ウェブアプリケーションは一回、サーバー側に制御を渡すとサーバー側は画面を再送する。
対話型アプリケーションは画面の一部を書き換えることが多い。画面全体を入れ替えることはあまりない。ダイアログやらなんやら出して、全体はユーザーに見せておきたい。
この違いで、デスクトップアプリはGUIがメインの流れを作ることになる。

(ちなみにウェブアプリでも,データをJSONなどで送受する場合があるけれども、やはりMVCはうまくいかない。)

記憶をたどるとJavaでSwing使った時もVisual BasicもBorlandのDelphiもGUIがすべてのトリガーで処理を書いていた。

MVCアーキテクチャは万能ではない、と思った。

もちろんGUIのパーツにユニークな動きをさせたいと思えば、そのクラスを書いたほうがいいのだろうけれども。

関連記事

  1. 思想をあらわすプログラミング

  2. PythonのGUI(ジオメトリーマネージャ)

  3. ドローンボートについてKindle出版した

  4. Raspberry Piに本当の乱数発生器が追加されていた

  5. ハッカソンって騒ぐだけ?

  6. wxPython (PythonのGUI)

  7. JavaScriptでオブジェクト指向をするには

  8. ソフトウェアは進歩し続けなけりゃならんのか?