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.
Minimal Cake Pattern in Swift
kbkz.tech #11
吉村 優
https://twitter.com/_yyu_
http://qiita.com/yyu
https://github.com/y-yu
Se...
自己紹介
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 2 / 21
自己紹介
Scala 書 仕事 従事
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 2 / 21
自己紹介
Scala 書 仕事 従事
趣味 LATEX 暗号技術
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 2 / 21
自己紹介
Scala 書 仕事 従事
趣味 LATEX 暗号技術
Swift 最近 初心者
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 2 / 21
DI(Dependency Injection) ?
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 3 / 21
DI(Dependency Injection) ?
Dependency Injection ?
“ Dependency 実際 使
Injection Dependency 使
渡
Scala 最適 Dependency Injection...
DI
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 4 / 21
DI
“
Scala 最適 Dependency Injection 方法 考察 [1]
”
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 4 / 21
DI
“ 同士 疎結合
Scala 最適 Dependency Injection 方法 考察 [1]
”
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 4 / 21
DI
“ 同士 疎結合
動作 可能
Scala 最適 Dependency Injection 方法 考察 [1]
”
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016...
DI
“ 同士 疎結合
動作 可能
依存 化
可能
Scala 最適 Dependency Injection 方法 考察 [1]
”
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September ...
DI
“ 同士 疎結合
動作 可能
依存 化
可能
Scala 最適 Dependency Injection 方法 考察 [1]
”
?
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift Septembe...
Swift 代表的 DI手法
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 5 / 21
Swift 代表的 DI手法
Swift 代表的 DI 手法
“ Dependency Injection in Swift 2.x[2]
”
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift Septem...
Swift 代表的 DI手法
Swift 代表的 DI 手法
“ Swinject 用 動的 DI
Dependency Injection in Swift 2.x[2]
”
吉村 優 (@_yyu_) Minimal Cake Patter...
Swift 代表的 DI手法
Swift 代表的 DI 手法
“ Swinject 用 動的 DI
Cake Pattern 用 静的 DI
Dependency Injection in Swift 2.x[2]
”
吉村 優 (@_yyu_...
Swift 代表的 DI手法
Swift 代表的 DI 手法
“ Swinject 用 動的 DI
Cake Pattern 用 静的 DI
Dependency Injection in Swift 2.x[2]
”
以外 ?
吉村 優 (@...
Swift 代表的 DI手法
Swift 代表的 DI 手法
“ Swinject 用 動的 DI
Cake Pattern 用 静的 DI
Dependency Injection in Swift 2.x[2]
”
以外 ?
Cake Pa...
Example
機能 作
∗ 使 関数
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 6 / 21
Example
機能 作
HashPasswordService
鍵付 関数∗ 化 機能
∗ 使 関数
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 6 / 21
Example
機能 作
HashPasswordService
鍵付 関数∗ 化 機能
必要 機能
∗ 使 関数
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 6...
Example
機能 作
HashPasswordService
鍵付 関数∗ 化 機能
必要 機能
設定 読 込 機能
∗ 使 関数
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September ...
Example
機能 作
HashPasswordService
鍵付 関数∗ 化 機能
必要 機能
設定 読 込 機能
化 機能
∗ 使 関数
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift Septe...
Example
機能 作
HashPasswordService
鍵付 関数∗ 化 機能
必要 機能
設定 読 込 機能
化 機能
設定 読 込 ?
∗ 使 関数
吉村 優 (@_yyu_) Minimal Cake Pattern in Sw...
Example
考
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 7 / 21
Example
考
微妙
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 7 / 21
Example
考
微妙
設定 保存
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 7 / 21
Example
考
微妙
設定 保存
一方、 時 読 込
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 7 / 21
Example
考
微妙
設定 保存
一方、 時 読 込
IO 失敗 失敗 !
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 7 / 21
Example
考
微妙
設定 保存
一方、 時 読 込
IO 失敗 失敗 !
本実装 設定 読 込 、 時
使
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 7 ...
Example
考
微妙
設定 保存
一方、 時 読 込
IO 失敗 失敗 !
本実装 設定 読 込 、 時
使
二 実装 必要
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16,...
設定 読 込 機能
設定 読 込 部分
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 8 / 21
設定 読 込 機能
設定 読 込 部分
1 ReadConfigService 作成
protocol ReadConfigService {
var configName: String { get }
func readSalt() -> ...
設定 読 込 機能
設定 読 込 部分
1 ReadConfigService 作成
protocol ReadConfigService {
var configName: String { get }
func readSalt() -> ...
設定 読 込 機能
4 実装 ReadConfigServiceImpl 作成
class ReadConfigServiceImpl: ReadConfigService {
let configName: String
init(_ str...
設定 読 込 機能
4 実装 ReadConfigServiceImpl 作成
class ReadConfigServiceImpl: ReadConfigService {
let configName: String
init(_ str...
設定 読 込 機能
5 実装 ReadConfigServiceMockImpl 作成
class ReadConfigServiceMockImpl: ReadConfigService {
var configName: String = ...
設定 読 込 機能
5 実装 ReadConfigServiceMockImpl 作成
class ReadConfigServiceMockImpl: ReadConfigService {
var configName: String = ...
設定 読 込 機能
5 実装 ReadConfigServiceMockImpl 作成
class ReadConfigServiceMockImpl: ReadConfigService {
var configName: String = ...
設定 読 込 機能
6 依存 示 UsesReadConfigService
作成
protocol UsesReadConfigService {
var readConfigService: ReadConfigService { get ...
設定 読 込 機能
6 依存 示 UsesReadConfigService
作成
protocol UsesReadConfigService {
var readConfigService: ReadConfigService { get ...
化 機能
次 、 化 部分 作成
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 12 / 21
化 機能
次 、 化 部分 作成
1 作成
protocol HashPasswordService: UsesReadConfigService {
func hashBySha1(password: String) -> String
}
...
化 機能
次 、 化 部分 作成
1 作成
protocol HashPasswordService: UsesReadConfigService {
func hashBySha1(password: String) -> String
}
...
化 機能
次 、 化 部分 作成
1 作成
protocol HashPasswordService: UsesReadConfigService {
func hashBySha1(password: String) -> String
}
...
化 機能
1 実装 作成
class HashPasswordSerivceImpl: HashPasswordService {
let readConfigService: ReadConfigService
init(_ configFi...
化 機能
1 実装 作成
class HashPasswordSerivceImpl: HashPasswordService {
let readConfigService: ReadConfigService
init(_ configFi...
化 機能
1 実装 作成
class HashPasswordSerivceImpl: HashPasswordService {
let readConfigService: ReadConfigService
init(_ configFi...
化 機能
1 実装 作成
class HashPasswordSerivceImpl: HashPasswordService {
let readConfigService: ReadConfigService
init(_ configFi...
化 機能
11 作成
class HashPasswordServiceMockImpl: HashPasswordService {
var readConfigService: ReadConfigService =
ReadConfigS...
化 機能
11 作成
class HashPasswordServiceMockImpl: HashPasswordService {
var readConfigService: ReadConfigService =
ReadConfigS...
化 機能
11 作成
class HashPasswordServiceMockImpl: HashPasswordService {
var readConfigService: ReadConfigService =
ReadConfigS...
作成 HashPasswordService 作
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 15 / 21
作成 HashPasswordService 作
import XCTest
@testable import MCPExample
class HashPasswordServiceTest: XCTestCase {
// 用 実 装 使
...
作成 HashPasswordService 作
import XCTest
@testable import MCPExample
class HashPasswordServiceTest: XCTestCase {
// 用 実 装 使
...
DI 漏
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 16 / 21
DI 漏
次 DI 忘
class HashPasswordServiceNgImpl: HashPasswordService {
func hashBySha1(password: String) -> String {
return "n...
DI 漏
次 DI 忘
class HashPasswordServiceNgImpl: HashPasswordService {
func hashBySha1(password: String) -> String {
return "n...
DI 漏
次 DI 忘
class HashPasswordServiceNgImpl: HashPasswordService {
func hashBySha1(password: String) -> String {
return "n...
DI 漏
次 DI 忘
class HashPasswordServiceNgImpl: HashPasswordService {
func hashBySha1(password: String) -> String {
return "n...
DI 漏
次 依存 増 、DI 漏
protocol CreateUserService:
UsesSessionService,
UsesUserRepository,
UsesClock,
UsesApplicationLogger,
Us...
DI 漏
次 依存 増 、DI 漏
protocol CreateUserService:
UsesSessionService,
UsesUserRepository,
UsesClock,
UsesApplicationLogger,
Us...
DI 漏
次 依存 増 、DI 漏
protocol CreateUserService:
UsesSessionService,
UsesUserRepository,
UsesClock,
UsesApplicationLogger,
Us...
Minimal Cake Pattern
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 18 / 21
Minimal Cake Pattern
静的 、DI 漏 検出
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 18 / 21
Minimal Cake Pattern
静的 、DI 漏 検出
DI 特別 必要
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 18 / 21
Minimal Cake Pattern
静的 、DI 漏 検出
DI 特別 必要
普通 Cake Pattern 比
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016...
目次
1 自己紹介
2 Dependency Injection ?
3 DI
4 Swift 代表的 DI 手法
5 Example
設定 読 込 機能
化 機能
DI 漏
6
吉村 優 (@_yyu_) Minimal Cake Patte...
参考文献
[1] 結城清太郎.
Scala 最適 dependency injection 方法 考察
~ 生産性 高 ~,
2015.
[2] 人間.
Dependency injection in swift 2.x, 2016.
[3] ...
Thank you for listening!
Any question?
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 21 / 21
Upcoming SlideShare
Loading in …5
×

Minimal Cake Pattern in Swift

1,829 views

Published on

スライドのソースコード:
https://github.com/y-yu/minimal-cake-pattern-swift-slide

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Minimal Cake Pattern in Swift

  1. 1. Minimal Cake Pattern in Swift kbkz.tech #11 吉村 優 https://twitter.com/_yyu_ http://qiita.com/yyu https://github.com/y-yu September 16, 2016 (Commit ID: 5acb721) 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 1 / 21
  2. 2. 自己紹介 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 2 / 21
  3. 3. 自己紹介 Scala 書 仕事 従事 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 2 / 21
  4. 4. 自己紹介 Scala 書 仕事 従事 趣味 LATEX 暗号技術 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 2 / 21
  5. 5. 自己紹介 Scala 書 仕事 従事 趣味 LATEX 暗号技術 Swift 最近 初心者 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 2 / 21
  6. 6. DI(Dependency Injection) ? 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 3 / 21
  7. 7. DI(Dependency Injection) ? Dependency Injection ? “ Dependency 実際 使 Injection Dependency 使 渡 Scala 最適 Dependency Injection 方法 考察 [1] ” 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 3 / 21
  8. 8. DI 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 4 / 21
  9. 9. DI “ Scala 最適 Dependency Injection 方法 考察 [1] ” 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 4 / 21
  10. 10. DI “ 同士 疎結合 Scala 最適 Dependency Injection 方法 考察 [1] ” 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 4 / 21
  11. 11. DI “ 同士 疎結合 動作 可能 Scala 最適 Dependency Injection 方法 考察 [1] ” 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 4 / 21
  12. 12. DI “ 同士 疎結合 動作 可能 依存 化 可能 Scala 最適 Dependency Injection 方法 考察 [1] ” 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 4 / 21
  13. 13. DI “ 同士 疎結合 動作 可能 依存 化 可能 Scala 最適 Dependency Injection 方法 考察 [1] ” ? 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 4 / 21
  14. 14. Swift 代表的 DI手法 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 5 / 21
  15. 15. Swift 代表的 DI手法 Swift 代表的 DI 手法 “ Dependency Injection in Swift 2.x[2] ” 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 5 / 21
  16. 16. Swift 代表的 DI手法 Swift 代表的 DI 手法 “ Swinject 用 動的 DI Dependency Injection in Swift 2.x[2] ” 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 5 / 21
  17. 17. Swift 代表的 DI手法 Swift 代表的 DI 手法 “ Swinject 用 動的 DI Cake Pattern 用 静的 DI Dependency Injection in Swift 2.x[2] ” 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 5 / 21
  18. 18. Swift 代表的 DI手法 Swift 代表的 DI 手法 “ Swinject 用 動的 DI Cake Pattern 用 静的 DI Dependency Injection in Swift 2.x[2] ” 以外 ? 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 5 / 21
  19. 19. Swift 代表的 DI手法 Swift 代表的 DI 手法 “ Swinject 用 動的 DI Cake Pattern 用 静的 DI Dependency Injection in Swift 2.x[2] ” 以外 ? Cake Pattern 仲間 “Minimal Cake Pattern” 紹介! 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 5 / 21
  20. 20. Example 機能 作 ∗ 使 関数 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 6 / 21
  21. 21. Example 機能 作 HashPasswordService 鍵付 関数∗ 化 機能 ∗ 使 関数 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 6 / 21
  22. 22. Example 機能 作 HashPasswordService 鍵付 関数∗ 化 機能 必要 機能 ∗ 使 関数 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 6 / 21
  23. 23. Example 機能 作 HashPasswordService 鍵付 関数∗ 化 機能 必要 機能 設定 読 込 機能 ∗ 使 関数 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 6 / 21
  24. 24. Example 機能 作 HashPasswordService 鍵付 関数∗ 化 機能 必要 機能 設定 読 込 機能 化 機能 ∗ 使 関数 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 6 / 21
  25. 25. Example 機能 作 HashPasswordService 鍵付 関数∗ 化 機能 必要 機能 設定 読 込 機能 化 機能 設定 読 込 ? ∗ 使 関数 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 6 / 21
  26. 26. Example 考 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 7 / 21
  27. 27. Example 考 微妙 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 7 / 21
  28. 28. Example 考 微妙 設定 保存 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 7 / 21
  29. 29. Example 考 微妙 設定 保存 一方、 時 読 込 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 7 / 21
  30. 30. Example 考 微妙 設定 保存 一方、 時 読 込 IO 失敗 失敗 ! 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 7 / 21
  31. 31. Example 考 微妙 設定 保存 一方、 時 読 込 IO 失敗 失敗 ! 本実装 設定 読 込 、 時 使 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 7 / 21
  32. 32. Example 考 微妙 設定 保存 一方、 時 読 込 IO 失敗 失敗 ! 本実装 設定 読 込 、 時 使 二 実装 必要 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 7 / 21
  33. 33. 設定 読 込 機能 設定 読 込 部分 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 8 / 21
  34. 34. 設定 読 込 機能 設定 読 込 部分 1 ReadConfigService 作成 protocol ReadConfigService { var configName: String { get } func readSalt() -> String } 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 8 / 21
  35. 35. 設定 読 込 機能 設定 読 込 部分 1 ReadConfigService 作成 protocol ReadConfigService { var configName: String { get } func readSalt() -> String } 2 実装 投入 extension ReadConfigService { private func readFile() -> Optional<String> { if { return Optional.Some( 中 身) } else { return Optional.None } } } 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 8 / 21
  36. 36. 設定 読 込 機能 4 実装 ReadConfigServiceImpl 作成 class ReadConfigServiceImpl: ReadConfigService { let configName: String init(_ str: String) { configName = str } func readSalt() -> String { // 本 当 … … return readFile()! } } 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 9 / 21
  37. 37. 設定 読 込 機能 4 実装 ReadConfigServiceImpl 作成 class ReadConfigServiceImpl: ReadConfigService { let configName: String init(_ str: String) { configName = str } func readSalt() -> String { // 本 当 … … return readFile()! } } 設定 引数 受 取 、 読 込 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 9 / 21
  38. 38. 設定 読 込 機能 5 実装 ReadConfigServiceMockImpl 作成 class ReadConfigServiceMockImpl: ReadConfigService { var configName: String = "dummy" let dummySalt: String init(_ salt: String) { dummySalt = salt } func readSalt() -> String { return dummySalt } } 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 10 / 21
  39. 39. 設定 読 込 機能 5 実装 ReadConfigServiceMockImpl 作成 class ReadConfigServiceMockImpl: ReadConfigService { var configName: String = "dummy" let dummySalt: String init(_ salt: String) { dummySalt = salt } func readSalt() -> String { return dummySalt } } 設定 、 引 数 与 値 必 返 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 10 / 21
  40. 40. 設定 読 込 機能 5 実装 ReadConfigServiceMockImpl 作成 class ReadConfigServiceMockImpl: ReadConfigService { var configName: String = "dummy" let dummySalt: String init(_ salt: String) { dummySalt = salt } func readSalt() -> String { return dummySalt } } 設定 、 引 数 与 値 必 返 、設定 ! 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 10 / 21
  41. 41. 設定 読 込 機能 6 依存 示 UsesReadConfigService 作成 protocol UsesReadConfigService { var readConfigService: ReadConfigService { get } } 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 11 / 21
  42. 42. 設定 読 込 機能 6 依存 示 UsesReadConfigService 作成 protocol UsesReadConfigService { var readConfigService: ReadConfigService { get } } 使 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 11 / 21
  43. 43. 化 機能 次 、 化 部分 作成 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 12 / 21
  44. 44. 化 機能 次 、 化 部分 作成 1 作成 protocol HashPasswordService: UsesReadConfigService { func hashBySha1(password: String) -> String } 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 12 / 21
  45. 45. 化 機能 次 、 化 部分 作成 1 作成 protocol HashPasswordService: UsesReadConfigService { func hashBySha1(password: String) -> String } ReadConfigService 依存 示 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 12 / 21
  46. 46. 化 機能 次 、 化 部分 作成 1 作成 protocol HashPasswordService: UsesReadConfigService { func hashBySha1(password: String) -> String } ReadConfigService 依存 示 2 実装 投入 extension HashPasswordService { func hashBySha1(password: String) -> String { let data = password + readConfigService.readSalt() // return SHA1(data).toString() } } 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 12 / 21
  47. 47. 化 機能 1 実装 作成 class HashPasswordSerivceImpl: HashPasswordService { let readConfigService: ReadConfigService init(_ configFile: String) { readConfigService = ReadConfigServiceImpl(configFile) } } 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 13 / 21
  48. 48. 化 機能 1 実装 作成 class HashPasswordSerivceImpl: HashPasswordService { let readConfigService: ReadConfigService init(_ configFile: String) { readConfigService = ReadConfigServiceImpl(configFile) } } ReadConfigService 実装 DI 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 13 / 21
  49. 49. 化 機能 1 実装 作成 class HashPasswordSerivceImpl: HashPasswordService { let readConfigService: ReadConfigService init(_ configFile: String) { readConfigService = ReadConfigServiceImpl(configFile) } } ReadConfigService 実装 DI 2 実装 作成 class HashPasswordServiceTestImpl: HashPasswordService { var readConfigService: ReadConfigService = ReadConfigServiceMockImpl("dummySalt") } 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 13 / 21
  50. 50. 化 機能 1 実装 作成 class HashPasswordSerivceImpl: HashPasswordService { let readConfigService: ReadConfigService init(_ configFile: String) { readConfigService = ReadConfigServiceImpl(configFile) } } ReadConfigService 実装 DI 2 実装 作成 class HashPasswordServiceTestImpl: HashPasswordService { var readConfigService: ReadConfigService = ReadConfigServiceMockImpl("dummySalt") } ReadConfigService 実装 DI 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 13 / 21
  51. 51. 化 機能 11 作成 class HashPasswordServiceMockImpl: HashPasswordService { var readConfigService: ReadConfigService = ReadConfigServiceMockImpl("dummySalt") func hashBySha1(password: String) -> String { return password + "_dummySalt" } } 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 14 / 21
  52. 52. 化 機能 11 作成 class HashPasswordServiceMockImpl: HashPasswordService { var readConfigService: ReadConfigService = ReadConfigServiceMockImpl("dummySalt") func hashBySha1(password: String) -> String { return password + "_dummySalt" } } 値 計算 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 14 / 21
  53. 53. 化 機能 11 作成 class HashPasswordServiceMockImpl: HashPasswordService { var readConfigService: ReadConfigService = ReadConfigServiceMockImpl("dummySalt") func hashBySha1(password: String) -> String { return password + "_dummySalt" } } 値 計算 実装 変更 、依存 落 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 14 / 21
  54. 54. 作成 HashPasswordService 作 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 15 / 21
  55. 55. 作成 HashPasswordService 作 import XCTest @testable import MCPExample class HashPasswordServiceTest: XCTestCase { // 用 実 装 使 var sut: HashPasswordService = HashPasswordServiceTestImpl() func testHashBySha1() { XCTAssert(sut.hashBySha1("hoge") == " ba5b31f489676c1545a9f175867274c8c21b8f8b") } } 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 15 / 21
  56. 56. 作成 HashPasswordService 作 import XCTest @testable import MCPExample class HashPasswordServiceTest: XCTestCase { // 用 実 装 使 var sut: HashPasswordService = HashPasswordServiceTestImpl() func testHashBySha1() { XCTAssert(sut.hashBySha1("hoge") == " ba5b31f489676c1545a9f175867274c8c21b8f8b") } } 設定 読 ! 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 15 / 21
  57. 57. DI 漏 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 16 / 21
  58. 58. DI 漏 次 DI 忘 class HashPasswordServiceNgImpl: HashPasswordService { func hashBySha1(password: String) -> String { return "ng" } } 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 16 / 21
  59. 59. DI 漏 次 DI 忘 class HashPasswordServiceNgImpl: HashPasswordService { func hashBySha1(password: String) -> String { return "ng" } } HashPasswordService.swift:41:7: Type 'HashPasswordServiceNgImpl' does not conform to protocol 'UsesReadConfigService' 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 16 / 21
  60. 60. DI 漏 次 DI 忘 class HashPasswordServiceNgImpl: HashPasswordService { func hashBySha1(password: String) -> String { return "ng" } } HashPasswordService.swift:41:7: Type 'HashPasswordServiceNgImpl' does not conform to protocol 'UsesReadConfigService' 実行前 DI 漏 検出! 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 16 / 21
  61. 61. DI 漏 次 DI 忘 class HashPasswordServiceNgImpl: HashPasswordService { func hashBySha1(password: String) -> String { return "ng" } } HashPasswordService.swift:41:7: Type 'HashPasswordServiceNgImpl' does not conform to protocol 'UsesReadConfigService' 実行前 DI 漏 検出! 依存 増 効果的! 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 16 / 21
  62. 62. DI 漏 次 依存 増 、DI 漏 protocol CreateUserService: UsesSessionService, UsesUserRepository, UsesClock, UsesApplicationLogger, UsesUserConfig, UsesRandomGenerator { func create(user: User) -> Future<Session> } 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 17 / 21
  63. 63. DI 漏 次 依存 増 、DI 漏 protocol CreateUserService: UsesSessionService, UsesUserRepository, UsesClock, UsesApplicationLogger, UsesUserConfig, UsesRandomGenerator { func create(user: User) -> Future<Session> } 大 起動 大変! 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 17 / 21
  64. 64. DI 漏 次 依存 増 、DI 漏 protocol CreateUserService: UsesSessionService, UsesUserRepository, UsesClock, UsesApplicationLogger, UsesUserConfig, UsesRandomGenerator { func create(user: User) -> Future<Session> } 大 起動 大変! 起動 DI 漏 検出 便利! 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 17 / 21
  65. 65. Minimal Cake Pattern 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 18 / 21
  66. 66. Minimal Cake Pattern 静的 、DI 漏 検出 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 18 / 21
  67. 67. Minimal Cake Pattern 静的 、DI 漏 検出 DI 特別 必要 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 18 / 21
  68. 68. Minimal Cake Pattern 静的 、DI 漏 検出 DI 特別 必要 普通 Cake Pattern 比 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 18 / 21
  69. 69. 目次 1 自己紹介 2 Dependency Injection ? 3 DI 4 Swift 代表的 DI 手法 5 Example 設定 読 込 機能 化 機能 DI 漏 6 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 19 / 21
  70. 70. 参考文献 [1] 結城清太郎. Scala 最適 dependency injection 方法 考察 ~ 生産性 高 ~, 2015. [2] 人間. Dependency injection in swift 2.x, 2016. [3] 吉村優. Swift minimal cake pattern, 2016. [4] Takashi Tayama. Minimal cake pattern 作法, 2015. 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 20 / 21
  71. 71. Thank you for listening! Any question? 吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 21 / 21

×