WindowsのGUIアプリ開発で、ViewModelがやるべきことが何なのか未だ全然わからないので、考えてみる(2023年7月版)その2【作成途中】

もくじ
https://tera1707.com/entry/2022/02/06/144447

やりたいこと

なんのためにViewModelを書くのか、ViewModelがなんの役に立つのかが知りたい。

この記事の前半は、こっちに書いた。

https://qiita.com/tera1707/items/1e4c80d26e7e72bfe3cd

以下は、続き。

※実験アプリを作るパート。

前提

今回作るアプリ

  • 差し替え前アプリ
    • WinUI3 パッケージアプリ
    • WindowsAppSDK 1.2.221109.1
  • 差し替え後アプリ

お試しアプリのリポジトリ

https://github.com/tera1707/ViewModelJikken

実験アプリ仕様(概要)

適当に思い付きで、下記のようなアプリを作ってみる。
(実際にそんな操作はできないが、見た目だけそれっぽく作る)

まずはWinUI3で。

  • お部屋を快適にするために、お部屋に関する設定を行う。
  • 設定可能なのは、
    • お部屋の明るさ設定
    • お部屋の温度設定
    • テレビのチャンネル(何見るかorテレビ消すか)
  • お部屋の明るさ設定は、「OFF」「薄暗い」「普通」「めっちゃあかるい」の4つを選択できるが、各々の設定時の実際のライトの明るさとしては、下記とする。
    • OFF → 0(かつ電源OFF)
    • 薄暗い → 30
    • 普通 → 70
    • めっちゃ明るい →100
  • お部屋の温度設定は、OFF(エアコン付けない),10,18,20,25,27度の設定ができるが、
    • 18,20度の時は、冷房運転にして、その温度設定にする。
    • 25,27度の時は、暖房運転にして、その温度設定にする。
    • 10度設定にしようとすると、「マジで寒くなりますけどいいですか?」とMsgを出す
  • テレビのチャンネルは、OFF以外を選択後、30分経過すると、自動でOFFを選択し、テレビを消す
  • 現在値の取得はしない。アプリ起動時、毎回
    • お部屋の明るさを「OFF」にする
    • お部屋の温度設定を「OFF」にする
    • テレビのチャンネルを「OFF」にする
  • アプリ終了時も、
    • お部屋の明るさを「OFF」にする
    • お部屋の温度設定を「OFF」にする
    • テレビのチャンネルを「OFF」にする

制御するデバイスの仕様(ライト/エアコン/テレビ)

  • ライト
    • 点灯と消灯ができる。
    • 0~100で、1刻みに明るさの設定ができる。
  • エアコン
    • 運転と停止ができる。
    • 運転モードには冷房と暖房がある。
    • 温度の設定を、10.0~30.0度まで設定できる。
  • テレビ

実験アプリの仕様(詳細)

中身を、こんなイメージで作る。

View

Viewは、下記のような画面を提供する。

  • 1つのウインドウの中に設定名とその設定の現在値をペアで表示する。
  • 設定名と現在値のペアは、複数表示する。
  • 設定名と現在値のペアがいくつあるかは不定。Modelが言う数だけ表示する。
  • 現在値は、ComboBoxで表示する。
  • ユーザーがComboboxで設定値を操作するたびに、各値の設定を行う。
    (OKボタンを押したときに全項目一括設定ではなく、操作したものを個別に設定したタイミングで設定実施する)

画面イメージ

Serviceクラス(アプリの仕様を司るクラス)

Modelは、下記のような機能(API)を提供する。

  • 存在する設定名と、その設定がもつ設定値のリストを取得するAPI
  • 存在する設定の、設定(値の変更)を行うAPI
  • ※簡単にしたいので、GetのAPIは無し。

ViewModelクラス

ViewModelは、ViewとModelの仲介役をする。

  • アプリ起動時、Viewの初期化のタイミングで、
    • Modelの「存在する設定名と、その設定がもつ設定値のリストを取得するAPI」を呼ぶ。
    • 存在した設定について、Modelの「現在値を取得するAPI」を呼ぶ。
    • 存在した設定名を、全設定分、表示する。
  • Comboboxで設定値を押下時、該当の設定について、Modelが持つ「設定(値の変更)を行うAPI」を呼ぶ。

Modelクラス

仕様を実現するためにデバイス(今回だとライトとかエアコン、テレビ)を操るためのクラス。
※実験アプリなので本当にはそんなデバイスはつけてない。イメージのみ。Debug.WriteLineするだけ。

作成途中メモ

★★★★★★★★★★★
7/18 とりあえずお試しあぷりの大枠はできた。 あと、、、

  • UTコード実装

    • mockのmdelを入れる
    • UT簡単に書く
  • Viewを、WinUI3→WPFに差し替えてみる ★★ここが重要

お試しアプリのリポジトリ

https://github.com/tera1707/ViewModelJikken

メモ

VMにこれを書くべきか?とかを考えるときは、

  • これをVMに書いたときに、Viewだけ挿げ替えたときに移植がすんなりいくか? 全く同じ動きを別のUIにもっていくときに、VMより下(Model)をポコッと外して持っていけるか?

を考えたらいい気がした。(ほぼやったことないけど)

また、

  • 自分が画面仕様だけ知っていて、Modelがなにをしてくれるかを全く知らない状態で、Viewだけを作って、後で別の人が作ったModelと合体させるという開発手順を踏むとして、ViewにとってどういうIn/OUTが欲しいか?

を考えたら、ねっちょりViewModelや、ModelとへばりつくViewにならなくて済む気がした。しらんけど