レガシーなプロダクトからドメイン層を再設計する / iOSDC_takahashi_ishii
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/gijutsuya/59d78774-abaf-4b31-840b-2636a54bad78/397edfae37b16432fa9ffce99e87f280.jpg)
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/gijutsuya/b4f0db6c-1d09-4893-b06c-81ca83e3eaab/cb62791f156e640229ed7f37a7a5ec37.jpg)
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/gijutsuya/000d0414-b66d-4322-84db-7003c8419890/1ad8d332edcea6b298d518585b21f33b.jpg)
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/gijutsuya/b1db4655-1a10-4207-b874-a396c9b3776a/c7f8f1bd642397d30e331d87a64f1692.jpg)
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/gijutsuya/a707571e-0b20-4f9a-93e0-e6903e7ab0b9/199e9abed6ab78b487a3980a9acbff9d.jpg)
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/gijutsuya/6f40ea37-d132-4911-8805-97e7858fdd39/795a489285478e6f4aff3e261c350a73.jpg)
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/gijutsuya/693eedbe-fdd6-4162-a3a5-9b4a20a11bc0/de8228bbd38d646921a6e93b7277cf63.jpg)
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/gijutsuya/54250a7b-1d5f-42b6-8af6-32a5e28ff2a6/29c5f9a7f8550aa54fc83a683bd6b9cd.jpg)
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/gijutsuya/8deaa903-dc6e-4098-b12f-0efb933c74bc/10feb1774c2a9bc5ec268d97374f79a4.jpg)
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/gijutsuya/3fe0c194-dba2-42a6-b281-e30ab0cbbe0e/1fbb0ce98851983a779f0dd9a6a1f39c.jpg)
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/gijutsuya/cabef074-7011-4df5-8659-c6b613517ee4/8a79001188835ebeee58ad4fdbef934f.jpg)
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/gijutsuya/3c4530ae-687f-4b81-90a3-f10723ef758f/4f298d25fd5819974558188090e686c0.jpg)
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/gijutsuya/0c240622-88c0-4967-8efc-895d17ae387f/bc862c54340cadc446ebf0b212064c3b.jpg)
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/gijutsuya/dda1281a-3216-44d9-98dc-1824c0853637/43461c007e268eeafcb76ab65c3b6154.jpg)
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/gijutsuya/c64673d7-8765-4a85-80da-aae5e9d43197/651e6c873bc66b471ac97c8f5f36e0ab.jpg)
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/gijutsuya/9a7238f6-e54b-4910-9736-1780098287e3/87ebaa3815283b0ebfcf512cd1ce977b.jpg)
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/gijutsuya/5c2be755-4f50-4d39-9b01-c434a5e263d4/604108a86b5e7536f4161e7c5c02070c.jpg)
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/gijutsuya/d0c36e60-a97b-46c8-b98b-c3dcadd5436e/ba9b0b98087f8cfa4315fee7cec8bb32.jpg)
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/gijutsuya/15300c37-801b-4948-a9fd-de4538efc01c/883552f791b899551a5a79f361fd48d7.jpg)
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/gijutsuya/c975944c-20ad-4783-bcb8-fa08037a3dbc/70668bae8eac5eb5be06f489182b953d.jpg)
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/gijutsuya/c7ff50e0-2564-41d8-931d-7de1a88e49f6/f180d2d3ec832df888a9fa922a7e95e6.jpg)
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/gijutsuya/a5ec7845-8ade-46b9-90fc-7434d00c2c0e/46eee313b0227179aa03c3f285f8dca1.jpg)
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/gijutsuya/a755f2d4-7315-44fd-bdc7-8a68c95e27b7/e62e2377743d1020af52dda68fd69726.jpg)
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/gijutsuya/9f2304b1-45ee-41b5-8d00-cb764a5ce0e2/f6ecc40ecd229aac3a14dd44462db496.jpg)
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/gijutsuya/d9b8eaa8-1be7-4e75-a998-092c94b0868d/d704c7590269b37cb834dcd9de244c29.jpg)
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/gijutsuya/b3e12798-386d-47bd-b3f7-7d4845a94af6/2e2b74df06999ca01a7abcd20f5f9e1a.jpg)
Transcript
- (2018.10-) 高橋陽太郎 • 株式会社リクルート • Engineering Manager
- る Model APIやDBアクセス レイヤリングを適切にする ことでFat Viewから脱却 したい。 なぜか依存している DBアクセス用のモデル を生成してたりする
- て肥大化。 UseCase ほぼRepositoryの ラッパー Repository ほぼDataAccessの ラッパー DataAccess APIやDBアクセ ス DomainModel
- UseCase ほぼRepositoryの ラッパー Repository ほぼDataAccessの ラッパー DataAccess APIやDBアクセ ス DomainModel 【疑問】 状態を置くレイヤーが適切ではない のでは? Presenter 画面表示のための データやフラグ、 ビジネスロジック。 大量の状態を持っ て肥大化。
- ◦ 別のUIや実行基盤でも考えてみて同じように価値を提供できるか確認する • これらを意識してモデリングをしてみたら、レイヤリングに注力していた最初期から はアプリの捉え方、認識の仕方がまるっきり変わっていた。 ↑スライドの途中ですが一番伝えたかったことです。
- 【仕様③】JR中央本線 の「新宿駅」を選択する と、別路線の新宿駅も 選択状態になる。 【仕様④】 ユーザーには選択した 都道府県+選択した駅 名で表示する
- • でも、我々アプリの本質は「ユーザーと求人とのインタラクション」を実現すること。それ にまつわるドメインモデリングはアプリでも必要だった。 ◦ 例えば閲覧履歴や検索条件など、ユーザーと求人の関係を促進するためのデータはモデルにする価 値がある(右図)
- ◦ インターフェースに変更があると、具象クラス全てに影響が出てしまうため
- 内部状態に強く依存していないか、同じインプットに対して同じアウトプットを返すか ◦ インスタンスを生成する時に長大なセットアップを必要としていないか≒サイズは適切か
- 実際作ってみたことでユースケースに足りない機能があることを発見できた
- -> 仕様書的にテストを書ける b. 状況 -> データの準備、使い回しがやりやすい
- ある程度必要 コード量 動かすためのコードが結構必要 👍必要最小限 パターン網羅 データ準備や操作が大変 👍データ準備は必要、あとは実行するだけ 繰り返し検証 大変 👍簡単
- どちらかで変更があればもう一方にも反映する ▪ 項目→応募入力項目に名前変更 • コードが書けたならモデル(図)はメンテナンスしなくて良い? ◦ それぞれ目的が違う ▪ モデルは全体を俯瞰するために有用 • 全体像、要素の関係を把握しやすい • 仕様変更(新たな仕様)の際に全体の中での位置、既存の要素との関係がすぐわかる モデル コード 全体、俯瞰、 要素の関係 具体、詳細
- た ◦ ドメインには事実を持たせる?情報を持たせる? ◦ ドメインは現実世界のものと対応するべき? ◦ サーバーサイドではなく、アプリでもドメインに注意を払う必要ってあるの? ◦ 作ってみたドメインがしっくりきているかってどうやったらわかるの? ▪ 気づいたらテストコードの書き方も練度が上がっていた ◦ 動作するコードが出来上がったら、モデルもメンテナンスしなければいけないの?
- モデリングする上でたくさん疑問にぶつかり、それらに自分たちなりの解答を出せ た ◦ ドメインには事実を持たせる?情報を持たせる? ◦ ドメインは現実世界のものと対応するべき? ◦ サーバーサイドではなく、アプリでもドメインに注意を払う必要ってあるの? ◦ 作ってみたドメインがしっくりきているかってどうやったらわかるの? ▪ 気づいたらテストコードの書き方も練度が上がっていた ◦ 動作するコードが出来上がったら、モデルもメンテナンスしなければいけないの?