20. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Swift移行への基本戦略
1. 既存コードの挙動を破壊しないこと
14
21. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Swift移行への基本戦略
1. 既存コードの挙動を破壊しないこと
2. 既存objcコードの修正は極力Swiftで行うこと
14
22. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Swift移行への基本戦略
1. 既存コードの挙動を破壊しないこと
2. 既存objcコードの修正は極力Swiftで行うこと
3. 段階的に徐々に移行すすめること
14
23. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Swift移行への基本戦略
1. 既存コードの挙動を破壊しないこと
2. 既存objcコードの修正は極力Swiftで行うこと
3. 段階的に徐々に移行すすめること
4. Swiftらしいコードを書いて確実に品質を高めること
14
24. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Swift移行への基本戦略
1. 既存コードの挙動を破壊しないこと
2. 既存objcコードの修正は極力Swiftで行うこと
3. 段階的に徐々に移行すすめること
4. Swiftらしいコードを書いて確実に品質を高めること
5. 局所的な妥協は許容
14
25. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Swift移行への基本戦略
1. 既存コードの挙動を破壊しないこと
2. 既存objcコードの修正は極力Swiftで行うこと
3. 段階的に徐々に移行すすめること
4. Swiftらしいコードを書いて確実に品質を高めること
5. 局所的な妥協は許容
14
→Mix-and-Match
26. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Mix and Match
ひとつのプロジェクトでObjective-CとSwiftを混合して使うための機能
15
h)ps://developer.apple.com/library/ios/documenta<on/Swi7/Conceptual/BuildingCocoaApps/MixandMatch.html
27. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Mix and Matchを使ったSwift移行パターン
16
28. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Mix and Matchを使ったSwift移行パターン
16
① 延命パターン
② ご新規パターン
③ 切り出しパターン
④ ブリッジパターン
⑤ extensionパターン
⑥ 暴露パターン
⑦ 乗っ取りパターン
⑧ 写経パターン
29. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Mix and Matchを使ったSwift移行パターン
16
① 延命パターン
② ご新規パターン
③ 切り出しパターン
④ ブリッジパターン
⑤ extensionパターン
⑥ 暴露パターン
⑦ 乗っ取りパターン
⑧ 写経パターン
パターン
≒
武道における形
30. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Mix and Matchを使ったSwift移行パターン
16
① 延命パターン
② ご新規パターン
③ 切り出しパターン
④ ブリッジパターン
⑤ extensionパターン
⑥ 暴露パターン
⑦ 乗っ取りパターン
⑧ 写経パターン
パターン
≒
武道における形
31. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Mix and Matchを使ったSwift移行パターン
16
① 延命パターン
② ご新規パターン
③ 切り出しパターン
④ ブリッジパターン
⑤ extensionパターン
⑥ 暴露パターン
⑦ 乗っ取りパターン
⑧ 写経パターン
パターン
≒
武道における形
パターン化する意義
32. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Mix and Matchを使ったSwift移行パターン
16
① 延命パターン
② ご新規パターン
③ 切り出しパターン
④ ブリッジパターン
⑤ extensionパターン
⑥ 暴露パターン
⑦ 乗っ取りパターン
⑧ 写経パターン
パターン
≒
武道における形
パターン化する意義
→
迷わず判断できる
33. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Mix and Matchを使ったSwift移行パターン
16
① 延命パターン
② ご新規パターン
③ 切り出しパターン
④ ブリッジパターン
⑤ extensionパターン
⑥ 暴露パターン
⑦ 乗っ取りパターン
⑧ 写経パターン
パターン
≒
武道における形
パターン化する意義
→
迷わず判断できる
34. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Mix and Matchを使ったSwift移行パターン
16
① 延命パターン
② ご新規パターン
③ 切り出しパターン
④ ブリッジパターン
⑤ extensionパターン
⑥ 暴露パターン
⑦ 乗っ取りパターン
⑧ 写経パターン
パターン
≒
武道における形
パターン化する意義
→
迷わず判断できる
※各パターン名は私による勝手な命名
35. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
①延命パターン
17
Objec<ve-‐C
swi7
36. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
①延命パターン
17
objc
class
objc
class
objc
class
Objec<ve-‐C
swi7
37. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
①延命パターン
17
objc
class
objc
class
objc
class
Nullability,
Genericsに関するアノテーションを付加
Objec<ve-‐C
swi7
38. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
①延命パターン
17
objc
class
objc
class
objc
class
Nullability,
Genericsに関するアノテーションを付加
型安全・nil
安全
な世界
Objec<ve-‐C
swi7
39. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
①延命パターン
17
objc
class
objc
class
objc
class
Nullability,
Genericsに関するアノテーションを付加
型安全・nil
安全
な世界
swi7
安全にアクセス
Objec<ve-‐C
swi7
40. ①延命パターン
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
objcに Nullability, Lightweight Genericsを追加する
18
@interface UserHistory
-(Episode*)lastEepisode;
-(NSArray*)allEpisodes;
@end
41. ①延命パターン
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
objcに Nullability, Lightweight Genericsを追加する
18
@interface UserHistory
-(Episode*)lastEepisode;
-(NSArray*)allEpisodes;
@end
NS_ASSUME_NONNULL_BEGIN
@interface UserHistory
-(nullable Episode*)lastEepisode;
-(NSArray<Episode*>*)allEpisodes;
NS_ASSUME_NONNULL_END
@end
42. ①延命パターン
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
objcに Nullability, Lightweight Genericsを追加する
18
@interface UserHistory
-(Episode*)lastEepisode;
-(NSArray*)allEpisodes;
@end
NS_ASSUME_NONNULL_BEGIN
@interface UserHistory
-(nullable Episode*)lastEepisode;
-(NSArray<Episode*>*)allEpisodes;
NS_ASSUME_NONNULL_END
@end
class UserHistory {
func lastEepisode()->Episode?
func allEepisodes()->[Episode]
}
44. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
②ご新規パターン
19
Objec<ve-‐C
swi7
45. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
②ご新規パターン
19
objc
class
objc
class
objc
class
Objec<ve-‐C
swi7
46. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
②ご新規パターン
19
objc
class
objc
class
objc
class
ViewController
.swi7
View
Model
Objec<ve-‐C
swi7
47. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
②ご新規パターン
19
objc
class
objc
class
objc
class
instan<ate
ViewController
.swi7
View
Model
Objec<ve-‐C
swi7
48. ②ご新規パターン
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
新規ViewControllerは基本フルSwiftで書く
「新規開発分はSwiftで書きます」パターン
既存のobjcコードの依存が少なくやりやすい
新しい画面や機能を追加するケースにおすすめ
例)
• ユーザ登録・ログイン
• マイメニュー
• コイン購入処理
• 動画広告
20
49. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
21
③切り出しパターン
Objec<ve-‐C
swi7
50. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
21
③切り出しパターン
objc
class
method
Objec<ve-‐C
swi7
51. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
21
③切り出しパターン
objc
class
method
Objec<ve-‐C
swi7
52. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
21
Logic
.swi7
③切り出しパターン
objc
class
method
Objec<ve-‐C
swi7
53. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
21
Logic
.swi7
③切り出しパターン
objc
class
method
コール
Objec<ve-‐C
swi7
54. ③切り出しパターン
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ロジックをswiftに切り出す
22
- (NSNumber*)getNum {
NSNumber* num = ...;
return num;
}
.m
55. ③切り出しパターン
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ロジックをswiftに切り出す
22
if (num.integerValue == 0) {
NSLog(@"num is zero");
} else {
NSLog(@"num is non zero");
}
- (NSNumber*)getNum {
NSNumber* num = ...;
return num;
}
.m
56. ③切り出しパターン
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ロジックをswiftに切り出す
22
- (NSNumber*)getNum {
NSNumber* num = ...;
return num;
}
.m
57. ③切り出しパターン
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ロジックをswiftに切り出す
22
- (NSNumber*)getNum {
NSNumber* num = ...;
return num;
}
.m
[NumLogger debug:num];
58. ③切り出しパターン
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ロジックをswiftに切り出す
22
- (NSNumber*)getNum {
NSNumber* num = ...;
return num;
}
.m
+
final class NumLogger: NSObject {
class func debug(num:NSNumber) {
if num.integerValue == 0 {
print("num is zero")
} else {
print("num is non zero")
}
}
}
.swi7
[NumLogger debug:num];
59. ③切り出しパターン
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ロジックをswiftに切り出す
22
- (NSNumber*)getNum {
NSNumber* num = ...;
return num;
}
.m
+
final class NumLogger: NSObject {
class func debug(num:NSNumber) {
if num.integerValue == 0 {
print("num is zero")
} else {
print("num is non zero")
}
}
}
.swi7
[NumLogger debug:num];
• 最小限の変更で既存objcメソッドのロジックを追加・修正できる
• 使いどころ:ログ出力処理、バリデーション、Util的な処理
• ユニットテストも書きやすい
60. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
④ブリッジパターン
23
Objec<ve-‐C
swi7
61. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
④ブリッジパターン
23
objc
class
objc
class
objc
class
Objec<ve-‐C
swi7
62. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
④ブリッジパターン
23
Nested
Type
Top-‐level
func<on
Typealias
Tuple
enumenumenum
structstructstruct
objc
class
objc
class
objc
class
Objec<ve-‐C
swi7
63. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
④ブリッジパターン
23
Nested
Type
Top-‐level
func<on
Typealias
Tuple
enumenumenum
structstructstruct
objc
class
objc
class
objc
class
Objec<ve-‐C
swi7
64. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
④ブリッジパターン
23
Nested
Type
Top-‐level
func<on
Typealias
Tuple
enumenumenum
structstructstruct
objc
class
objc
class
objc
class
Objec<ve-‐C
swi7
65. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
④ブリッジパターン
23
Nested
Type
Top-‐level
func<on
Typealias
Tuple
enumenumenum
structstructstruct
objc
class
objc
class
objc
class
Bridging
NSObject
Objec<ve-‐C
swi7
145. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
何かに似ている
44
① 延命パターン
② ご新規パターン
③ 切り出しパターン
④ ブリッジパターン
⑤ extensionパターン
⑥ 暴露パターン
⑦ 乗っ取りパターン
⑧ 写経パターン
146. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
何かに似ている
44
① 延命パターン
② ご新規パターン
③ 切り出しパターン
④ ブリッジパターン
⑤ extensionパターン
⑥ 暴露パターン
⑦ 乗っ取りパターン
⑧ 写経パターン
h)p://shop.ohmsha.co.jp/shopdetail/000000003881/
リファクタリング
147. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
何かに似ている
44
① 延命パターン
② ご新規パターン
③ 切り出しパターン
④ ブリッジパターン
⑤ extensionパターン
⑥ 暴露パターン
⑦ 乗っ取りパターン
⑧ 写経パターン
h)p://shop.ohmsha.co.jp/shopdetail/000000003881/
リファクタリング
Extract
Method
Extract
Class
148. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
何かに似ている
45
① 延命パターン
② ご新規パターン
③ 切り出しパターン
④ ブリッジパターン
⑤ extensionパターン
⑥ 暴露パターン
⑦ 乗っ取りパターン
⑧ 写経パターン
149. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
何かに似ている
45
① 延命パターン
② ご新規パターン
③ 切り出しパターン
④ ブリッジパターン
⑤ extensionパターン
⑥ 暴露パターン
⑦ 乗っ取りパターン
⑧ 写経パターン
h)p://www.sbcr.jp/products/4797311126.html
gof
デザインパターン
150. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
何かに似ている
45
① 延命パターン
② ご新規パターン
③ 切り出しパターン
④ ブリッジパターン
⑤ extensionパターン
⑥ 暴露パターン
⑦ 乗っ取りパターン
⑧ 写経パターン
h)p://www.sbcr.jp/products/4797311126.html
gof
デザインパターン
Bridgeパターン
151. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
何かに似ている
46
① 延命パターン
② ご新規パターン
③ 切り出しパターン
④ ブリッジパターン
⑤ extensionパターン
⑥ 暴露パターン
⑦ 乗っ取りパターン
⑧ 写経パターン
152. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
何かに似ている
46
① 延命パターン
② ご新規パターン
③ 切り出しパターン
④ ブリッジパターン
⑤ extensionパターン
⑥ 暴露パターン
⑦ 乗っ取りパターン
⑧ 写経パターン
h)p://www.shoeisha.co.jp/book/detail/9784798116839
レガシーコード改善ガイド
153. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
何かに似ている
46
① 延命パターン
② ご新規パターン
③ 切り出しパターン
④ ブリッジパターン
⑤ extensionパターン
⑥ 暴露パターン
⑦ 乗っ取りパターン
⑧ 写経パターン
h)p://www.shoeisha.co.jp/book/detail/9784798116839
レガシーコード改善ガイド
• スプラウトメソッド
• スプラウトクラス
• 静的メソッドの公開
テストコードを書くためのリファクタリング手法
154. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
47
① 延命パターン
② ご新規パターン
③ 切り出しパターン
④ ブリッジパターン
⑤ extensionパターン
⑥ 暴露パターン
⑦ 乗っ取りパターン
⑧ 写経パターン
Mix-and-Matchを使ったSwift移行パターン
既存のソフトウェア開発技法の活用により
スムーズ・安全にSwi7移行可能