potatotips#37でプロトコル指向について話してきました

こんにちは! PairsのiOSエンジニアをしている長坂です。
先日開催されたpotatotips#37にてSwiftのプロトコル指向について発表させて頂きました。
今回は発表内容の紹介&補足と、個人的に気になった発表をいくつかピックアップして紹介します!

potatotipsとは?

potatotipsとは、iOS/Android開発におけるTipsを出し合う勉強会です。
参加者全員がTipsを共有するというコンセプトにほぼ毎月開催されており、一人5分の持ち時間でLTを発表し合い、LTの後は懇親会も行われます!
主催者と会場は各potatotipsごとに立候補制で決まっており、今回のpotatotips#37ではヤフー株式会社様主催での開催となりました。
ちなみに、弊社でもpotatotips#28の時には主催させて頂きました。

発表会場の「LODGE」について

今回のpotatotipsの会場として、ヤフー株式会社様の運営するコワーキングスペース「LODGE」を提供して頂きました!

今回のようなイベント会場としてだけでなく、通常のコワーキングスペースと同じような作業スペースがかなり充実しており、オープンラウンジやミーティングスペース・集中デスクが提供されていました。
また、食事や料理を楽しめるイベントも開催できるよう、レストランやキッチンの設備も充実しているのは驚きでした。
現在1Day利用が無料キャンペーン中とのことなので集中して作業したいときなどしてみたいと、積極的に利用させて貰おうかと思います!

LTをいくつかピックアップして紹介

今回もiOS/Androidの様々なTipsを紹介いただきました!
各Tipsについて網羅的なレポートは様々な方がまとめて下さっているので、
このエントリにおいては、個人的に気になった2つのLTについて紹介させて頂きます。

y.imajoさんの「AppRootControllerのご提案(簡略説明板)」

初回表示時はウォークスルー(チュートリアル)を出し、そうでない時はホーム画面を表示させたい 等、
起動時のVCを制御する手法についてご紹介頂きました。

上記のような例の場合起動時のViewControllerのviewWillAppearなどで他画面の表示処理を実装するUIWindowのrootViewControllerを切り替えるなどが今までの一般的な方法でしたが
AppRootController をUIWindowのrootViewControllerとし、アプリ起動時の画面切り替えを行うことで以下の点でメリットがあるとのことです。

  • 起動時のViewControllerの処理に他画面を表示させるような、起動時のViewControllerに直接関係が無い処理を書かなくて済む(ソースコードの可読性が落ちない)
  • rootViewControllerが表示中に別のViewControllerに差し替えた時のメモリリーク発生を抑えられる

個人的には上記のような処理の時、よくrootViewControllerを差し替えて対応していたのですが
dismissなどを事前にしておかないとメモリリークが発生し面倒だったため、このような対応方針は有用なのではないかと思いました。

Wasabeefさんの「Lottie for You」

airbnbによって開発されたLottieというライブラリについてのご紹介です。

LottieはiOS, Android, React Native用のライブラリとして開発されており、
After Effectsで作成し、bodymovinというライブラリで書き出したアニメーションを簡単にアプリ上でレンダリングできるライブラリです。

このようなリッチなアニメーションをCoreAnimationで実装しようとするとかなり工数がかかりますし、
かといってgifファイルなどにするとアプリのファイルサイズを圧迫してしまうので
アニメーション作成に特化したアプリで作成し、書き出した設定ファイルをアプリで読み込むだけで実現できるLottieは、アニメーションを多用するアプリにはかなりの工数削減になるのではないかと思います!

発表させて頂いた「プロトコル指向フレンズ」について

今回のpotatotipsではプロトコル指向をテーマに登壇させて頂きました。
前回のpotatotips#36でもフォントについて発表する機会を頂きましたが、今回も非常にリラックスした気持ちでお話することができました^^

今回は発表した内容を簡単にまとめつつ、詳しくお伝えすることができなかった部分についてまとめます!

プロトコル指向とは?

プロトコル指向はその名が示している通り、Swiftにおけるprotocolを用いてプログラミングします。
しかし、ただprotocolを使えばいい、という訳ではありません。
プロトコル指向はprotocolを使うパラダイム、というよりも オブジェクト指向のカウンターパラダイム として理解するとスッキリ理解できるかと思います。

オブジェクト指向の大きな特徴といえば、Classを用いた継承があります。スーパークラスで定義したメソッドやプロパティをサブクラス側で受け継ぎ、且つ新しく処理を追加/変更することでポリモフィズムを実現することができます。

ただし、この継承にはいくつかの問題があります。
代表的な所ですと、暗黙的オブジェクトの共有と、プロジェクトが進むにつれて問題となる継承関係の複雑化です。

Classは基本的に参照型である為、一つのオブジェクトを各オブジェクト間で共有することが可能です。
オブジェクトを共有することでメモリ負荷を抑えつつ、同じ値を参照することができますが、
それは意図しないオブジェクトの変更を許すことになる為、関係ない部分でそのオブジェクトが消されてしまったり、パラメータが変化することでバグが発生する可能性があります。

また、プロジェクトが進むにつれて、継承関係が複雑になる可能性があります。
例えばBaseViewControllerを継承してDetailViewCcontrollerを作成、更にPersonalDetailViewControllerを作成・・など、継承が重なると
サブクラス側では継承元がどのような挙動で何のパラメータを持っているのか、またどの処理をOverrideして内容を変更しても問題ないのかを全て把握する事が困難になり、バグが発生しやすくなります。

これらを解決する為のパラダイムこそ、プロトコル指向です。

ClassからStructへ

プロトコル指向は基本的に上記問題であったClassは使わずに、Struct(構造体)を用います。
こちらが、ClassとStructの比較です。

Class Struct
type 参照型 値型
継承 継承できる 継承できない
プロパティ変更 可能 条件付きで可能(mutatingなど)

まずStructは値型なので、オブジェクト間で値を受け渡した時、値をコピーして渡します。
その為、受け渡したオブジェクトの値を変更したとしても、Classで発生していた暗黙的なオブジェクトは発生せず、各所で変更した値は他の値に影響することはありません。

また、継承も不可能なので、何層にも重なり複雑化した継承関係を全て理解することは必要ありません。

ただ、そのままですと継承関係で実現してきたポリモフィズムなどを体現することはできません。
そこで登場するのがprotocolです。
protocolは一つの型に対して複数実装可能であるため、初期実装時に継承関係の複雑性を考慮しなくてもよく(どのようにprotocol実装するかは検討する必要はもちろんあります)、
また基本的にはprotocolは実装を持ちませんが、extension protocolを用いることでデフォルト実装を定義したりメソッドを追加することができるので
Struct間で処理を共有することができます。

マルチパラダイムとして仲良く

プロトコル指向は非常に強力なパラダイムですが、
現行のオブジェクト指向で設計されたプロダクトをプロトコル指向に置き換えるのは難しいかと思います。

Swiftはバージョン3からOSSとなりましたが、現行の多くのプロダクトはiOS/macOSなどのアプリケーション開発用言語としてのイメージが強いです。
iOSなどのアプリケーション開発に必須なCocoa FrameworkはObjective-Cで開発されており、基本的にはオブジェクト指向ベースのフレームワークとなっています。
その為、アプリ実装時にプロトコル指向を取り入れる場合、オブジェクト指向と向き合う必要があります。
それは、オブジェクト指向で発生していた問題点や、ClassやStructの特徴を常に意識する必要があるということです。

Swiftはマルチパラダイム言語なので、各パラダイムに統一するのではなく、うまく共存させることで大きな力を発揮する事ができると思います。
各パラダイムの理解を深め、要所に応じてうまく使い分けていきましょう!

まとめ

potatotipsは各登壇者の持ち時間が5分と短いですが、とても和やかな雰囲気でお話することができるので
ちょっとしたTipsを発表したい、学んだ内容をアウトプットしたいという時に一度登壇してみるのはいかがでしょうか。
また、iOS/Androidそれぞれのプラットフォームの話が入り乱れる中、皆さん短い時間の中で内容の濃い話をして頂けるため、自分が実装したことがないプラットフォームについての事や、最近キャッチアップできていないな・・というような話も聞くことができます。
Tipsの発表なしでもオーディエンス枠としても参加することができるので、皆さん興味がありましたら是非ともご参加ください!

  • このエントリーをはてなブックマークに追加

エウレカでは、一緒に働いていただける方を絶賛募集中です。募集中の職種はこちらからご確認ください!皆様のエントリーをお待ちしております!

Recommend

Go初心者でもすぐできる!Raspberry Piと組み合わせて素早く目覚ましを作る方法

そのSlackアプリ Web APIで満足ですか?