8. DI
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 4 / 21
9. DI
“
Scala 最適 Dependency Injection 方法 考察 [1]
”
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 4 / 21
10. DI
“ 同士 疎結合
Scala 最適 Dependency Injection 方法 考察 [1]
”
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 4 / 21
11. DI
“ 同士 疎結合
動作 可能
Scala 最適 Dependency Injection 方法 考察 [1]
”
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 4 / 21
12. DI
“ 同士 疎結合
動作 可能
依存 化
可能
Scala 最適 Dependency Injection 方法 考察 [1]
”
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 4 / 21
13. DI
“ 同士 疎結合
動作 可能
依存 化
可能
Scala 最適 Dependency Injection 方法 考察 [1]
”
?
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 4 / 21
14. Swift 代表的 DI手法
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 5 / 21
15. Swift 代表的 DI手法
Swift 代表的 DI 手法
“ Dependency Injection in Swift 2.x[2]
”
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 5 / 21
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. 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. 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. 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. Example
機能 作
∗ 使 関数
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 6 / 21
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. 作成 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. DI 漏
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 16 / 21
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. 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. 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. 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. 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. 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. 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
66. Minimal Cake Pattern
静的 、DI 漏 検出
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 18 / 21
67. Minimal Cake Pattern
静的 、DI 漏 検出
DI 特別 必要
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 18 / 21
68. Minimal Cake Pattern
静的 、DI 漏 検出
DI 特別 必要
普通 Cake Pattern 比
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 18 / 21
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. 参考文献
[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. Thank you for listening!
Any question?
吉村 優 (@_yyu_) Minimal Cake Pattern in Swift September 16, 2016 21 / 21