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. DBの正規化

  2. micro:bit + BLE + ChromeブラウザーそしてPro…

  3. Googleの検索結果をスプレッドシートに抜く方法

  4. Arduinoに複数のシリアル通信をさせる

  5. Reactのお勉強方法

  6. Linux Kernel Map

  7. JQM テンプレートhtml

  8. PHP, Python, Ruby, バランス