Viewのためのクラス - 要求分析駆動設計

ここまで一括りにView、Helperとしてきたが、ViewModelやPresenterなどViewで使うためのクラスも存在する。このレイヤのクラスについて簡単に言及しておきたい。

ViewやHelperが依存できるクラスとして、Rule、ValueObject、Stateを上げてきた。 これは、ボタンの有効無効などの切り替え判定のメソッドとして利用できるためである。

<button class="<%= state.complete_in_next? ? 'enable' : 'disable' %>">完了</button>

Rule、ValueObject、Stateを直接利用しても良いが、Viewのためのメソッドを追加したい場合もある。そのような場合は、ViewRule、ViewValueObject、ViewStateのようなクラスを用意して、必要なメソッドを定義するようにする。 Rule、ValueObject、Stateを各々継承しても良いし、委譲してもよい。 View側におけるEntityのような存在が必要な場合は、ViewModelという名前で作成する。Entityを継承したりEntityに委譲することは許されない。 ディレクトリパスはdomainsディレクトリと似た構成にする。

app
└── view_models
    └── xxx_feature
        ├── xxx_view_model.rb
        ├── xxx_view_rule.rb
        ├── xxx_view_state.rb
        └── xxx_view_value_object.rb

これらは、必要であれば作成するものであって、機械的にdomainsディレクトリと対応させるようなことはしてはならない。