Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

20160526 依存関係逆転の原則

13,807 views

Published on

#7 でがらし会

Published in: Software
  • Hi there! I just wanted to share a list of sites that helped me a lot during my studies: .................................................................................................................................... www.EssayWrite.best - Write an essay .................................................................................................................................... www.LitReview.xyz - Summary of books .................................................................................................................................... www.Coursework.best - Online coursework .................................................................................................................................... www.Dissertations.me - proquest dissertations .................................................................................................................................... www.ReMovie.club - Movies reviews .................................................................................................................................... www.WebSlides.vip - Best powerpoint presentations .................................................................................................................................... www.WritePaper.info - Write a research paper .................................................................................................................................... www.EddyHelp.com - Homework help online .................................................................................................................................... www.MyResumeHelp.net - Professional resume writing service .................................................................................................................................. www.HelpWriting.net - Help with writing any papers ......................................................................................................................................... Save so as not to lose
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Dating for everyone is here: ❶❶❶ http://bit.ly/2F90ZZC ❶❶❶
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Sex in your area is here: ❤❤❤ http://bit.ly/2F90ZZC ❤❤❤
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

20160526 依存関係逆転の原則

  1. 1. 依存関係逆転の原則 黒澤 慎太郎
  2. 2. 自己紹介 省略 ▸私が来た
  3. 3. 前回までの話
  4. 4. 某社の設計はこうす ればいいんじゃない ? 私 ガンジーな私
  5. 5. で?コードは? まさかり担いだKowillさん まさかり担いだKOWILLさん
  6. 6. 退路は 絶たれた
  7. 7. 全部は勘弁してください フレームワーク作るプロジェクトです? ▸全部やると、フレームワークを一つ作り直す巨大なプロジ ェクトになる気がする ▸しかも旨味がなさそう ▸重要なところだけちょびっとやる ▸スキルアップに繋がるように汎用的にやる ▸本物のコードを持ち出すとコンプライアンス的にやばそう なので脳内補完お願いします
  8. 8. 依存関係逆転 の原則
  9. 9. BEFORE アプリ作ってるとこんな依存関係になる UI層 ロジック層 データアクセス層
  10. 10. AFTER 依存関係逆転の原則を適用 UI層 ロジック層 データアクセス層
  11. 11. なんということでしょう 依存関係逆転の原則 ▸上位モジュールは下位モジュールに依存してはならない。 ▸上位モジュールも下位モジュールも、抽象に依存するべき 。 ▸抽象は、実装の詳細に依存してはならない。 ▸実装の詳細が抽象に依存するべき。
  12. 12. なんのことだ かわからない
  13. 13. さあ! コードだ!
  14. 14. コードですよKOWILLさん ▸C#で書きました。 ▸説明のため、非常に簡素です。 ▸ロジック層とデータクセス層の間だけに原則を適用したサ ンプルです。
  15. 15. 人は誰もがプロトタイプ サンプルプログラムについて ▸ユーザーの誕生日から、現在の年齢を計算するプログラム ▸ユーザの情報は、永続化して保存できる
  16. 16. 原則適用前
  17. 17. 適用前 メインルーチン public void Main () { var user = new User (DateTime.Now); Console.WriteLine("あなたの年齢は " + user.Age.ToString() + " です。"); user.Save (user); }
  18. 18. USER USER CLASS public class User { private DateTime _birthday; public User (DateTime birthday) { _birthday = birthday; } public int Age{ get { GetAge (); } } private int GetAge(){ // 計算 return 9; // 永遠の9歳 } public void Save(){ var repogitory = new UserRepogitory (); repogitory.Save (this); } }
  19. 19. REPOSITORY USER REPOSITORY CLASS public class UserRepogitory { public void Save(User user){ // Insert Database } }
  20. 20. データアクセスDLL ロジックDLL 原則適用前 クラス図 USER USER REPOSITORY
  21. 21. 抽象に 依存する
  22. 22. データアクセスDLL ロジックDLL 原則適用前 クラス図 USER USER REPOSITORY USER REPOSITORY INTERFACE
  23. 23. インターフェース追加 USER REPOSITORY INTERFASE public interface IUserRepogitory { void Save(User user); }
  24. 24. インタフェースを使う USER public class User { private DateTime _birthday; public User (DateTime birthday) { _birthday = birthday; } public int Age{ get { return GetAge (); } } private int GetAge(){ // 計算 return 9; // 永遠の9歳 } public void Save(){ IUserRepogitory repogitory = new UserRepogitory (); repogitory.Save (this); } }
  25. 25. インタフェースを使う USER public class User { private DateTime _birthday; public User (DateTime birthday) { _birthday = birthday; } public int Age{ get { return GetAge (); } } private int GetAge(){ // 計算 return 9; // 永遠の9歳 } public void Save(){ IUserRepogitory repogitory = new UserRepogitory (); repogitory.Save (this); } } あれ?結局UserRepogitoryに依存している?
  26. 26. データアクセスDLL ロジックDLL 現在の依存関係 クラス図 USER USER REPOSITORY USER REPOSITORY INTERFACE
  27. 27. 依存性の注入
  28. 28. 依存の話ばっかりだな 依存性の注入(DEPENDENCY INJECTION) ▸依存関係を、クラスやソースコードの外側から注入する ▸ソフトウェアパターン
  29. 29. 依存性の注入 USER public class User { private IUserRepogitory _repogitory; private DateTime _birthday; public User (DateTime birthday,IUserRepogitory repogitory) { _repogitory = repogitory; _birthday = birthday; } public int Age{ get { return GetAge (); } } private int GetAge(){ // 計算 return 9; // 永遠の9歳 } public void Save(){ _repogitory.Save (this); } }
  30. 30. 依存性の注入 USER public class User { private IUserRepogitory _repogitory; private DateTime _birthday; public User (DateTime birthday,IUserRepogitory repogitory) { _repogitory = repogitory; _birthday = birthday; } public int Age{ get { return GetAge (); } } private int GetAge(){ // 計算 return 9; // 永遠の9歳 } public void Save(){ _repogitory.Save (this); } } フィールド変数にする
  31. 31. 依存性の注入 USER public class User { private IUserRepogitory _repogitory; private DateTime _birthday; public User (DateTime birthday,IUserRepogitory repogitory) { _repogitory = repogitory; _birthday = birthday; } public int Age{ get { return GetAge (); } } private int GetAge(){ // 計算 return 9; // 永遠の9歳 } public void Save(){ _repogitory.Save (this); } } コンストラクタで実装オブジェクトを受け取る
  32. 32. 依存性の注入 USER public class User { private IUserRepogitory _repogitory; private DateTime _birthday; public User (DateTime birthday,IUserRepogitory repogitory) { _repogitory = repogitory; _birthday = birthday; } public int Age{ get { return GetAge (); } } private int GetAge(){ // 計算 return 9; // 永遠の9歳 } public void Save(){ _repogitory.Save (this); } } フィールド変数に設定
  33. 33. データアクセスDLL ロジックDLL ちゃんとこうなりました クラス図 USER USER REPOSITORY USER REPOSITORY INTERFACE
  34. 34. なんということでしょう 依存関係逆転の原則 ▸上位モジュールは下位モジュールに依存してはならない。 ▸上位モジュールも下位モジュールも、抽象に依存するべき 。 ▸抽象は、実装の詳細に依存してはならない。 ▸実装の詳細が抽象に依存するべき。 達成!
  35. 35. 下位モジュールから 上位モジュールに 依存する
  36. 36. データアクセスDLL ロジックDLL 依存の方向 クラス図 USER USER REPOSITORY USER REPOSITORY INTERFACE 現在は、上位から下位に依存している
  37. 37. データアクセスDLL ロジックDLL 依存の方向 クラス図 USER USER REPOSITORY USER REPOSITORY INTERFACE インターフェースをロジック側でもつ
  38. 38. なんということでしょう 依存関係逆転の原則 ▸上位モジュールは下位モジュールに依存してはならない。 ▸上位モジュールも下位モジュールも、抽象に依存するべき 。 ▸抽象は、実装の詳細に依存してはならない。 ▸実装の詳細が抽象に依存するべき。 全部達成!
  39. 39. USERクラスは、 データアクセスと どう紐づくのか
  40. 40. データアクセスDLL ロジックDLL 依存の方向 クラス図 USER USER REPOSITORY USER REPOSITORY INTERFACE USERクラスは、データアクセスと完全に分離している
  41. 41. 依存性の注入 USER public class User { private IUserRepogitory _repogitory; private DateTime _birthday; public User (DateTime birthday,IUserRepogitory repogitory) { _repogitory = repogitory; _birthday = birthday; } public int Age{ get { return GetAge (); } } private int GetAge(){ // 計算 return 9; // 永遠の9歳 } public void Save(){ _repogitory.Save (this); } } 誰がこのフィールド変数に実装オブジェクトを設定するのか
  42. 42. USERクラスは、 データアクセスを 知ってはいけない
  43. 43. 依存性の注入を もう一度見てみよう
  44. 44. 依存の話をもう一度 依存性の注入(DEPENDENCY INJECTION) ▸依存関係を、クラスやソースコードの外側から注入する ▸ソフトウェアパターン
  45. 45. 依存の話をもう一度 依存性の注入(DEPENDENCY INJECTION) ▸依存関係を、クラスやソースコードの外側から注入する ▸ソフトウェアパターン 外側とは何を指すのか?
  46. 46. 依存性を注入する 方法は 幾つかある
  47. 47. ここでは メインルーチンで やってみよう
  48. 48. データアクセスDLL ロジックDLL 依存の方向 クラス図 USER USER REPOSITORY USER REPOSITORY INTERFACE アプリケーションEXE アプリは、ロジックとデータアクセスを両方とも知っている
  49. 49. 例えば メインルーチンで依存性注入の例 public void Main () { var repogitory = new UserRepogitory (); var user = new User (DateTime.Now, repogitory); Console.WriteLine("あなたの年齢は " + user.Age.ToString() + " です。"); user.Save (user); }
  50. 50. 例えば メインルーチンで依存性注入の例 public void Main () { var repogitory = new UserRepogitory (); var user = new User (DateTime.Now, repogitory); Console.WriteLine("あなたの年齢は " + user.Age.ToString() + " です。"); user.Save (user); } どのデータアクセスを使うか
  51. 51. 例えば メインルーチンで依存性注入の例 public void Main () { var repogitory = new UserRepogitory (); var user = new User (DateTime.Now, repogitory); Console.WriteLine("あなたの年齢は " + user.Age.ToString() + " です。"); user.Save (user); } USERクラスが使うデータアクセスを指定
  52. 52. 例えば メインルーチンで依存性注入の例 public void Main () { var repogitory = new UserRepogitory (); var user = new User (DateTime.Now, repogitory); Console.WriteLine("あなたの年齢は " + user.Age.ToString() + " です。"); user.Save (user); } データアクセスを使ってオブジェクトを永続化
  53. 53. で、これが 何の役にたつ ?
  54. 54. 例えばこういうとき ロジックはそのままでデータストアが異なる ▸ロジックはそのまま使いたいが、データ保存が異なる複数 のアプリケーション ▸ちょっとしたロジック確認のため、データベースを用意す るのはコストが高い ▸ユニットテストでデータベースを用意するのはコストが高 い
  55. 55. LOCAL SQLSERVER データアクセス DLL ロジックDLL 依存の方向 クラス図 アプリケーションEXE アプリケーション2EXE CLOUD SQLSERVER データアクセス DLL
  56. 56. クラウドコンピューティング アプリケーション2EXEのメインルーチン public void Main () { var repogitory = new UserRepogitoryCloud (); var user = new User (DateTime.Now, repogitory); Console.WriteLine("あなたの年齢は " + user.Age.ToString() + " です。"); user.Save (user); } 別データベースへのアクセス
  57. 57. ここまで来てやっと恩恵を受けることができる 依存関係を排除した結果 ▸全く同じアプリケーションで、様々な環境で動かせるアプ リができる ▸例えば、 ▸WindowsFormアプリケーション ▸ASP.NET MVCのWebサービス ▸Windows Phoneアプリ
  58. 58. まとめ
  59. 59. まとめ 依存関係逆転の原則 ▸抽象度を高くする ▸モジュールの依存関係の方向は重要 ▸適切なモジュール関係を作れば、データベースが異なるた びにif文を入れる必要はない。 ▸これはデータベースアクセスに限った話ではない
  60. 60. まとめ2 依存関係逆転の原則 ▸if文がなくなるということはテストケースが少なくなる ▸if文ネストもなくなる ▸モジュールが別になるので修正時に影響度を調べる必要な し ▸保守性の向上、開発の効率化などいいことづくめ?
  61. 61. いいことづく めではない
  62. 62. まとめ3 依存関係逆転の原則 ▸確実に複雑性は増す ▸複雑性を増してでも、データアクセスは依存を排除すべき ▸なんでもかんでもインタフェースで抽象化するとコードが 複雑化し、混沌となる ▸抽象度を上げる時は、必ず必要最小限にすること
  63. 63. ここでまでの話で、 原則・パターンの力が わかっていただけたは ず
  64. 64. 力こそPOWER ここまでの話 ▸ここまでで、出てきたもの ▸依存性の注入パターン ▸依存関係逆転の原則 ▸この例での中でも、はっきりと明記はしていないが、オブ ジェクト指向における原則・パターンは他にも出てきてい る
  65. 65. テキスト 大事な話 ▸原則・パターンは、個々に適用するよりも組み合わせた方 が効果が高い ▸状況や要求に合わせて、適切な原則やパターンを組み合わ せていく ▸その選択と決定に実力とセンスが出てくる ▸原則・パターンの知識量 ▸実戦経験
  66. 66. 知識を つけていこう
  67. 67. 凡人の 凡人による 凡人のための デザインパターン
  68. 68. シリーズ化決定 凡人の、凡人による、ぼんじ(RY ▸次から、パターンを少しづつLTしていきます ▸まずはGofのパターンから ▸なぜこんな回りくどいかというと、「パターンを教科書的に覚えて いっても使える知識になりにくい」から ▸特にGofのデザインパターンは本読んだだけって人がたくさんい ると思います。 ▸まずは、「パターンってこんなに凄いんだぜ!」ってやりたかった 。
  69. 69. その他お知らせ 技術書オンリーイベント ▸技術系書籍の同人イベント ▸https://techbookfest.github.io/
  70. 70. ご静聴 ありがとう ございました

×