1. ホーム
  2. model-view-controller

[解決済み] Qtはなぜモデル/ビューという用語を間違って使っているのか?

2022-11-11 08:08:18

質問

Qtのモデル/ビューコントロールで使われている用語は欠陥があると思います。以下のように の説明ページで では、ビューとコントローラを統合することでMVCをMVに単純化したと述べており、次のような図を示しています。

しかし私は、彼らはオブジェクトの役割の名前を間違えた、と思っています。

  1. コントローラをマージしたViewと呼ばれているものは、実際にはViewのみです。
  2. Modelと呼んでいるものは、実はControllerだけです。
  3. もし本当にモデルを持ちたいのであれば、それは彼らの "Data"がある場所でしょう。

私は、あなたのアプリでQtのモデル/ビューコンポーネントを使用する、通常で正常な方法について話しています。 以下はその理由です。

  1. これは典型的なQtコンポーネントであり、オブジェクトに固有のコントローラロジックを追加することなく、そのまま使用されます。)
  2. 行数、列数、データなど、モデルとは関係のないいくつかのQtメソッドを実装しなければならないので、これはほとんどモデルとは言えません。実際、典型的なモデルメソッドはControllerの中にあります。もちろん、コントローラ モデルロジックを実装することもできますが、まずコードデザインが悪くなりますし、ControllerとViewではなくControllerとModelを統合することになるので、ControllerとViewを統合することになります。
  3. 理由2.で述べたように、もしモデルロジックを分離したいのであれば、それはきっと写真の青いボックスではなく、破線の "Data"ボックス(もちろん実際のデータに通信する)でしょう。

Qtの用語がおかしいのか、それとも私が理解していないだけなのでしょうか?(ところで、なぜ学術的な質問でないかというと、私は彼らの命名に従って私のプロジェクトをコーディングし始め、すぐにそのコードが明らかに正しくないことがわかったからです。私は彼らがモデルと呼ぶものにモデルロジックを入れようとしてはいけないと気づいたのは、そのあとでした)

どのように解決するのですか?

Qt の命名が誤解を招くものであることに同意します。しかし、私の考えでは、この問題は Qt のみの問題ではなく、以下の原則を遵守することを可能にするすべてのフレームワークが共有しているものです。 懸念事項の分離 の原則を守って UI を実装するすべてのフレームワークに共通する問題です。誰かがそのようなフレームワークを考え出し、「ものごと」を分離しておく良い方法を見つけると、彼らは常に「モデル」と呼ぶモジュールと「ビュー」と呼ぶモジュールを持つことを義務付けられるように感じます。長年にわたり、私はこれらのフレームワークと一緒に仕事をしてきました。

  • MFC
  • Qt
  • スウィング
  • SWT
  • MVVM による WPF

これらのフレームワークで「モデル」と「ビュー」という用語がどのように使用されているか、また、「ビュー」、「モデル」、「コントローラ」(もしあれば)のクラスがどのような責任を負っているかを比較すると、非常に大きな違いがあることに気づくでしょう。あるフレームワークから別のフレームワークに乗り換える人が正気を保てるように、異なる概念と用語の比較があれば確かに便利ですが、それには多くの作業と調査が必要です。良い読み物は、Martin Fowlerの 概要 .

さまざまな考え方があるので、どのような MVC パターンはどのように見えるのか、どれが正しいのでしょうか?私の考えでは、MVC を発明した人たちに、MVC がどのように実装されることになっているのか、正しく理解する必要があります。その中で スモールトークの原論文 と書いてあります。

<ブロッククオート

ビューは、ビットマップディスプレイのアプリケーションに割り当てられた部分へのグラフィックおよび/またはテキスト出力を管理します。コントローラはユーザーからのマウスやキーボードの入力を解釈し、モデルやビューを適宜変更するよう命令します。最後に、モデルはアプリケーションドメインの動作とデータを管理し、その状態に関する情報の要求(通常はビューから)に応答し、状態を変更する指示(通常はコントローラから)に応答します。

それを踏まえて、私はあなたの3つの主要な懸念にこう答えます。

  1. 実際、Qt コンポーネントは "manages the graphical [...] output" and "interprets the mouse and keyboard inputs" なので、上記の定義に関しては、確かにビューとコントローラーを統合したものと言えるかもしれません。
  2. 私は、あなたが (再び上記の定義に関して) Controller と Model をマージすることを余儀なくされている/されることに同意します。
  3. またまた、同感です。モデルは アプリケーションドメイン . これは、"data"と呼ばれるものです。明らかに、たとえば行や列を扱うことは、通常、私たちのアプリケーション ドメインとは何の関係もありません。

私たちをどこに置いていくのでしょうか。私の考えでは、Qtのモデルやビューという用語が使われているときの本当の意味を理解し、Qtでプログラミングしている間はその用語の使い方をするのがベストだと思います。Qt のセットアップ方法はエレガントなデザインを可能にし、それは彼らの間違った命名規則よりも重要です。