Swift : クラス継承とプロトコル拡張を比べてみる #yidev

7,358 views

Published on

#yidev 横浜 iPhone 開発者勉強会の第20回目で発表しようと思って用意した、クラス継承の特徴とプロトコル拡張の特徴の違いをざっくり比較してみたスライドです。

スライドだけだと足りない部分もあるかと思いますけど、せっかくなので公開しておきます。

Published in: Technology
0 Comments
27 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
7,358
On SlideShare
0
From Embeds
0
Number of Embeds
2,541
Actions
Shares
0
Downloads
21
Comments
0
Likes
27
Embeds 0
No embeds

No notes for slide

Swift : クラス継承とプロトコル拡張を比べてみる #yidev

  1. 1. EZ-‐‑‒NET  熊⾕谷友宏   http://ez-‐‑‒net.jp/ 2015.07.11   @  yidev  第20回勉強会 クラス継承とプロトコル拡張 Swift  カジュアルプログラミング
  2. 2. 熊谷友宏 EZ-NET http://ez-net.jp/ @es_kumagai Xcode 5 徹底解説 IP Phone 音でダイヤル 音で再配達ゴッド いつもの電卓 with 割勘ウォッチ MOSA
  3. 3. WWDC2015 情報共有会で プロトコル拡張について発表してきました。 http://connpass.com/event/16691/ @yucovin @akio0911@esum1527
  4. 4. 発表後にツイッターを眺めていると 『プロトコル拡張って多重継承の一種?』
  5. 5. そこで
  6. 6. クラス継承とプロトコル拡張を ざっくり比較してみる
  7. 7. 多重継承
  8. 8. クラス継承
  9. 9. 機能を特化して積み上げる クラス継承 ⽣生物 ⽣生きる機能を実装   消化器・循環器・呼吸器など 動物 動く機能を実装   運動神経・関節など ⾁肉⾷食 ⾷食事を⾁肉に限定   必要な機能を実装 猫 広くを想定目的に特化 猫 にゃーと鳴く、⽑毛繕いなど   猫らしい機能の実装
  10. 10. 今までの資産を活かせる クラス継承 ⽣生物 動物 ⾁肉⾷食 ⽝犬猫 ⽝犬 機能を流流⽤用して   新しいものを⽣生成 ▶ 制作コストの削減 ▶ どちらも 動物 として
 扱える
  11. 11. 特徴を併せ持つとき クラス継承 ⽣生物 動物 ⾁肉⾷食 ⽝犬猫 ⽝犬 ⽝犬って雑⾷食 ▶ 犬で雑食性を追加? 草⾷食機能を独⾃自実装?
  12. 12. 特徴を併せ持つとき クラス継承 ⽣生物 動物 ⾁肉⾷食 ⽝犬猫 ⽝犬 純⾁肉⾷食 ▶ 肉食と草食を継承?
 多重継承 (C++) 雑⾷食性 草⾷食 草⾷食動物を作って継承?
  13. 13. プロトコル拡張
  14. 14. 特徴で対象を説明する プロトコル 猫 ▶ 対象は猫型 ▶ 特徴をプロトコルで表現 ⾁肉⾷食型 ⾛走れる 鳴ける 歩ける
  15. 15. 特徴に機能を添える プロトコル拡張 猫 ⾁肉⾷食型 ⾛走れる 鳴ける ▶ プロトコルに
 機能を関連付ける 歩ける ⾁肉を⾷食べさせる 鳴かせる 前に進ませる 右を向かせる
  16. 16. 特徴を型で具現化する プロトコル指向 猫 特徴の実現に必要な
 猫固有の機能を実装 ⾁肉⾷食型 ⾛走れる 鳴ける ▶ 必要最低限の機能を
 型に実装する 歩ける ⾁肉を⾷食べさせる 鳴かせる 前に進ませる 右を向かせる にゃーと鳴くのはここで実装
  17. 17. 対象ごとに特徴から組み立てる プロトコル指向 猫 鳴ける ⾛走れる ⾁肉⾷食型 歩ける ⽝犬 ⾁肉⾷食型 ⾛走れる 吠え れる 草⾷食性 歩ける
  18. 18. 複数のプロトコル拡張を継承 プロトコル指向 猫 鳴ける ⾛走れる ⾁肉⾷食型 歩ける ⽝犬 ⾁肉⾷食型 ⾛走れる 吠え れる 草⾷食性 歩ける 鳴かせる 前に進ませる 右を向かせる ⾁肉を⾷食べさせる 吠えさせる 草を⾷食べさせる
  19. 19. 多重継承?
  20. 20. 特徴を観察
  21. 21. クラス継承
  22. 22. 紛れもない多重継承 クラス継承 ⽣生物 動物 ⾁肉⾷食 ⽝犬猫 ⽝犬 草⾷食 ▶ 同じ機能があると複雑に ▶ どちらを使ったら良いか
  23. 23. 紛れもない多重継承 クラス継承 ⽣生物 動物 ⾁肉⾷食 ⽝犬猫 ⽝犬 草⾷食 ▶ 共通する親を持つ場合が
 さらに話を難しくする
  24. 24. プロトコル拡張
  25. 25. 特徴それぞれが機能を持つ プロトコル拡張 ⽝犬 ⾁肉⾷食型 ⾛走れる 吠え れる 草⾷食性 歩ける 前に進ませる 右を向かせる ⾁肉を⾷食べさせる 吠えさせる 草を⾷食べさせる ▶ 複数の特徴を継承する ▶ 多重継承にも似ているが
 それぞれの階層は浅い
  26. 26. ⽝犬 継承に見えるところ プロトコル拡張 ⾁肉⾷食型 ⾛走れる 吠え れる 草⾷食性 歩ける ⾁肉を⾷食べさせる 吠えさせる 草を⾷食べさせる ▶ 歩ける を継承して
 走れる を作っている? 前に進ませる 右を向かせる
  27. 27. ▶ 上位へ進化というより
 特徴をあわせ持つ? ▶ 優位性は若干ある 継承というより プロトコル拡張 歩ける ⾛走れる 合わせてひとつ? 進ませる  (歩き) 進ませる  (⾛走り) 歩ける ⾛走れる 下位 上位 歩けて・走れる 進ませる  (⾛走り)進ませる  (歩き) 右を向かせる 右を向かせる
  28. 28. 守備範囲を観察
  29. 29. クラス継承
  30. 30. 肉食動物の守備範囲 クラス継承 ⽣生物 動物 ⾁肉⾷食 ⽝犬猫 ▶ 生物の起源までが範疇
  31. 31. 肉食動物の守備範囲 プロトコル拡張 猫 ⾁肉⾷食型 ⾛走れる 鳴ける 歩ける ⾁肉を⾷食べさせる 鳴かせる ▶ 肉を食べれること、以上 前に進ませる 右を向かせる
  32. 32. 影響範囲を観察
  33. 33. 犬に雑食性をもたせたくなったら クラス継承 ⽣生物 動物 ⾁肉⾷食 ⽝犬猫 ⽝犬 ▶ 多重継承が無理なら
 動物で受け入れる? ▶ 猫にも影響が及ぶかも 草⾷食 ⿅鹿鹿 “なんでも⾷食べる”  を追加 ⾁肉⾷食に制限 “なんでも⾷食べる”
 を再解禁 ! ! ! ! ?
  34. 34. 犬に雑食性をもたせたくなったら プロトコル指向 ⽝犬 ⾁肉⾷食型 ⾛走れる 吠え れる 草⾷食性 ▶ 犬に草食性をプラス ▶ 他には影響しない 猫 ⾁肉⾷食型 ⾛走れる 鳴ける ⿅鹿鹿 草⾷食型 ⾛走れる !
  35. 35. 生物の常識を覆す新発見 !? クラス継承 ⽣生物 動物 ⾁肉⾷食 ⽝犬猫 ⽝犬 ▶ 生物界に激震 草⾷食 ⿅鹿鹿 ! ! ! ! ! ! ! 新種 ♪
  36. 36. 生物の常識を覆す新発見 !? プロトコル指向 ⽝犬 ⾁肉⾷食型 ⾛走れる 吠え れる 草⾷食性 ▶ 新しいプロトコルが
 生まれるかも 猫 ⾁肉⾷食型 ⾛走れる 鳴ける ⿅鹿鹿 草⾷食型 ⾛走れる 新常識識 ♪
  37. 37. 可読性を観察
  38. 38. 犬って雑食? クラス継承 ⽣生物 動物 ⾁肉⾷食 ⽝犬猫 ⽝犬 ▶ 表面から分からない? ▶ 読み解く必要がある 草⾷食 とりあえず⾷食べれる でも⾁肉だけみたい 草⾷食ではなさそう
  39. 39. 犬って雑食。 プロトコル ▶ プロトコルで一目瞭然 ⽝犬 ⾁肉⾷食型 ⾛走れる 吠え れる 草⾷食性 歩ける
  40. 40. 実装を観察
  41. 41. 汎用的な土台から積み上げる クラス継承 ▶ 土台の設計が重要 ▶ 汎用化が ? ⽣生物 動物 ⾁肉⾷食 ⽝犬 ⽣生物 動物 ⾁肉⾷食 猫
  42. 42. 具体的な特徴で説明する プロトコル拡張 ▶ 特徴の切り出しが重要 ▶ 抽象化が ? ⽝犬 ⾁肉⾷食型 ⾛走れる 吠え れる 草⾷食性 猫 ⾁肉⾷食型 ⾛走れる 鳴ける 動物 ⽣生物 汎⽤用的すぎると   扱いにくそう
  43. 43. アクセス範囲を観察
  44. 44. ▶ 親の公開範囲を
 自分より狭くできない 継承先ほど狭める方向へ クラス継承 ⽣生物 親クラスをまるごと
 秘密にはできない 動物 ⾁肉⾷食 ⽝犬猫 親と同じか低い
 アクセス範囲が必要 親が internal なら子は internal 以下 ❌  Private   ⭕  Public Internal
  45. 45. 歩ける ⾛走れる 元と同じか
 狭いアクセス範囲で 元の想定範囲は
 広げられない ▶ 元の公開範囲より
 広いものは作れない 継承先ほど狭める方向へ プロトコル継承 元が internal なら新しいものは internal 以下 Internal ❌  Private   ⭕  Public
  46. 46. ▶ 型の公開範囲より
 小さくても準拠可能 ▶ 最大でも型の範囲まで アクセス範囲はそれぞれ次第 型のプロトコル継承 ⽝犬猫 プロトコルが internal 指定ならその機能は internal 以上 歩ける ⾛走れる 集会 できる 型より⼩小さい
 アクセス範囲も可能 機能のアクセス範囲は   各プロトコル以上で これが求める機能の範囲は   このプロトコルの範囲以上で Internal ⭕  Public ⭕  Private ⭕  Internal
  47. 47. まとめ
  48. 48. クラス継承とプロトコル拡張は かなり性格が違う印象
  49. 49. 性格の違いを意識して使うと 使い分けの仕方が見えてくるかも?
  50. 50. クラス継承とプロトコル拡張 ▶ クラス継承 ✴ 機能を特化して積み上げる ✴ 汎用性を意識した設計 ✴ 特徴を知るとは全てを知ること ✴ 常識を覆したときの影響範囲が広い? ▶ プロトコル拡張 ✴ 特徴で対象を説明する ✴ 特徴を意識した設計 ✴ 特徴が一目瞭然 ✴ 常識を覆すと新しいプロトコルが誕生?

×