データを保持する部分と表示する部分がいっしょになっていると、表示方法を変えるときに変更するのが大変。あるいは見た目は変えずにデータの処理部分を変えるのも難しい。そこで、データを保持する部分と表示する部分を分ける。つまりModel View Controller(MVC)のモデルとビューに分けるということ。
リファクタリングの本では「観察されるデータの複製(Duplicate Observed Data)」という。観測される、つまり画面に表示されるデータがモデル側からビュー側に複製されるということ。
手順
- モデルを表現するクラスを作成
- ビュー側からモデルを参照
- ビュー側からモデルのメソッドを使うように変更
コンパイルしてテスト。
- 通知の内容を表すイベントを宣言
- 通知を行うインタフェースを宣言
- 通知を受け取るメソッドをビューに宣言
コンパイルしてテスト。
- モデルにビューを登録
- ビューにモデルを登録
- モデルを変更したらビューへ通知するコードを追加
- ビューに通知を受け取ったら表示を更新するコードを追加
コンパイルして確認。
デザインパターンのObserverパターンを使ってモデルとビューに分けたテストプログラムを以前書いた。(id:toburau:20070823)
分離することは割とすぐにできるが、どうやって同期を取るのかが難しい。Observerパターンとイベントリスナーを使うとか。いまいちこのあたりに弱い。