現場で役立つシステム設計の原則
~変更を楽で安全にするオブジェクト指向の実践技法
増田 亨
2017年8月25日
第1章 小さくまとめてわかりやすくする
第2章 場合分けのロジックを整理する
第3章 業務ロジックをわかりやすく整理する
第4章 ドメインモデルの考え方で設計する
第5章 アプリケーション機能を組み立てる
第6章 データベースの設計とドメインオブジェクト
第7章 画面とドメインオブジェクトの設計を連動させる
第8章 アプリケーション間の連携
第9章 オブジェクト指向の開発プロセス
第10章 オブジェクト指向設計の学び方と教え方
本日の内容
書きたくなかった
書き忘れた
うまく書けなかった
Q&A / 意見交換
書きたくなかった
• 自分はやっていないこと
• コードの具体例で示せないこと
• 現場で役に立たない総論や抽象論
• 自分では「どうでも良い」「それは違う」と思っ
ていることを「それもありです」と言うこと
stream(), extends, private final, …
JPA, Active Record, Lombok, …
TDD, CI, Docker, …
Java以外のプログラミング言語
スクリプト言語
書き忘れた
神崎さんのRDRAへの言及
ドメイン駆動設計との関係
いくつかの実装パターン
いくつかのドメインオブジェクト
現場への取り入れ方
RDRA
• 第4章 ドメインモデルの考え方で設計する
– 全体と部分をいったりきたりしながら作っていく
– 全体を俯瞰する道具
• RDRA/神崎さんと出会ってから、設計のアプロー
チが変わった
– リレーションシップ駆動の効果に目覚めた
• 書くべきだった
– RDRAの紹介
– 参考文献の提示
ドメイン駆動設計との関係
• 第5章 アプリケーション機能を組み立てる
第6章 データベース設計とドメインオブジェクト
– Entity, Repository, Aggregateの設計パターン
• エバンス本の真価
– 第3部 深いモデルの探求(の実践ストーリー)
– 第4部 戦略的設計(誰がやるのか)
実装パターン
• 第1章 小さくまとめてわかりやすくする
– Range オブジェクト ( from, to )
• 期間、範囲
• 上限が未指定/下限が未指定
• Range 間の演算
• 第2章 場合分けのロジックを整理する
– Bean Validationによる if文の激減
– Spring MVC @Validated
• バリデーショングループ
覚えておくとよいドメインオブジェクト
• Location パターン
– 「場所」という関心事と判断/加工/計算ロジック
• Category パターン
– 「分類」という関心事と判断/加工/計算ロジック
• Role パターン
– 「権限」という関心事
– 「認可」という関心事
• できる/できない
• 見える/見えない
• その判断ロジック、導出ロジック
現場への取り入れ方
• まずは自分から
– 具体的に手を動かして
– 少しずつ時間をかけて
– 結果を形で見せる
• コードの見た目(わかりやすさ)
• 修正/拡張のスピード
• 品質の安定性
• 唯一の正解とか最終回答とかはない
– どんな答えも、もっと良いものがあるはず
• 個人の裁量範囲は思っているより広い
– 逸脱するとやばいポイントはあるが、そこを避ければだいたいはOK
• やりすぎることで見えてくるものがある
– 理想と現実の境目
– 「失敗体験」という財産
うまく書けなかった
自分の頭の中では、もっと書けると思っていたこと
4章
ドメインモデルの考え方で設計する
• 業務の関心事の基本パターンを覚えておく
– 自分が使っているいろいろな分析パターン
– コード例
• ドメインオブジェクトの設計を段階的に改善
– 集中のために切り捨てる
– 切り捨てに保険をかける(安心して切り捨てる)
– 小さな実験
– 違和感(なんか違う)へのこだわり
– ブレークスルーと決断
5章
アプリケーション機能を組み立てる
• ドメインモデルと「入出力」の関心事の分離
– 分離できない時に起きがちな問題の具体例
– うまく分離できた場合の効果の具体例
• Repository
– すべてのオブジェクトはメモリ上に存在すると考える
• データベースの永続化の隠蔽手段とは別のとらえ方
– 設計パターン
• findBy( Identifier identifier )
• listOf( Criteria criteria )
• 検査メソッド : count(), isExist(), …
6章
データベースの設計とドメインオブジェクト
• OR マッピングのコード例 (4点セット)
– UserRepository.java (インタフェース宣言)
– UserDatasource.java (実装クラス)
– UserMapper.java
– UserMapper.xml
• 事実の記録のテーブル設計の具体例
– 前後関係の記録
– 関連性(交差テーブル)の記録
– 任意項目の扱い(未記入、未定、先送り、… )
• 参照系のテーブル設計の具体例
– リビジョン管理と最新レコードの参照
– 残高更新
– 未読/未済
– 状態遷移の記録と現在の状態の参照
7章
画面とドメインオブジェクトの設計を連動させる
• 画面デザインの4原則
近接/整列/対比/反復
– 画面の具体例
– HTML の具体例
– CSS クラス設計の具体例(コード例)
• Semantic UI
– ドメインオブジェクトとの連動のコード例
• Thymeleaf th:* 属性
– 画面の部品化の具体例
• Thymeleaf th:include/th:replace
8章
アプリケーション間の連携
• コードの具体例
– @RestController
– JSON/XML と オブジェクトのマッピング例
• 非同期メッセージング
– 困っていること
– 解決の考え方
– 実装の具体例
• ドメイン駆動設計の4部(戦略的設計)への関
連づけ
9章
オブジェクト指向の開発プロセス
• コードの自己文書化の具体例
– ソースコードをドキュメントとして活用する工夫
• SI(受託開発)ビジネスでの取り組み方
– 発注の立場
– 受注の立場
– 二次受け、三次受けの立場
• 役割分担制への取り組み
– デザイナ
– 品質保証部門
– 基盤チーム
– 運用チーム
…
10章
オブジェクト指向の学び方と教え方
• オブジェクト指向の設計スキル向上のための
コードレビューの重点ポイント
– 導入期
– 広げていく段階
– 発展させる段階
• オブジェクト指向の基礎知識(?)
– もとになったアイデアを知る(Simula 67)
– 実現の仕組みを理解する( klass ポインタ )
– 設計スタイルの多様性と取捨選択
• いろいろな継承
• いろいろな多態
• いろいろなカプセル化
現場への取り入れ方/根付かせ方
• 主体
– 個人/有志/チーム/組織
• ペース配分(学習曲線)
– 徐々に時間をかけて
– ブレークスルー
– 徐々に時間をかけて
• 方向
– 変えずに幅を広げてみる
– 別の角度から取り組んでみる
• 質と量
– 質の違いを実感する
– 量をこなして体で覚える
どんな状況でも改善はできる
どんなときでもあなたから改善を始められる
どんなときでも今日から改善を始められる
by Kent Beck, Extreme Programming
少しずつ
時間をかけて
Q & A
意見交換
第1章 小さくまとめてわかりやすくする
第2章 場合分けのロジックを整理する
第3章 業務ロジックをわかりやすく整理する
第4章 ドメインモデルの考え方で設計する
第5章 アプリケーション機能を組み立てる
第6章 データベースの設計とドメインオブジェクト
第7章 画面とドメインオブジェクトの設計を連動させる
第8章 アプリケーション間の連携
第9章 オブジェクト指向の開発プロセス
第10章 オブジェクト指向設計の学び方と教え方

現場で役立つシステム設計の原則