実装をするにあたって、事前に決めておいたことについて。
実装結果についてはgithubにあるんでそちらを見てもらうとして、実装をするにあたってどうやって進めて行ったか、またどういう設計にしていったかなど。
ちなみに昔であれば、前回までの詳細仕様をもとにUMLツールでクラス設計等を行っていたのだけど、今手持ちでUMLツールがないんで、手書きで書きながら進めて行った。
クラスの構成
Viewクラス、ViewModelクラス、Modelクラスと分けて言った。
今回はデータベース関連をModel割り当て、それぞれの画面に対してViewとViewModelのクラスを分けた。また上記のものとは別に画面制御用のクラスを用意している。
なおViewクラスは1クラスではなく、今回作った3画面のトップをとりあえずViewクラスとして考えて実装、取扱いがしやすいように子供のGUIはまた別のクラスで作成していっている。
Modelクラス
データはsqliteデータベースを使用した。
それへのアクセスおよびオブジェクト変換もこのクラスの中に納めた。
dbaccess.dartがこれに当たる。
画面制御クラス
viewcontrol.dartがこれに当たる。
画面の遷移系や独立したパッケージの呼び出しなどは、このクラスインスタンス経由で行うようにした。
理由は、mockを作り画面遷移をせずに画面遷移が行われたことをテストで確認したいため。
テスト用のmockについてはmockviewcontrol.dartを参照。各メソッドをオーバーライトして呼び出しされた履歴を残していて、テスト時には、呼び出されたかをすぐ確認できる。
クラスのモック作成用のパッケージであるMockitはいいパッケージなのだけど、答えの作成を事前にする必要があり、さらにその答えの作成が結構手間取ってしまうのであまり使いたくなかった。簡単なクラスでかつ事前の答えを積み上げられるようなものであれば問題はないのだけど。
今回、画面遷移はGetXパッケージのメソッドを使っている。
こういう複雑目のパッケージクラスのmockを作りいざ使おうと思ったときに、思わぬ伏兵に合い余計時間がかかってしまう場合があるから、というのもある。
Flutter-GetxController派生のMockでのエラーを参照。
実装時の注意点
実装順序
流としては以下の様に進めて行った。
- View⇔ViewModelのインターフェース用ViewModelを作成
ここではインターフェース名称とその名称でどのようなことを行うのかといったものの取り決めを行う。
インターフェースクラスを作ったほうがViewとViewModelの実装の分離がしやすくなるかもしれない。 - Viewの実装
インターフェース自体は出来上がっているので、ViewはViewModelのモッククラスを用意してテストをする。 - ViewModelの実装
複数人で作業をする場合はViewとは平行して実装するが、同一人物が作業をする場合は、Viewの後にViewModelを実装するのが良いと思う。
事前にViewへのジャンプのインターフェースができていれば特に問題ないけど。
Viewへの実装内容
View側のソースコードにはGUI構築以外の判断処理はできるだけ記述しないようにする。
これはView/ViewModelを分離してテストをしやすいようにするためで、View側で判断処理などの実装がある場合できるだけそれをViewModel側にさせるようにしている。
完全を求めるとそれはそれで実装が面倒になる可能性もあるので、目安ということではあるが。
コメント