# Chapter 7 画面とドメインオブジェクトの設計を連動させる ## 画面アプリケーションの開発の難しさ ## 画面の関心事を小さく分けて独立させる ## 画面とドメインオブジェクトを連動させる ### 画面もドメインオブジェクトも利用者の関心事のかたまり - 利用者にとって、「画面」こそがソフトウェアの実体。 - 三層+ドメインモデル方式で設計する場合、利用者の関心事はドメインオブジェクトと対応する。 | 画面 | ドメインオブジェクト | | -------- | -------- | | 商品の登録 | Productクラス | | 商品詳細の表示 | Productクラス | | 商品の一覧 | Productクラス(コレクションオブジェクト) | | 商品の検索条件 | Criteriaクラス | - 画面はドメインオブジェクトを視覚的に表現したもので、ドメインオブジェクトを画面に表示するにはいくつか選択肢がある。 - ドメインオブジェクトをそのまま画面の表示にも使う - 画面用のオブジェクトを別途用意する - 画面用のデータクラスを別途用意する - 画面は利用者の関心事のかたまり。ドメインオブジェクトは利用者の関心事のソフトウェア表現。 - つまり同じ関心事の異なる表現なので、画面の表示にオブジェクトをそのまま使うのがよいはず。 - しかし、実際にはいくつか問題が起きる。 - 画面は様々な関心事が複合していて、ドメインオブジェクトの粒度や構造と整合しにくい時がある - 画面の表示だけに関係する判断や加工のロジックをドメインオブジェクトに持ち込みたくない - 問題に対応するために2つのやり方がある。 - ビュー専用オブジェクト - 画面用のデータを保持し、表示用に加工するロジックを一つにまとめたオブジェクト - データの受け渡しのためのデータクラスを用意 - どこにでもロジックを書けてしまうという問題があるため使うべきではない - どこになにが書いてあるかわからない - コードの重複が増える - ドメインオブジェクトをそのまま使う or 表示用のロジックを持つビュー専用オブジェクトを用意。 ### ドメインオブジェクトと画面の食い違いは設計改善の手がかり - ビュー専用オブジェクトではなく、ドメインオブジェクトをそのまま使うほうが良い。 - 画面の関心事とドメインオブジェクトで表現する関心事は一致するのが基本。一致してないなら、その原因を分析する。 - 画面の表示項目と対応するドメインオブジェクトが提供する情報が一致していない - ドメインオブジェクトの改善。もしくはドメインオブジェクトを画面に反映。 - この考え方はタスクベースのUIであることが前提。 - 複数の関心事が混在している「何でも画面」を提供するならビュー専用オブジェクトを用意する。 ### ドメインオブジェクトに書くべきロジック - ビューとモデルの分離は設計原則として広く知られている。 - モデルの設計にビューの影響がでることを気にしすぎているケースが有る。 - ビューに書くべきこととドメインオブジェクトに書くべきことを整理する考え方は3つ。 - 論理的な情報構造はドメインオブジェクトで表現する - 場面ごとの表示の違いをドメインオブジェクトで出し分ける - HTMLのclass属性をドメインオブジェクトから出力する #### 論理的な情報構造はドメインオブジェクトで表現する - ビューの記述は基本的に次の2つ - 物理的なビュー = 技術方針に依存 - HTMLのタグ、改行コード - 論理的なビュー = 技術方針に依存しない - 「複数の段落」という「構造」だけを表現。 - 段落の論理構造を表現する `type description []string` - 「最初の段落の、最初の20文字だけ表示する」というようなロジック。 #### 用語とその用語の定義の対を表現する - ドメインオブジェクトで論理構造を表現する例として、用語とその説明を一対にした「定義リスト」を考えてみる。 - HTMLの場合は`<dl>`タグで表現できる。 - 論理構造は次のように表現できる ```go type definitionList map[string][]string ``` #### 場面ごとの表示の違いをドメインオブジェクトで出し分ける - 画面表示でifを使っている場合、その条件判断をドメインオブジェクトに移動できないかを検討する。 ```go func found(items []List) string{ if len(items) ==0{ return "見つかりませんでした" } return fmt.Sprintf("%s件見つかりまいした", len(items)) } ``` - ドメインオブジェクトのロジックに表示内容を書くことはビューとモデルの分離の原則に違反しているように感じる人もいると思う。 - しかし変更容易性を考えるとこちらのほうが良い。 ### HTMLのclass属性をドメインオブジェクトから出力する - 条件によって視覚表現を変える例。 - ドメインオブジェクト側にclass属性を返すメソッドを用意する。 ###### tags: `ISBN-978-4-7741-9087-7`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up