Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
「関心の分離」と「疎結合」
ソフトウェアアーキテクチャのひとかけら
Atsushi Nakamura
About Me
Copyright 2017 @nuits_jp
中村 充志 / Atsushi Nakamura
• リコージャパン株式会社 金融事業部所属
• Enterprise系のITアーキテクト
• JavaからC#へ渡り歩く
• ...
「関心の分離」と「疎結合」
Today’s Goal
1. ソフトウェア アーキテクチャの概略を理解いただく
2. 特に理解いただきたいこと
1. 関心(関心事)の分離
2. カプセル化
3. 密結合と疎結合
4. 疎結合を実現する代表的な手段
Today’s Goal
Xamarin.Forms...
「関心の分離」と「疎結合」
アーキテクトとは?
アーキテクトとはなにか?
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. オニオン アーキテクチャ
などなど
これらはソフトウェア アーキテクチャの類型的なパターン群です
ソフトウェア ...
ソフトウェア アーキテクチャとは何か?
ソフトウェアアーキテクチャでは、ソフトウェア システムの構成に関する一連
の重要な判断を網羅しています。これには、システムを構成する要素とイン
ターフェイスの選択、要素間のコラボレーションとして指定される...
ソフトウェア アーキテクチャとは何か?
アーキテクチャは、システムを大きなレベルで分解したもので、決定事項の変
更は困難です。システムには複数のアーキテクチャが存在し、アーキテクチャ
にとって重要な事項はシステムの運用中に変化します。要するに、...
ソフトウェア アーキテクチャとは何か?
ソフトウェアアーキテクチャとは、抽象化と問題の分割によって複雑性を減ら
すことを主に念頭に置いたものである。ただし、今までのところ、「ソフト
ウェアアーキテクチャ」という用語に関して、万人が合意した厳密な...
Slide 13Copyright 2017 @nuits_jp
とは言え、おおよその共通認識はある
1. ソフトウェアアーキテクチャとは
システムアーキテクチャのうち、ソフトウェア領域のアーキテク
チャである
この時「システム」とは「IT」だけではなく、それらを取り巻く
社会やビジネスを含めた「仕組み」を指すことも多い
※ 元来「System...
2. ソフトウェア アーキテクチャとは
1. ソフトウェアにおける重要な決定事項全てである
2. その中でも特につぎの2点が重要
1. ソフトウェア全体を、どのように分割するか
2. 分割した部分同士を、どのように相互作用させるか
ソフトウェア...
3. ソフトウェアアーキテクチャを構築するのはなぜか?
• 「システムの実現をサポートする」
• 「持続可能なソフトウェア」を
• 「バランスよく」構築するため
4. ソフトウェアアーキテクチャのバランスとは?
1. Quality(機能・非機...
「関心の分離」と「疎結合」
Again, today’s Goal
Copyright 2017 @nuits_jp
1. ソフトウェア アーキテクチャの概略を理解いただく
2. 特に理解いただきたいこと
1. 関心(関心事)の分離
2. カプセル化
3. 密結合と疎結合
4. 疎結合を実現する代表的な手段
Today’s Goal
Slide 18Xamar...
1. ソフトウェア アーキテクチャの概略を理解いただく
2. 特に理解いただきたいこと
1. 関心(関心事)の分離
2. カプセル化
3. 密結合と疎結合
4. 疎結合を実現する代表的な手段
Today’s Goal
Slide 19Xamar...
「関心の分離」と「疎結合」
関心(関心事)の分離
Copyright 2017 @nuits_jp
さて、アーキテクチャとは「どう分割し、どう結合するか」が重要
だとお話ししました。
その観点で非常に重要な概念として
Separation of Concerns(SoC):関心(関心事)の分離
という考え方があります。
プログラムは異なる関心...
たとえば、MVC・MVP・MVVMなども、ある「何かと何か」の関心
を分離するための仕組みです。
MVC, MVP, MVVM, MVPVM, …
Slide 22Copyright 2017 @nuits_jp
Binding &
Comma...
MVC・MVP・MVVMなどはつぎの二つの関心事を分離するものです。
• プレゼンテーション
• プレゼンテーション以外
MVC, MVP, MVVM, MVPVM, …
Slide 23Copyright 2017 @nuits_jp
Bin...
いくつか明確な理由があります。
1. プレゼンテーションは専門性が高い
→プレゼンテーションのみを分業できる仕組みを用意したい
2. 一般的にコードによるテストが困難である
→プレゼンテーション以外はコードによるテストを行いたい
こう言った理由...
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
Notifica...
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 34Copyright 2017 @nuits_jp
ここからはモデルケースを見ながら進めます
【要求】
• 端末の位置情報を利用し、周辺のレストラン一覧を表示する
• レストラン情報は「リクルートWEBサービス」のグルメサーチ
APIを利用させていただく
https://webservice.recruit.co.jp/hotpeppe...
関心の分離方針
Slide 36Copyright 2017 @nuits_jp
• プレゼンテーション層
• ユーザーインターフェース(コンソール)を
実現する
Presentation
• ビジネスロジック層
• ユースケース単位でクラスを...
Slide 37Copyright 2017 @nuits_jp
それではコードを見てみましょう!
現在の構造
Slide 38Copyright 2017 @nuits_jp
class Class Model
Presentation
RestauranListConsole
FindRestaurants
+ FindNearbyRes...
Slide 39Copyright 2017 @nuits_jp
NGポイント:関心の未分離
class Class Model
Presentation
RestauranListConsole
FindRestaurants
+ FindNearbyRestaurantsAsync(): GourmetSearchResult
Go...
Slide 41Copyright 2017 @nuits_jp
関心をカプセル化する
めざす姿
Slide 42Copyright 2017 @nuits_jp
class Class Model
Presentation
RestauranListConsole
FindRestaurants
+ FindNearbyRest...
class Class Model
Presentation
RestauranListConsole
FindRestaurants
+ FindNearbyRestaurantsAsync(): IList<Restaurant>
Gour...
Slide 44Copyright 2017 @nuits_jp
NGポイント:密結合
class Class Model
Presentation
RestauranListConsole
FindRestaurants
+ FindNearbyRestaurantsAsync(): IList<Restaurant>
Gour...
NGポイント:密結合
Slide 46Copyright 2017 @nuits_jp
• クラスとクラスが直接依存関係にある
• 各レイヤー間が密結合状態となっている
class Class Model
FindRestaurants
+ F...
class Class Model
Presentation
RestauranListConsole
FindRestaurants
+ FindNearbyRestaurantsAsync(): IList<Restaurant>
Gour...
一般論
• 利用者側が、依存先の影響を強く受ける
• 結果、保守性・拡張性が低下する
なぜ密結合が悪いのか?
Slide 48Copyright 2017 @nuits_jp
class Class Model
Presentation
RestauranListConsole
FindRestaurants
+ FindNearbyRestaurantsAsync(): IList<Restaurant>
Gour...
class Class Model
Presentation
RestauranListConsole
FindRestaurants
+ FindNearbyRestaurantsAsync(): IList<Restaurant>
Gour...
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»
IG...
Slide 61Copyright 2017 @nuits_jp
疎結合の実現 その1 インターフェースの抽出
class Class Model
FindRestaurants
+ FindNearbyRestaurantsAsync()
GourmetService
+ SearchGourmetInfosAsync()
«interface»
IG...
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»
IG...
Slide 66Copyright 2017 @nuits_jp
疎結合の実現 その2 依存性の注入
疎結合の実現
Slide 67Copyright 2017 @nuits_jp
class Class Model
FindRestaurants
+ FindNearbyRestaurantsAsync()
GourmetService
+ ...
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. ソフトウェア内部と外部、部分と部分をどう結合し、どう
相互作用させるか
まとめ ①
...
1. 関心の分離
分割する際「関心の分離(SoC)」を実現すること
2. カプセル化
分割された対象は、依存先の関心を内部にカプセル化すること
3. 密結合と疎結合
分割された対象間は、密結合しないよう疎結合を保つこと
4. 疎結合を実現する代...
これらを実践するにあたり、いくつかのツールを紹介した
• UnitTestの実施
→ UnitTest Frameworkを利用しよう
• UnitTest時のMockについて
→ Mock生成をサポートするライブラリを使おう
• Depend...
ThankYou!
Any Questions?
Nächste SlideShare
Wird geladen in …5
×

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

2.131 Aufrufe

Veröffentlicht am

学生LT発表コンテンツ

Veröffentlicht in: Software
  • DOWNLOAD FULL BOOKS INTO AVAILABLE FORMAT ......................................................................................................................... ......................................................................................................................... 1.DOWNLOAD FULL PDF EBOOK here { https://tinyurl.com/y8nn3gmc } ......................................................................................................................... 1.DOWNLOAD FULL EPUB Ebook here { https://tinyurl.com/y8nn3gmc } ......................................................................................................................... 1.DOWNLOAD FULL doc Ebook here { https://tinyurl.com/y8nn3gmc } ......................................................................................................................... 1.DOWNLOAD FULL PDF EBOOK here { https://tinyurl.com/y8nn3gmc } ......................................................................................................................... 1.DOWNLOAD FULL EPUB Ebook here { https://tinyurl.com/y8nn3gmc } ......................................................................................................................... 1.DOWNLOAD FULL doc Ebook here { https://tinyurl.com/y8nn3gmc } ......................................................................................................................... ......................................................................................................................... ......................................................................................................................... .............. Browse by Genre Available eBooks ......................................................................................................................... Art, Biography, Business, Chick Lit, Children's, Christian, Classics, Comics, Contemporary, Cookbooks, Crime, Ebooks, Fantasy, Fiction, Graphic Novels, Historical Fiction, History, Horror, Humor And Comedy, Manga, Memoir, Music, Mystery, Non Fiction, Paranormal, Philosophy, Poetry, Psychology, Religion, Romance, Science, Science Fiction, Self Help, Suspense, Spirituality, Sports, Thriller, Travel, Young Adult,
       Antworten 
    Sind Sie sicher, dass Sie …  Ja  Nein
    Ihre Nachricht erscheint hier
  • DOWNLOAD FULL BOOKS INTO AVAILABLE FORMAT ......................................................................................................................... ......................................................................................................................... 1.DOWNLOAD FULL PDF EBOOK here { https://tinyurl.com/y8nn3gmc } ......................................................................................................................... 1.DOWNLOAD FULL EPUB Ebook here { https://tinyurl.com/y8nn3gmc } ......................................................................................................................... 1.DOWNLOAD FULL doc Ebook here { https://tinyurl.com/y8nn3gmc } ......................................................................................................................... 1.DOWNLOAD FULL PDF EBOOK here { https://tinyurl.com/y8nn3gmc } ......................................................................................................................... 1.DOWNLOAD FULL EPUB Ebook here { https://tinyurl.com/y8nn3gmc } ......................................................................................................................... 1.DOWNLOAD FULL doc Ebook here { https://tinyurl.com/y8nn3gmc } ......................................................................................................................... ......................................................................................................................... ......................................................................................................................... .............. Browse by Genre Available eBooks ......................................................................................................................... Art, Biography, Business, Chick Lit, Children's, Christian, Classics, Comics, Contemporary, Cookbooks, Crime, Ebooks, Fantasy, Fiction, Graphic Novels, Historical Fiction, History, Horror, Humor And Comedy, Manga, Memoir, Music, Mystery, Non Fiction, Paranormal, Philosophy, Poetry, Psychology, Religion, Romance, Science, Science Fiction, Self Help, Suspense, Spirituality, Sports, Thriller, Travel, Young Adult,
       Antworten 
    Sind Sie sicher, dass Sie …  Ja  Nein
    Ihre Nachricht erscheint hier

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

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

×