SlideShare a Scribd company logo
1 of 16
Download to read offline
Clean
Architecture
第Ⅴ部
アーキテクチャ Part4
前回まとめ
- 方針とレベル
- ソフトウェアシステムは方針を示したものである
- 方針は更に小さな方針に分割される
- どのような場合でも、下位レベルから上位レベルへ依存するように設計する
- ビジネスルール
- ビジネスルールとは、手動でもビジネスマネーを生み出したり節約したりするルールや手続きのこと
- 最重要ビジネスルール /最重要ビジネスデータ = エンティティ
- ユースケース = アプリケーション固有のビジネスルール
- 叫ぶアーキテクチャ
- 優れたアーキテクチャはドメイン、ユースケースを中心にしている
- FWは強力で便利だがアーキテクチャを乗っ取られてはいけない
- テストはフレームワークを使うことなく全てのユースケースのユニットテストを実行できる
- クリーンアーキテクチャ
- プレゼンターとHumble Object
第Ⅴ部:アーキテクチャ Part4
第1章:クリーンアーキテクチャ
- アーキテクチャのアイデア
- ヘクサゴナルアーキテクチャ
- DCIアーキテクチャ
- BCEアーキテクチャ
- レイヤードアーキテクチャ (勝手に記入)
- いづれも関心事の分離
- それぞれ、少なくともビジネスルールのレイヤーと、ユーザーやシステムとのインターフェイスと
なるレイヤーを持っている
- フレームワーク非依存
- アーキテクチャは FWの制約で縛るのではなく、 FWをツールとして利用する
- テスト可能
- ビジネスルールは、 UI/DBなど外部要素がなくてもテストできる
- UI非依存
- UIはシステムの他の部分を変更することなく、簡単に変更できる
- データベース非依存
- ビジネスルールは DBに束縛されないので、 MySQL/PostgreSQL 等いずれにも置き換えれる
- 外部エージェント非依存
- ビジネスルールは外界のインターフェイスについては何も知らない
第1章:クリーンアーキテクチャ
第1章:クリーンアーキテクチャ
- 依存性のルール
- 最も重要なルールは「依存性のルール」
- 内側の上位レベルだけに向かっていなければいけない
- エンティティ
- 最重要ビジネスルールをカプセル化したもの
- メソッドを持ったオブジェクトでも、データ構造と関数でも
OK
- 企業にある様々なアプリケーションから使用できるなら、
エンティティは何でも構わない
- ユースケース
- アプリケーション固有のビジネスルールが含まれる
- エンティティに入出力するデータの流れを調節する
- ユースケースの目標を達成できるように、
エンティティに最重要ビジネスルールを
使用するように指示を出す
- インターフェイスアダプター
- 外部とのデータを相互変換するアダプター
- DBについては何も知らない
- DBがSQLであればこのレイヤーに限定する
- フレームワークとドライバ
- FWやツールで構成されている
- 通常このレイヤーにはコードをあまり書かない
- 書くとしても次のレイヤーとやりとりするグルーコード
第1章:境界線を越える
- 簡単にいうとDIPでレイヤーを保護
する
第1章:境界線を越えるデータ
- 境界線を越えるデータは、単純な構造で構成される
- 好みに応じて、オブジェクトやハッシュマップ
/単なる関数呼び出しにすることができる
- EntityやDBをそのまま渡すことはしない
- 依存性のルールに違反してもいけない
- DBデータをそのまま境界を超えて渡すと、円内側が円外側を知ってしまうことになる
第1章:典型的なシナリオ
- Humble Objectとはデザインパターンの1つである
- PresenterもHumble Objectパターンの一種
- テストしにくい振る舞いと、テストしやすい振る舞いを分離する
- 内容は非常にシンプル
- 一つのモジュールは「 Humble(控えめ)」
- もう一つは残りのテストしやすい振る舞い
- 通常UIのテストは難しい
- しかし、Humble ObjectパターンでPresenterとViewに分けてシンプルに
第二章:プレゼンターとHumble Object
第二章:プレゼンターとビュー
- ViewはHumble Object(控えめ)
- イベントと渡ってきたデータの表示のみ
- つまりデータの処理はない
- Presenterはテスト可能なオブジェクト
- appからデータを受け取り、 Presenter用で適切にフォーマットして ViewModelに配置
- PresenterにDataオブジェクトを渡して、画面に日付を表示させる
- PresenterにCurrencyオブジェクトを渡して、適切な桁数と通過記号をつけてフォーマットする
- ボタンをグレーアウトする必要があれば、 PresenterがViewModelに適切なフラグを設定する
- 画面に表示するもの、 appが制御するものは全て、 ViewModelに含まれる文字列・真偽地・列挙型と
して表現する
第二章:テストとアーキテクチャ
- テスト容易性が優れたアーキテクチャの特性
- Humble Objectはその好例
- 振る舞いをテストしやすい部分と、そうでない部分を分割することが、アーキテクチャの境界の
定義につながり、PresenterとViewもそうした境界の1つ
- だが、他にも境界は存在する
第二章:データベースゲートウェイ
- ユースケースインタラクターとデータベースの間にある
- appがDBに対して実行するCRUDのメソッドを含んだポリモーフィックインターフェイス
- appがある日付のログインユーザーの名前を知りたいと思えば、 UserGatewayインターフェイスに、
getNamesOfUsersWhoLoggedというメソッドを用意して、引数に Dateを受け取り、名前のリストを戻
す
- ユースケースのレイヤーで
SQLは使用しない
- その代わり、ゲートウェイにメソッドを用意して使う
- ゲートウェイはDBのレイヤーにあるクラスで実装する
- この実装もSQLを使うのでHumble Objectである
- インタラクターはビジネスルールをカプセル化しているので、テスト可能
第二章:データマッパー
- ORM(Object Relational Mapping)
- 書籍ではORMは存在しないと書かれている
- ORMはどのレイヤーかというと、
DBである
- このように、境界の近くには
Humble Objectパターンが存在する
第Ⅴ部:Part4 まとめ
- クリーンアーキテクチャ
- 今まで様々なアーキテクチャが存在した
- 依存性は、より上位レベルの方針にのみ向けよ (一方方向)
- 制御の流れと依存方向は分離し制御せよ
- プレゼンターとHumble Object
- Humble Objectとはデザインパターンの 1つである
- テストしにくい振る舞いと、テストしやすい振る舞いを分離する
- 境界の近くに存在する

More Related Content

Similar to 第ⅴ部:clean architecture アーキテクチャ Part4

Eggplant Functional - Lesson 10 (Japanese slides)
Eggplant Functional - Lesson 10 (Japanese slides)Eggplant Functional - Lesson 10 (Japanese slides)
Eggplant Functional - Lesson 10 (Japanese slides)
Eggplant
 
オープンソース統合運用管理ツール『Hinemos』 --- その利便性及びインシデント管理について ---
オープンソース統合運用管理ツール『Hinemos』  --- その利便性及びインシデント管理について ---オープンソース統合運用管理ツール『Hinemos』  --- その利便性及びインシデント管理について ---
オープンソース統合運用管理ツール『Hinemos』 --- その利便性及びインシデント管理について ---
Open Source Software Association of Japan
 
Continuous delivery chapter4
Continuous delivery chapter4Continuous delivery chapter4
Continuous delivery chapter4
favril1
 
2005 icse-five years of product line engineering in a small company
2005 icse-five years of product line engineering in a small company2005 icse-five years of product line engineering in a small company
2005 icse-five years of product line engineering in a small company
n-yuki
 

Similar to 第ⅴ部:clean architecture アーキテクチャ Part4 (20)

Eggplant Functional - Lesson 10 (Japanese slides)
Eggplant Functional - Lesson 10 (Japanese slides)Eggplant Functional - Lesson 10 (Japanese slides)
Eggplant Functional - Lesson 10 (Japanese slides)
 
Oracleが提供するマイクロサービス開発環境
Oracleが提供するマイクロサービス開発環境Oracleが提供するマイクロサービス開発環境
Oracleが提供するマイクロサービス開発環境
 
CA Japan seminar mainframe2.0 2011/10/26
CA Japan seminar mainframe2.0 2011/10/26CA Japan seminar mainframe2.0 2011/10/26
CA Japan seminar mainframe2.0 2011/10/26
 
Osdt2015 saito
Osdt2015 saitoOsdt2015 saito
Osdt2015 saito
 
オープンソース統合運用管理ツール『Hinemos』 --- その利便性及びインシデント管理について ---
オープンソース統合運用管理ツール『Hinemos』  --- その利便性及びインシデント管理について ---オープンソース統合運用管理ツール『Hinemos』  --- その利便性及びインシデント管理について ---
オープンソース統合運用管理ツール『Hinemos』 --- その利便性及びインシデント管理について ---
 
Cloud Native Appのデプロイ先に関する考察:VM? コンテナ? aPaaS? or Serverless?
Cloud Native Appのデプロイ先に関する考察:VM? コンテナ? aPaaS? or Serverless?Cloud Native Appのデプロイ先に関する考察:VM? コンテナ? aPaaS? or Serverless?
Cloud Native Appのデプロイ先に関する考察:VM? コンテナ? aPaaS? or Serverless?
 
Nsx t api-automation_202103
Nsx t api-automation_202103Nsx t api-automation_202103
Nsx t api-automation_202103
 
(Japanese) From Continuous Integration to DevOps - Japan Innovate 2013
(Japanese) From Continuous Integration to DevOps - Japan Innovate 2013 (Japanese) From Continuous Integration to DevOps - Japan Innovate 2013
(Japanese) From Continuous Integration to DevOps - Japan Innovate 2013
 
IBM Bluemix OpenWhisk: IBM Seminar 2016, Tokyo, Japan: The Future of Cloud Pr...
IBM Bluemix OpenWhisk: IBM Seminar 2016, Tokyo, Japan: The Future of Cloud Pr...IBM Bluemix OpenWhisk: IBM Seminar 2016, Tokyo, Japan: The Future of Cloud Pr...
IBM Bluemix OpenWhisk: IBM Seminar 2016, Tokyo, Japan: The Future of Cloud Pr...
 
経営のスピードと変化に応えるシステム基盤をつくる 桑原里恵
経営のスピードと変化に応えるシステム基盤をつくる 桑原里恵経営のスピードと変化に応えるシステム基盤をつくる 桑原里恵
経営のスピードと変化に応えるシステム基盤をつくる 桑原里恵
 
Continuous delivery chapter4
Continuous delivery chapter4Continuous delivery chapter4
Continuous delivery chapter4
 
Tech Ed 2009 Japan T3-309 Microsoft Business Productivity Online Services 技術概要
Tech Ed 2009 Japan T3-309 Microsoft Business Productivity Online Services 技術概要Tech Ed 2009 Japan T3-309 Microsoft Business Productivity Online Services 技術概要
Tech Ed 2009 Japan T3-309 Microsoft Business Productivity Online Services 技術概要
 
Open棟梁概要説明 v02-00
Open棟梁概要説明 v02-00Open棟梁概要説明 v02-00
Open棟梁概要説明 v02-00
 
JANOG US Regional Event_SDI Trend_Nissho USA
JANOG US Regional Event_SDI Trend_Nissho USAJANOG US Regional Event_SDI Trend_Nissho USA
JANOG US Regional Event_SDI Trend_Nissho USA
 
Oracle Database 12c Release 1 PSR 12.1.0.2 のご紹介
Oracle Database 12c Release 1 PSR 12.1.0.2 のご紹介Oracle Database 12c Release 1 PSR 12.1.0.2 のご紹介
Oracle Database 12c Release 1 PSR 12.1.0.2 のご紹介
 
チケット駆動のサーバ/インフラ運用における問題点と手動作業の自動化
チケット駆動のサーバ/インフラ運用における問題点と手動作業の自動化チケット駆動のサーバ/インフラ運用における問題点と手動作業の自動化
チケット駆動のサーバ/インフラ運用における問題点と手動作業の自動化
 
OpenStackにおける、MySQLの活用 – OpenStackのリポジトリとしての、DBサービスの基盤としての、MySQL - OpenStack...
OpenStackにおける、MySQLの活用 – OpenStackのリポジトリとしての、DBサービスの基盤としての、MySQL  - OpenStack...OpenStackにおける、MySQLの活用 – OpenStackのリポジトリとしての、DBサービスの基盤としての、MySQL  - OpenStack...
OpenStackにおける、MySQLの活用 – OpenStackのリポジトリとしての、DBサービスの基盤としての、MySQL - OpenStack...
 
SIerにおくる、アジャイルプロセスの実践
SIerにおくる、アジャイルプロセスの実践SIerにおくる、アジャイルプロセスの実践
SIerにおくる、アジャイルプロセスの実践
 
OpenShift Ansbile 活用法 アプリケーションライフサイクルからみる導入効果
OpenShift Ansbile 活用法 アプリケーションライフサイクルからみる導入効果OpenShift Ansbile 活用法 アプリケーションライフサイクルからみる導入効果
OpenShift Ansbile 活用法 アプリケーションライフサイクルからみる導入効果
 
2005 icse-five years of product line engineering in a small company
2005 icse-five years of product line engineering in a small company2005 icse-five years of product line engineering in a small company
2005 icse-five years of product line engineering in a small company
 

More from tak

可読性について リーダブルコード Part5(優れたテストコード2)
可読性について リーダブルコード Part5(優れたテストコード2)可読性について リーダブルコード Part5(優れたテストコード2)
可読性について リーダブルコード Part5(優れたテストコード2)
tak
 
可読性について リーダブルコード Part4(優れたテストコード1)
可読性について リーダブルコード Part4(優れたテストコード1)可読性について リーダブルコード Part4(優れたテストコード1)
可読性について リーダブルコード Part4(優れたテストコード1)
tak
 
可読性について リーダブルコード Part3(コードの再構築)
可読性について リーダブルコード Part3(コードの再構築)可読性について リーダブルコード Part3(コードの再構築)
可読性について リーダブルコード Part3(コードの再構築)
tak
 
可読性について リーダブルコード Part2(ループとロジックの単純化)
可読性について リーダブルコード Part2(ループとロジックの単純化)可読性について リーダブルコード Part2(ループとロジックの単純化)
可読性について リーダブルコード Part2(ループとロジックの単純化)
tak
 
可読性について リーダブルコード part1(表面上の改善)
可読性について リーダブルコード part1(表面上の改善)可読性について リーダブルコード part1(表面上の改善)
可読性について リーダブルコード part1(表面上の改善)
tak
 
第ⅴ部:clean architecture アーキテクチャ Part5
第ⅴ部:clean architecture アーキテクチャ Part5第ⅴ部:clean architecture アーキテクチャ Part5
第ⅴ部:clean architecture アーキテクチャ Part5
tak
 
第ⅳ部:Clean architecture コンポーネントの原則
第ⅳ部:Clean architecture コンポーネントの原則第ⅳ部:Clean architecture コンポーネントの原則
第ⅳ部:Clean architecture コンポーネントの原則
tak
 
第ⅲ部:Clean architecture 設計の原則
第ⅲ部:Clean architecture 設計の原則第ⅲ部:Clean architecture 設計の原則
第ⅲ部:Clean architecture 設計の原則
tak
 
第ⅱ部:Clean architecture 構成要素から始めよ
第ⅱ部:Clean architecture 構成要素から始めよ第ⅱ部:Clean architecture 構成要素から始めよ
第ⅱ部:Clean architecture 構成要素から始めよ
tak
 

More from tak (12)

可読性について リーダブルコード Part5(優れたテストコード2)
可読性について リーダブルコード Part5(優れたテストコード2)可読性について リーダブルコード Part5(優れたテストコード2)
可読性について リーダブルコード Part5(優れたテストコード2)
 
可読性について リーダブルコード Part4(優れたテストコード1)
可読性について リーダブルコード Part4(優れたテストコード1)可読性について リーダブルコード Part4(優れたテストコード1)
可読性について リーダブルコード Part4(優れたテストコード1)
 
可読性について リーダブルコード Part3(コードの再構築)
可読性について リーダブルコード Part3(コードの再構築)可読性について リーダブルコード Part3(コードの再構築)
可読性について リーダブルコード Part3(コードの再構築)
 
可読性について リーダブルコード Part2(ループとロジックの単純化)
可読性について リーダブルコード Part2(ループとロジックの単純化)可読性について リーダブルコード Part2(ループとロジックの単純化)
可読性について リーダブルコード Part2(ループとロジックの単純化)
 
可読性について リーダブルコード part1(表面上の改善)
可読性について リーダブルコード part1(表面上の改善)可読性について リーダブルコード part1(表面上の改善)
可読性について リーダブルコード part1(表面上の改善)
 
DiI/DIコンテナを一から学んでみた
DiI/DIコンテナを一から学んでみたDiI/DIコンテナを一から学んでみた
DiI/DIコンテナを一から学んでみた
 
TypeScriptのdecoratorについて
TypeScriptのdecoratorについてTypeScriptのdecoratorについて
TypeScriptのdecoratorについて
 
Rust + web assemblyやってみた
Rust + web assemblyやってみたRust + web assemblyやってみた
Rust + web assemblyやってみた
 
第ⅴ部:clean architecture アーキテクチャ Part5
第ⅴ部:clean architecture アーキテクチャ Part5第ⅴ部:clean architecture アーキテクチャ Part5
第ⅴ部:clean architecture アーキテクチャ Part5
 
第ⅳ部:Clean architecture コンポーネントの原則
第ⅳ部:Clean architecture コンポーネントの原則第ⅳ部:Clean architecture コンポーネントの原則
第ⅳ部:Clean architecture コンポーネントの原則
 
第ⅲ部:Clean architecture 設計の原則
第ⅲ部:Clean architecture 設計の原則第ⅲ部:Clean architecture 設計の原則
第ⅲ部:Clean architecture 設計の原則
 
第ⅱ部:Clean architecture 構成要素から始めよ
第ⅱ部:Clean architecture 構成要素から始めよ第ⅱ部:Clean architecture 構成要素から始めよ
第ⅱ部:Clean architecture 構成要素から始めよ
 

第ⅴ部:clean architecture アーキテクチャ Part4