SlideShare a Scribd company logo
「関心の分離」と「疎結合」
ソフトウェアアーキテクチャのひとかけら
Atsushi Nakamura
About Me
Copyright 2017 @nuits_jp
中村 充志 / Atsushi Nakamura
• リコージャパン株式会社 金融事業部所属
• Enterprise系のITアーキテクト
• JavaからC#へ渡り歩く
• 趣味はXamarin
• Blog http://www.nuits.jp
• Blog(英語) https://blog.nuits.jp
• Twitter @nuits_jp
「関心の分離」と「疎結合」
Today’s Goal
1. ソフトウェア アーキテクチャの概略を理解いただく
2. 特に理解いただきたいこと
1. 関心(関心事)の分離
2. カプセル化
3. 密結合と疎結合
4. 疎結合を実現する代表的な手段
Today’s Goal
Xamarin.Forms NavigationOverview Slide 4
「関心の分離」と「疎結合」
アーキテクトとは?
アーキテクトとはなにか?
Slide 6Copyright 2017 @nuits_jp
class Class Model
ITアーキテクト
IT アーキテクチャ ≒ システム アーキテクチャ
設計・構築する
アプリケーション アーキテクチャ
(≒ソフトウェア アーキテクチャ)
インフラストラクチャ
アーキテクチャ
インテグレーション
アーキテクチャ
アーキテクトとはなにか?
Slide 7Copyright 2017 @nuits_jp
class Class Model
ITアーキテクト
IT アーキテクチャ ≒ システム アーキテクチャ
設計・構築する
アプリケーション アーキテクチャ
(≒ソフトウェア アーキテクチャ)
インフラストラクチャ
アーキテクチャ
インテグレーション
アーキテクチャ
「関心の分離」と「疎結合」
ソフトウェア アーキテクチャといえば何を思い浮かべますか?
Copyright 2017 @nuits_jp
1. MVC
2. MVP
3. MVVM
4. MVPVM
5. クリーン アーキテクチャ
6. レイヤー アーキテクチャ
7. オニオン アーキテクチャ
などなど
これらはソフトウェア アーキテクチャの類型的なパターン群です
ソフトウェア アーキテクチャといえば何を思い浮かべますか?
Copyright 2017 @nuits_jp Slide 9
ソフトウェア アーキテクチャとは何か?
ソフトウェアアーキテクチャでは、ソフトウェア システムの構成に関する一連
の重要な判断を網羅しています。これには、システムを構成する要素とイン
ターフェイスの選択、要素間のコラボレーションとして指定される動作、この
ような構成と動作の要素のより大きなサブシステムに対する構成、この構成の
指針となるアーキテクチャスタイルが含まれます。また、機能性、ユーザビリ
ティ、復元性、パフォーマンス、再利用性、理解できること、経済的な制約、
テクノロジの制約、トレードオフ、および外観への配慮も必要です。
by Philippe Kruchten, Grady Booch, Kurt Bittner, Rich Reitman
Microsoft 「アプリケーション アーキテクチャ ガイド2.0」より引用
Copyright 2017 @nuits_jp Slide 10
ソフトウェア アーキテクチャとは何か?
アーキテクチャは、システムを大きなレベルで分解したもので、決定事項の変
更は困難です。システムには複数のアーキテクチャが存在し、アーキテクチャ
にとって重要な事項はシステムの運用中に変化します。要するに、重要な要素
は、すべてアーキテクチャということになります。
by Martin Fowler
Microsoft 「アプリケーション アーキテクチャ ガイド2.0」より引用
Copyright 2017 @nuits_jp Slide 11
ソフトウェア アーキテクチャとは何か?
ソフトウェアアーキテクチャとは、抽象化と問題の分割によって複雑性を減ら
すことを主に念頭に置いたものである。ただし、今までのところ、「ソフト
ウェアアーキテクチャ」という用語に関して、万人が合意した厳密な定義は存
在しない
Wikipedia「ソフトウェアアーキテクチャ」より引用
Copyright 2017 @nuits_jp Slide 12
Slide 13Copyright 2017 @nuits_jp
とは言え、おおよその共通認識はある
1. ソフトウェアアーキテクチャとは
システムアーキテクチャのうち、ソフトウェア領域のアーキテク
チャである
この時「システム」とは「IT」だけではなく、それらを取り巻く
社会やビジネスを含めた「仕組み」を指すことも多い
※ 元来「System」とは制度・組織・体系・系統などのこと
ソフトウェア アーキテクチャとは何か?かみ砕くと…
Copyright 2017 @nuits_jp
2. ソフトウェア アーキテクチャとは
1. ソフトウェアにおける重要な決定事項全てである
2. その中でも特につぎの2点が重要
1. ソフトウェア全体を、どのように分割するか
2. 分割した部分同士を、どのように相互作用させるか
ソフトウェア アーキテクチャとは何か?かみ砕くと…
Copyright 2017 @nuits_jp
3. ソフトウェアアーキテクチャを構築するのはなぜか?
• 「システムの実現をサポートする」
• 「持続可能なソフトウェア」を
• 「バランスよく」構築するため
4. ソフトウェアアーキテクチャのバランスとは?
1. Quality(機能・非機能)
2. Cost
3. Delivery(開発期間)
特にアーキテクチャは非機能要求から受ける影響が大きい
ソフトウェア アーキテクチャとは何か?かみ砕くと…
Copyright 2017 @nuits_jp
「関心の分離」と「疎結合」
Again, today’s Goal
Copyright 2017 @nuits_jp
1. ソフトウェア アーキテクチャの概略を理解いただく
2. 特に理解いただきたいこと
1. 関心(関心事)の分離
2. カプセル化
3. 密結合と疎結合
4. 疎結合を実現する代表的な手段
Today’s Goal
Slide 18Xamarin.Forms NavigationOverview
1. ソフトウェア アーキテクチャの概略を理解いただく
2. 特に理解いただきたいこと
1. 関心(関心事)の分離
2. カプセル化
3. 密結合と疎結合
4. 疎結合を実現する代表的な手段
Today’s Goal
Slide 19Xamarin.Forms NavigationOverview
「関心の分離」と「疎結合」
関心(関心事)の分離
Copyright 2017 @nuits_jp
さて、アーキテクチャとは「どう分割し、どう結合するか」が重要
だとお話ししました。
その観点で非常に重要な概念として
Separation of Concerns(SoC):関心(関心事)の分離
という考え方があります。
プログラムは異なる関心事は、異なる部分に分離せよという設計原
則です。
Separation of Concerns
Copyright 2017 @nuits_jp
たとえば、MVC・MVP・MVVMなども、ある「何かと何か」の関心
を分離するための仕組みです。
MVC, MVP, MVVM, MVPVM, …
Slide 22Copyright 2017 @nuits_jp
Binding &
Command Update
NotificationNotification
MVC・MVP・MVVMなどはつぎの二つの関心事を分離するものです。
• プレゼンテーション
• プレゼンテーション以外
MVC, MVP, MVVM, MVPVM, …
Slide 23Copyright 2017 @nuits_jp
Binding &
Command Update
NotificationNotification
プレゼンテーション その他
いくつか明確な理由があります。
1. プレゼンテーションは専門性が高い
→プレゼンテーションのみを分業できる仕組みを用意したい
2. 一般的にコードによるテストが困難である
→プレゼンテーション以外はコードによるテストを行いたい
こう言った理由から、プレゼンテーションとそれ以外を分離して設計する
考え方を「Presentation Domain Separation(PDS)」と言います。
なぜプレゼンテーションを分離するのか?
Slide 24Copyright 2017 @nuits_jp
Slide 25
MVC, MVP, MVVM, MVPVM, … is PDS
Copyright 2017 @nuits_jp
Presentation Domain Separation:PDS
Slide 26
MVC, MVP, MVVM, MVPVM, … is PDS
Copyright 2017 @nuits_jp
Presentation Domain Separation:PDS
手段
目的
Slide 27
PDS is SoC
Copyright 2017 @nuits_jp
Presentation Domain Separation:PDS
Separation of Concerns:SoC
Slide 28
PDS is SoC
Copyright 2017 @nuits_jp
Presentation Domain Separation:PDS
Separation of Concerns:SoC
手段
目的
Slide 29Copyright 2017 @nuits_jp
プレゼンテーション以外の関心は?
多くのソフトウェアのプレゼンテーションと、それ以外の比率は
プレゼンテーション < それ以外
です。
ところで
Slide 30Copyright 2017 @nuits_jp
Binding &
Command Update
NotificationNotification
プレゼンテーション その他
Slide 31
これらの概念だけでは足りない
Copyright 2017 @nuits_jp
Presentation Domain Separation:PDS
Separation of Concerns:SoC
何かがここに必要!
何が必要なのか?
手段
目的
Slide 32Copyright 2017 @nuits_jp
ケースバイケースで銀の弾丸はない
1. Domain Driven Design(ドメイン駆動設計)
2. レイヤー アーキテクチャ
3. クリーン アーキテクチャ
4. Microsoft アプリケーション アーキテクチャ ガイド2.0
など
とはいえ参考となるものは存在する
Slide 33Copyright 2017 @nuits_jp
Slide 34Copyright 2017 @nuits_jp
ここからはモデルケースを見ながら進めます
【要求】
• 端末の位置情報を利用し、周辺のレストラン一覧を表示する
• レストラン情報は「リクルートWEBサービス」のグルメサーチ
APIを利用させていただく
https://webservice.recruit.co.jp/hotpepper/reference.html
• コンソールアプリケーションとして実装する
【制限事項】
• UnitTestの実装例はごく一部に限らせていただきます
【制限事項】
https://github.com/nuitsjp/SoC-and-Loosely-Coupled
題材
Slide 35Copyright 2017 @nuits_jp
関心の分離方針
Slide 36Copyright 2017 @nuits_jp
• プレゼンテーション層
• ユーザーインターフェース(コンソール)を
実現する
Presentation
• ビジネスロジック層
• ユースケース単位でクラスを分割
• 今回は「周辺のレストランを探す」ユース
ケースのみ
Usecase
• プログラム外との統合するための層
• 現在地座標の取得と、指定座標のレストラン
情報の取得の2種類に分割
Integration
全体としてはレイヤー アーキテクチャを採用
Slide 37Copyright 2017 @nuits_jp
それではコードを見てみましょう!
現在の構造
Slide 38Copyright 2017 @nuits_jp
class Class Model
Presentation
RestauranListConsole
FindRestaurants
+ FindNearbyRestaurantsAsync(): GourmetSearchResult
GourmetService
+ SearchGourmetInfosAsync(): GourmetSearchResult
GeoCoordinator
Usecase
Integration
GourmetSearchResult
Slide 39Copyright 2017 @nuits_jp
NGポイント:関心の未分離
class Class Model
Presentation
RestauranListConsole
FindRestaurants
+ FindNearbyRestaurantsAsync(): GourmetSearchResult
GourmetService
+ SearchGourmetInfosAsync(): GourmetSearchResult
GeoCoordinator
Usecase
Integration
GourmetSearchResult
NGポイント:関心の未分離
Slide 40Copyright 2017 @nuits_jp
Slide 41Copyright 2017 @nuits_jp
関心をカプセル化する
めざす姿
Slide 42Copyright 2017 @nuits_jp
class Class Model
Presentation
RestauranListConsole
FindRestaurants
+ FindNearbyRestaurantsAsync(): IList<Restaurant>
GourmetService
+ SearchGourmetInfosAsync(): IList<GourmetInfo>
GeoCoordinator
Usecase
Integration
GourmetSearchResult
GourmetInfo
Restaurant
①
②
③
class Class Model
Presentation
RestauranListConsole
FindRestaurants
+ FindNearbyRestaurantsAsync(): IList<Restaurant>
GourmetService
+ SearchGourmetInfosAsync(): IList<GourmetInfo>
GeoCoordinator
Usecase
Integration
GourmetSearchResult
GourmetInfo
Restaurant
現在の構造
Slide 43Copyright 2017 @nuits_jp
Slide 44Copyright 2017 @nuits_jp
NGポイント:密結合
class Class Model
Presentation
RestauranListConsole
FindRestaurants
+ FindNearbyRestaurantsAsync(): IList<Restaurant>
GourmetService
+ SearchGourmetInfosAsync(): IList<GourmetInfo>
GeoCoordinator
Usecase
Integration
GourmetSearchResult
GourmetInfo
Restaurant
NGポイント:密結合
Slide 45Copyright 2017 @nuits_jp
NGポイント:密結合
Slide 46Copyright 2017 @nuits_jp
• クラスとクラスが直接依存関係にある
• 各レイヤー間が密結合状態となっている
class Class Model
FindRestaurants
+ FindNearbyRestaurantsAsync(): IList<Restaurant>
GourmetService
+ SearchGourmetInfosAsync(): IList<GourmetInfo>
new
use
class Class Model
Presentation
RestauranListConsole
FindRestaurants
+ FindNearbyRestaurantsAsync(): IList<Restaurant>
GourmetService
+ SearchGourmetInfosAsync(): IList<GourmetInfo>
GeoCoordinator
Usecase
Integration
GourmetSearchResult
GourmetInfo
Restaurant
NGポイント:密結合
Slide 47Copyright 2017 @nuits_jp
一般論
• 利用者側が、依存先の影響を強く受ける
• 結果、保守性・拡張性が低下する
なぜ密結合が悪いのか?
Slide 48Copyright 2017 @nuits_jp
class Class Model
Presentation
RestauranListConsole
FindRestaurants
+ FindNearbyRestaurantsAsync(): IList<Restaurant>
GourmetService
+ SearchGourmetInfosAsync(): IList<GourmetInfo>
GeoCoordinator
Usecase
Integration
GourmetSearchResult
GourmetInfo
Restaurant
NGポイント:密結合
Slide 49Copyright 2017 @nuits_jp
class Class Model
Presentation
RestauranListConsole
FindRestaurants
+ FindNearbyRestaurantsAsync(): IList<Restaurant>
GourmetService
+ SearchGourmetInfosAsync(): IList<GourmetInfo>
GeoCoordinator
Usecase
Integration
GourmetSearchResult
GourmetInfo
Restaurant
NGポイント:密結合
Slide 50Copyright 2017 @nuits_jp
Slide 51Copyright 2017 @nuits_jp
閑話:UnitTest
class Class Model
テストコード テスト対象 依存先
テストが難しいクラス
Slide 52Copyright 2017 @nuits_jp
class Class Model
テストコード テスト対象 依存先
テストが難しいクラス
Slide 53Copyright 2017 @nuits_jp
class Class Model
テストコード テスト対象 依存先
テストが難しいクラス
Slide 54Copyright 2017 @nuits_jp
• 依存先がテストを困難にする要素を持っている
• 時間
• 位置情報
• ネットワーク
• 大量の再依存クラス
• など
依存先を置き換え可能にする
Slide 55Copyright 2017 @nuits_jp
class Class Model
テストコード テスト対象
依存先
«interface»
依存先
テスト用の偽物
依存先を置き換え可能にする
Slide 56Copyright 2017 @nuits_jp
class Class Model
テストコード テスト対象
依存先
«interface»
依存先
テスト用の偽物
依存先を置き換え可能にする
Slide 57Copyright 2017 @nuits_jp
class Class Model
テストコード テスト対象
依存先
«interface»
依存先
テスト用の偽物
Driver
依存先を置き換え可能にする
Slide 58Copyright 2017 @nuits_jp
class Class Model
テストコード テスト対象
依存先
«interface»
依存先
テスト用の偽物
Stub
Fake
Mock
Slide 59Copyright 2017 @nuits_jp
閑話終了 疎結合を目指す
class Class Model
FindRestaurants
+ FindNearbyRestaurantsAsync()
GourmetService
+ SearchGourmetInfosAsync()
«interface»
IGourmetService
+ SearchGourmetInfosAsync()
疎結合を実現する
Slide 60Copyright 2017 @nuits_jp
利用者がインターフェースにのみ
依存している状態を目指す
Slide 61Copyright 2017 @nuits_jp
疎結合の実現 その1 インターフェースの抽出
class Class Model
FindRestaurants
+ FindNearbyRestaurantsAsync()
GourmetService
+ SearchGourmetInfosAsync()
«interface»
IGourmetService
+ SearchGourmetInfosAsync()
new
use
インターフェースの抽出結果
Slide 62Copyright 2017 @nuits_jp
利用箇所の依存性は分離できたが
インスタンス生成箇所がクラスに
依存している。
1. Dependency Injectionパターン
2. Service Locatorパターン
解決方法は二つ
Slide 63Copyright 2017 @nuits_jp
1. Dependency Injectionパターン
2. Service Locatorパターン
解決方法は二つ
Slide 64Copyright 2017 @nuits_jp
class Class Model
FindRestaurants
+ FindNearbyRestaurantsAsync()
GourmetService
+ SearchGourmetInfosAsync()
«interface»
IGourmetService
+ SearchGourmetInfosAsync()
new
use
インターフェースの抽出結果
Slide 65Copyright 2017 @nuits_jp
利用箇所の依存性は分離できたが
インスタンス生成箇所がクラスに
依存している。
Slide 66Copyright 2017 @nuits_jp
疎結合の実現 その2 依存性の注入
疎結合の実現
Slide 67Copyright 2017 @nuits_jp
class Class Model
FindRestaurants
+ FindNearbyRestaurantsAsync()
GourmetService
+ SearchGourmetInfosAsync()
«interface»
IGourmetService
+ SearchGourmetInfosAsync()
Program
injection
new
use
Slide 68Copyright 2017 @nuits_jp
UnitTestを書いてみよう!
Slide 69Copyright 2017 @nuits_jp
Dependency Injection 面倒ですよね?
Slide 70Copyright 2017 @nuits_jp
Dependency Injection Containerを使おう!
「関心の分離」と「疎結合」
まとめ
Copyright 2017 @nuits_jp
1. ソフトウェア アーキテクチャとは
1. 重要な決定事項の全てがアーキテクチャ
2. 特にその中でも次の2点が重要
1. 全体をどう部分に分割するか
2. ソフトウェア内部と外部、部分と部分をどう結合し、どう
相互作用させるか
まとめ ①
Copyright 2017 @nuits_jp
1. 関心の分離
分割する際「関心の分離(SoC)」を実現すること
2. カプセル化
分割された対象は、依存先の関心を内部にカプセル化すること
3. 密結合と疎結合
分割された対象間は、密結合しないよう疎結合を保つこと
4. 疎結合を実現する代表的な手段
インターフェースを活用し疎結合を実現すること
その際、結合はDependency Injection Patternなどを利用すること
まとめ ②
Copyright 2017 @nuits_jp
これらを実践するにあたり、いくつかのツールを紹介した
• UnitTestの実施
→ UnitTest Frameworkを利用しよう
• UnitTest時のMockについて
→ Mock生成をサポートするライブラリを使おう
• Dependency Injection Pattern
→ Dependency Injection Containerを使うと良い
まとめ ③
Slide 74Copyright 2017 @nuits_jp
ThankYou!
Any Questions?

More Related Content

What's hot (20)

イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
Yoshitaka Kawashima
 
リーンなコードを書こう:実践的なオブジェクト指向設計
リーンなコードを書こう:実践的なオブジェクト指向設計リーンなコードを書こう:実践的なオブジェクト指向設計
リーンなコードを書こう:実践的なオブジェクト指向設計
増田 亨
 
3週連続DDDその1 ドメイン駆動設計の基本を理解する
3週連続DDDその1  ドメイン駆動設計の基本を理解する3週連続DDDその1  ドメイン駆動設計の基本を理解する
3週連続DDDその1 ドメイン駆動設計の基本を理解する
増田 亨
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知る
Shuhei Fujita
 
Tackling Complexity
Tackling ComplexityTackling Complexity
Tackling Complexity
Yoshitaka Kawashima
 
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみようドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
 
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
Tadahiro Ishisaka
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
Y Watanabe
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
Soudai Sone
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
増田 亨
 
45分間で「ユーザー中心のものづくり」ができるまで詰め込む
45分間で「ユーザー中心のものづくり」ができるまで詰め込む45分間で「ユーザー中心のものづくり」ができるまで詰め込む
45分間で「ユーザー中心のものづくり」ができるまで詰め込む
Yoshiki Hayama
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
 
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)
Yoshitaka Kawashima
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
 
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
Shota Shinogi
 
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
Daichi Koike
 
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解するドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
増田 亨
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
mosa siru
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
Yoshitaka Kawashima
 
リーンなコードを書こう:実践的なオブジェクト指向設計
リーンなコードを書こう:実践的なオブジェクト指向設計リーンなコードを書こう:実践的なオブジェクト指向設計
リーンなコードを書こう:実践的なオブジェクト指向設計
増田 亨
 
3週連続DDDその1 ドメイン駆動設計の基本を理解する
3週連続DDDその1  ドメイン駆動設計の基本を理解する3週連続DDDその1  ドメイン駆動設計の基本を理解する
3週連続DDDその1 ドメイン駆動設計の基本を理解する
増田 亨
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知る
Shuhei Fujita
 
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみようドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
 
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
Tadahiro Ishisaka
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
Y Watanabe
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
Soudai Sone
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
増田 亨
 
45分間で「ユーザー中心のものづくり」ができるまで詰め込む
45分間で「ユーザー中心のものづくり」ができるまで詰め込む45分間で「ユーザー中心のものづくり」ができるまで詰め込む
45分間で「ユーザー中心のものづくり」ができるまで詰め込む
Yoshiki Hayama
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
 
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)
Yoshitaka Kawashima
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
 
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
Shota Shinogi
 
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
Daichi Koike
 
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解するドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
増田 亨
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
mosa siru
 

Similar to 「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら (20)

世界一わかりやすいClean Architecture release-preview
世界一わかりやすいClean Architecture release-preview世界一わかりやすいClean Architecture release-preview
世界一わかりやすいClean Architecture release-preview
Atsushi Nakamura
 
世界一わかりやすいClean Architecture - DroidKaigiバージョン
世界一わかりやすいClean Architecture - DroidKaigiバージョン世界一わかりやすいClean Architecture - DroidKaigiバージョン
世界一わかりやすいClean Architecture - DroidKaigiバージョン
Atsushi Nakamura
 
市場動向並びに弊社製品の今後の展望について
市場動向並びに弊社製品の今後の展望について市場動向並びに弊社製品の今後の展望について
市場動向並びに弊社製品の今後の展望について
Ken Azuma
 
市場動向並びに弊社製品の今後の展望について
市場動向並びに弊社製品の今後の展望について市場動向並びに弊社製品の今後の展望について
市場動向並びに弊社製品の今後の展望について
Ken Azuma
 
【16-D-1】UI のこれまでの10年とこれから
【16-D-1】UI のこれまでの10年とこれから【16-D-1】UI のこれまでの10年とこれから
【16-D-1】UI のこれまでの10年とこれから
Ken Azuma
 
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD PatternApplication Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Atsushi Kambara
 
技術選択とアーキテクトの役割
技術選択とアーキテクトの役割技術選択とアーキテクトの役割
技術選択とアーキテクトの役割
Toru Yamaguchi
 
「モダン」アプリケーションと マイクロソフト プラットフォーム
「モダン」アプリケーションとマイクロソフト プラットフォーム「モダン」アプリケーションとマイクロソフト プラットフォーム
「モダン」アプリケーションと マイクロソフト プラットフォーム
Kazuyuki Nomura
 
ビジネスとデザイン ~ビジネスは悪くない~
ビジネスとデザイン ~ビジネスは悪くない~ビジネスとデザイン ~ビジネスは悪くない~
ビジネスとデザイン ~ビジネスは悪くない~
Ken Azuma
 
アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
Tomoharu ASAMI
 
設計モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第45回】
設計モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第45回】設計モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第45回】
設計モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第45回】
Tomoharu ASAMI
 
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
Tadayoshi Sato
 
大規模フロントエンドのクリーンアーキテクチャ化 ~ 年間売上1,000億円企業モノタロウの取組み ~
大規模フロントエンドのクリーンアーキテクチャ化 ~ 年間売上1,000億円企業モノタロウの取組み ~大規模フロントエンドのクリーンアーキテクチャ化 ~ 年間売上1,000億円企業モノタロウの取組み ~
大規模フロントエンドのクリーンアーキテクチャ化 ~ 年間売上1,000億円企業モノタロウの取組み ~
株式会社MonotaRO Tech Team
 
【18-C-3】システムアーキテクチャ構築の実践手法
【18-C-3】システムアーキテクチャ構築の実践手法【18-C-3】システムアーキテクチャ構築の実践手法
【18-C-3】システムアーキテクチャ構築の実践手法
Developers Summit
 
アプリケーション・サブシステム 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第37回】
アプリケーション・サブシステム 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第37回】アプリケーション・サブシステム 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第37回】
アプリケーション・サブシステム 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第37回】
Tomoharu ASAMI
 
Net advantage 2012 volume2 最新情報 xaml プラットフォーム編
Net advantage 2012 volume2 最新情報 xaml プラットフォーム編Net advantage 2012 volume2 最新情報 xaml プラットフォーム編
Net advantage 2012 volume2 最新情報 xaml プラットフォーム編
Daizen Ikehara
 
プレゼンテーション・サブシステム 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第38回】
プレゼンテーション・サブシステム 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第38回】プレゼンテーション・サブシステム 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第38回】
プレゼンテーション・サブシステム 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第38回】
Tomoharu ASAMI
 
Modeling in the Agile Age and casual astah models
Modeling in the Agile Age and casual astah modelsModeling in the Agile Age and casual astah models
Modeling in the Agile Age and casual astah models
Kenji Hiranabe
 
デブサミ2010 これからのアーキテクチャを見通す
デブサミ2010 これからのアーキテクチャを見通すデブサミ2010 これからのアーキテクチャを見通す
デブサミ2010 これからのアーキテクチャを見通す
Yusuke Suzuki
 
Developers Summit 2013【15-B-6】開発者の "資産形成" につながる Action とは?
Developers Summit 2013【15-B-6】開発者の "資産形成" につながる Action とは?Developers Summit 2013【15-B-6】開発者の "資産形成" につながる Action とは?
Developers Summit 2013【15-B-6】開発者の "資産形成" につながる Action とは?
インフラジスティックス・ジャパン株式会社
 
世界一わかりやすいClean Architecture release-preview
世界一わかりやすいClean Architecture release-preview世界一わかりやすいClean Architecture release-preview
世界一わかりやすいClean Architecture release-preview
Atsushi Nakamura
 
世界一わかりやすいClean Architecture - DroidKaigiバージョン
世界一わかりやすいClean Architecture - DroidKaigiバージョン世界一わかりやすいClean Architecture - DroidKaigiバージョン
世界一わかりやすいClean Architecture - DroidKaigiバージョン
Atsushi Nakamura
 
市場動向並びに弊社製品の今後の展望について
市場動向並びに弊社製品の今後の展望について市場動向並びに弊社製品の今後の展望について
市場動向並びに弊社製品の今後の展望について
Ken Azuma
 
市場動向並びに弊社製品の今後の展望について
市場動向並びに弊社製品の今後の展望について市場動向並びに弊社製品の今後の展望について
市場動向並びに弊社製品の今後の展望について
Ken Azuma
 
【16-D-1】UI のこれまでの10年とこれから
【16-D-1】UI のこれまでの10年とこれから【16-D-1】UI のこれまでの10年とこれから
【16-D-1】UI のこれまでの10年とこれから
Ken Azuma
 
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD PatternApplication Architecture for Enterprise Win Store Apps with DDD Pattern
Application Architecture for Enterprise Win Store Apps with DDD Pattern
Atsushi Kambara
 
技術選択とアーキテクトの役割
技術選択とアーキテクトの役割技術選択とアーキテクトの役割
技術選択とアーキテクトの役割
Toru Yamaguchi
 
「モダン」アプリケーションと マイクロソフト プラットフォーム
「モダン」アプリケーションとマイクロソフト プラットフォーム「モダン」アプリケーションとマイクロソフト プラットフォーム
「モダン」アプリケーションと マイクロソフト プラットフォーム
Kazuyuki Nomura
 
ビジネスとデザイン ~ビジネスは悪くない~
ビジネスとデザイン ~ビジネスは悪くない~ビジネスとデザイン ~ビジネスは悪くない~
ビジネスとデザイン ~ビジネスは悪くない~
Ken Azuma
 
アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
Tomoharu ASAMI
 
設計モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第45回】
設計モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第45回】設計モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第45回】
設計モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第45回】
Tomoharu ASAMI
 
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
Tadayoshi Sato
 
大規模フロントエンドのクリーンアーキテクチャ化 ~ 年間売上1,000億円企業モノタロウの取組み ~
大規模フロントエンドのクリーンアーキテクチャ化 ~ 年間売上1,000億円企業モノタロウの取組み ~大規模フロントエンドのクリーンアーキテクチャ化 ~ 年間売上1,000億円企業モノタロウの取組み ~
大規模フロントエンドのクリーンアーキテクチャ化 ~ 年間売上1,000億円企業モノタロウの取組み ~
株式会社MonotaRO Tech Team
 
【18-C-3】システムアーキテクチャ構築の実践手法
【18-C-3】システムアーキテクチャ構築の実践手法【18-C-3】システムアーキテクチャ構築の実践手法
【18-C-3】システムアーキテクチャ構築の実践手法
Developers Summit
 
アプリケーション・サブシステム 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第37回】
アプリケーション・サブシステム 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第37回】アプリケーション・サブシステム 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第37回】
アプリケーション・サブシステム 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第37回】
Tomoharu ASAMI
 
Net advantage 2012 volume2 最新情報 xaml プラットフォーム編
Net advantage 2012 volume2 最新情報 xaml プラットフォーム編Net advantage 2012 volume2 最新情報 xaml プラットフォーム編
Net advantage 2012 volume2 最新情報 xaml プラットフォーム編
Daizen Ikehara
 
プレゼンテーション・サブシステム 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第38回】
プレゼンテーション・サブシステム 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第38回】プレゼンテーション・サブシステム 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第38回】
プレゼンテーション・サブシステム 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第38回】
Tomoharu ASAMI
 
Modeling in the Agile Age and casual astah models
Modeling in the Agile Age and casual astah modelsModeling in the Agile Age and casual astah models
Modeling in the Agile Age and casual astah models
Kenji Hiranabe
 
デブサミ2010 これからのアーキテクチャを見通す
デブサミ2010 これからのアーキテクチャを見通すデブサミ2010 これからのアーキテクチャを見通す
デブサミ2010 これからのアーキテクチャを見通す
Yusuke Suzuki
 

More from Atsushi Nakamura (17)

Settings SyncとCodespaceで体験する新世代へのパラダイムシフト
Settings SyncとCodespaceで体験する新世代へのパラダイムシフトSettings SyncとCodespaceで体験する新世代へのパラダイムシフト
Settings SyncとCodespaceで体験する新世代へのパラダイムシフト
Atsushi Nakamura
 
C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021
Atsushi Nakamura
 
Unicodeで半角全角を扱うAmbiguous(曖昧さ)とUncertainty(不確実性)の恐怖
Unicodeで半角全角を扱うAmbiguous(曖昧さ)とUncertainty(不確実性)の恐怖Unicodeで半角全角を扱うAmbiguous(曖昧さ)とUncertainty(不確実性)の恐怖
Unicodeで半角全角を扱うAmbiguous(曖昧さ)とUncertainty(不確実性)の恐怖
Atsushi Nakamura
 
世界一わかりやすいClean Architecture alpha-1
世界一わかりやすいClean Architecture alpha-1世界一わかりやすいClean Architecture alpha-1
世界一わかりやすいClean Architecture alpha-1
Atsushi Nakamura
 
Visual Studio 2019で始める「WPF on .NET Core 3.0」開発
Visual Studio 2019で始める「WPF on .NET Core 3.0」開発Visual Studio 2019で始める「WPF on .NET Core 3.0」開発
Visual Studio 2019で始める「WPF on .NET Core 3.0」開発
Atsushi Nakamura
 
Desktop app dev strategy for .net core 3.0
Desktop app dev strategy for .net core 3.0Desktop app dev strategy for .net core 3.0
Desktop app dev strategy for .net core 3.0
Atsushi Nakamura
 
継続的にテスト可能な設計を考える
継続的にテスト可能な設計を考える継続的にテスト可能な設計を考える
継続的にテスト可能な設計を考える
Atsushi Nakamura
 
継続的にテスト可能な設計を考える ベータ版
継続的にテスト可能な設計を考える ベータ版継続的にテスト可能な設計を考える ベータ版
継続的にテスト可能な設計を考える ベータ版
Atsushi Nakamura
 
α版 継続的にテスト可能な設計を考える
α版 継続的にテスト可能な設計を考えるα版 継続的にテスト可能な設計を考える
α版 継続的にテスト可能な設計を考える
Atsushi Nakamura
 
App center analyticsを使い倒そう
App center analyticsを使い倒そうApp center analyticsを使い倒そう
App center analyticsを使い倒そう
Atsushi Nakamura
 
Old:App center analyticsを使い倒そう
Old:App center analyticsを使い倒そうOld:App center analyticsを使い倒そう
Old:App center analyticsを使い倒そう
Atsushi Nakamura
 
Xamarin.forms navigation overview
Xamarin.forms navigation overviewXamarin.forms navigation overview
Xamarin.forms navigation overview
Atsushi Nakamura
 
App center analyticsを使い倒そう
App center analyticsを使い倒そうApp center analyticsを使い倒そう
App center analyticsを使い倒そう
Atsushi Nakamura
 
Blue monkey architecture overview
Blue monkey architecture overviewBlue monkey architecture overview
Blue monkey architecture overview
Atsushi Nakamura
 
Xamarin Dev days 2 xamarin.forms ja
Xamarin Dev days 2   xamarin.forms jaXamarin Dev days 2   xamarin.forms ja
Xamarin Dev days 2 xamarin.forms ja
Atsushi Nakamura
 
Why prism for xamarin.forms
Why prism for xamarin.formsWhy prism for xamarin.forms
Why prism for xamarin.forms
Atsushi Nakamura
 
Enterpriseから見たXamarinの可能性
Enterpriseから見たXamarinの可能性Enterpriseから見たXamarinの可能性
Enterpriseから見たXamarinの可能性
Atsushi Nakamura
 
Settings SyncとCodespaceで体験する新世代へのパラダイムシフト
Settings SyncとCodespaceで体験する新世代へのパラダイムシフトSettings SyncとCodespaceで体験する新世代へのパラダイムシフト
Settings SyncとCodespaceで体験する新世代へのパラダイムシフト
Atsushi Nakamura
 
C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021
Atsushi Nakamura
 
Unicodeで半角全角を扱うAmbiguous(曖昧さ)とUncertainty(不確実性)の恐怖
Unicodeで半角全角を扱うAmbiguous(曖昧さ)とUncertainty(不確実性)の恐怖Unicodeで半角全角を扱うAmbiguous(曖昧さ)とUncertainty(不確実性)の恐怖
Unicodeで半角全角を扱うAmbiguous(曖昧さ)とUncertainty(不確実性)の恐怖
Atsushi Nakamura
 
世界一わかりやすいClean Architecture alpha-1
世界一わかりやすいClean Architecture alpha-1世界一わかりやすいClean Architecture alpha-1
世界一わかりやすいClean Architecture alpha-1
Atsushi Nakamura
 
Visual Studio 2019で始める「WPF on .NET Core 3.0」開発
Visual Studio 2019で始める「WPF on .NET Core 3.0」開発Visual Studio 2019で始める「WPF on .NET Core 3.0」開発
Visual Studio 2019で始める「WPF on .NET Core 3.0」開発
Atsushi Nakamura
 
Desktop app dev strategy for .net core 3.0
Desktop app dev strategy for .net core 3.0Desktop app dev strategy for .net core 3.0
Desktop app dev strategy for .net core 3.0
Atsushi Nakamura
 
継続的にテスト可能な設計を考える
継続的にテスト可能な設計を考える継続的にテスト可能な設計を考える
継続的にテスト可能な設計を考える
Atsushi Nakamura
 
継続的にテスト可能な設計を考える ベータ版
継続的にテスト可能な設計を考える ベータ版継続的にテスト可能な設計を考える ベータ版
継続的にテスト可能な設計を考える ベータ版
Atsushi Nakamura
 
α版 継続的にテスト可能な設計を考える
α版 継続的にテスト可能な設計を考えるα版 継続的にテスト可能な設計を考える
α版 継続的にテスト可能な設計を考える
Atsushi Nakamura
 
App center analyticsを使い倒そう
App center analyticsを使い倒そうApp center analyticsを使い倒そう
App center analyticsを使い倒そう
Atsushi Nakamura
 
Old:App center analyticsを使い倒そう
Old:App center analyticsを使い倒そうOld:App center analyticsを使い倒そう
Old:App center analyticsを使い倒そう
Atsushi Nakamura
 
Xamarin.forms navigation overview
Xamarin.forms navigation overviewXamarin.forms navigation overview
Xamarin.forms navigation overview
Atsushi Nakamura
 
App center analyticsを使い倒そう
App center analyticsを使い倒そうApp center analyticsを使い倒そう
App center analyticsを使い倒そう
Atsushi Nakamura
 
Blue monkey architecture overview
Blue monkey architecture overviewBlue monkey architecture overview
Blue monkey architecture overview
Atsushi Nakamura
 
Xamarin Dev days 2 xamarin.forms ja
Xamarin Dev days 2   xamarin.forms jaXamarin Dev days 2   xamarin.forms ja
Xamarin Dev days 2 xamarin.forms ja
Atsushi Nakamura
 
Why prism for xamarin.forms
Why prism for xamarin.formsWhy prism for xamarin.forms
Why prism for xamarin.forms
Atsushi Nakamura
 
Enterpriseから見たXamarinの可能性
Enterpriseから見たXamarinの可能性Enterpriseから見たXamarinの可能性
Enterpriseから見たXamarinの可能性
Atsushi Nakamura
 

「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら