読者です 読者をやめる 読者になる 読者になる

try! Swift 実践的 “Boundaries” #tryswiftconf Day2-1

try! Swift 2016

Ayaka Nonaka

AyakaはVenmoのiOSリードで最近はSwiftばかり書いています。iOS 4の頃からiOS開発を始め、テイラー・スウィフトの曲を聴きながらSwiftを書くのが大好きです。これまでSwiftにおける自然言語処理や、スクリプティング、VenmoアプリをSwiftで書き直したことなどをテーマに講演を行いました。東京出身なので、東京のカンファレンスで話せることがとても楽しみです!「宜しくお願いします。」

f:id:niwatako:20160303095922j:plain

twitter.com

Gary BernhardtさんのBoundariesという講演 https://www.destroyallsoftware.com/talks/boundaries) をご存知でしょうか。関数型プログラミングの講演ではよく言及されています。私は数年前に初めてこの講演を聴いたとき、「Functional Core, Imperative Shell」を理論的には理解できたのですが、実際の場面でにどのようにこの概念を適用できるのかよく分かりませんでした。しかし、毎日少しずつSwiftを書いているうちに、この概念は関数型プログラミングだけではなく、良いエンジニアリングに一般的に適用できることがわかってきました。今回は「Boundaries」をどのように利用して、より良い、より安全な、そして将来性のあるSwiftを書くことができるのかを、いくつかの事例を紹介しながらお話しします。「Boundaries」をご覧になったことがなくても私の話をご理解いただけると思いますが、もしお時間があればぜひ一度ご覧ください。すばらしい講演です。

f:id:niwatako:20160303095938j:plain

コードの芯をファンクショナルにする

f:id:niwatako:20160303100002j:plain

すべてをファンクショナルにすることは出来ない。UIKitを使うと副作用だらけ。 こんなイメージ。 f:id:niwatako:20160303100107j:plain

f:id:niwatako:20160303100302j:plain 私もその立場に居ました。

"Functional Core, Imperative Shell"をどう活用できるか分からないでいました。 でもそれでよかった。まず感覚を覚えて、使えるかな?と思った時に、使えば良い。 f:id:niwatako:20160303100418j:plain f:id:niwatako:20160303100446j:plain 少しずつコードを書いているうちに、エンジニアリング全体に適用できると思うようになりました。幾つかの事例を紹介します。 f:id:niwatako:20160303100515j:plain こんなアプリで好きなストーリーを選択してコメントを見れます。 f:id:niwatako:20160303100631j:plain f:id:niwatako:20160303100644j:plain f:id:niwatako:20160303100656j:plain f:id:niwatako:20160303100704j:plain f:id:niwatako:20160303100715j:plain 機能追加が必要に。Push通知の機能。StoryboardからViewControllerを表示したり。 f:id:niwatako:20160303100743j:plain f:id:niwatako:20160303100825j:plain f:id:niwatako:20160303100831j:plain f:id:niwatako:20160303100836j:plain f:id:niwatako:20160303100840j:plain f:id:niwatako:20160303100850j:plain f:id:niwatako:20160303100855j:plain f:id:niwatako:20160303100908j:plain f:id:niwatako:20160303100915j:plain f:id:niwatako:20160303100925j:plain f:id:niwatako:20160303100935j:plain f:id:niwatako:20160303100942j:plainf:id:niwatako:20160303100945j:plain f:id:niwatako:20160303100953j:plain f:id:niwatako:20160303101018j:plain f:id:niwatako:20160303101022j:plain f:id:niwatako:20160303101026j:plain f:id:niwatako:20160303101035j:plainf:id:niwatako:20160303101043j:plain f:id:niwatako:20160303101057j:plain f:id:niwatako:20160303101049j:plain f:id:niwatako:20160303101202j:plain f:id:niwatako:20160303101208j:plain

サイドプロジェクトで新しいアプリを作っています。新しいアイディアを試す機会が増えました。その一つが

f:id:niwatako:20160303101224j:plain ViewControllerは他のVCを知らないということです。 f:id:niwatako:20160303101236j:plain f:id:niwatako:20160303101250j:plain f:id:niwatako:20160303101256j:plain f:id:niwatako:20160303101302j:plain f:id:niwatako:20160303101332j:plain f:id:niwatako:20160303101528j:plain コーディネーターを使うとアプリは木構造になる。Search機能を足すのも簡単。コーディネーターを足すだけ。 f:id:niwatako:20160303101559j:plain ログインも簡単。 f:id:niwatako:20160303101628j:plain

サインアップも同じようにたせます。このコーディネーターパターン気に入ってます アプリのフロー全体をコーディネータに任せるとこんな感じ f:id:niwatako:20160303101701j:plain

抽象化

f:id:niwatako:20160303101756j:plain

アブストラクションはソフトウェアエンジニアとして結構始めに習うコンセプトです。インターフェースが綺麗というイメージが有りますね?でもSwiftでインターフェースを抽象化するだけでは足りないということが明らかになって来ました。

f:id:niwatako:20160303101845j:plain アーキテクチャの何処がイミュータブル、堅実なパターンに適しているかを把握するのが大切です。

そして同じようにどの部分がネットワーク硬度のように流動的なパターンに適しているかを把握するのが大切です。 f:id:niwatako:20160303101912j:plain

鍵は堅実さと流動さのバランス、境界(Boundary)をいつけること f:id:niwatako:20160303102001j:plain

そうすることで安全で将来性のあるコードが書ける f:id:niwatako:20160303102028j:plain (機材の都合で逆になっているだけです)

f:id:niwatako:20160303102057j:plain

2つのコンセプトの紹介がありました。新しいコードに足すのは簡単かもしれないが既存に適用するのはどうしたら良い?

コーディネーターパターンは新しいコードベースで使ったが、いいと思ったから既存のアプリでも使うようにしました。

コーディネーターパターンについて質問。現実のアプリでPushとPopだけじゃなくて、関係ない画面でボタン押したら、ナビゲーションコントローラーのスタックが入れ替わるようなときは、VCの互いの感心を排除できるというメリットはなくなるかと思うがどのように対処するか

それは多分、コード見てみたいですね、やったことないです。

そういう仕様は避けろ、ということですね

(会場笑)

コーディネータパターンはバイパーで言うワイヤーフレームかなと思った。それでは、ワイヤーフレーム毎に参照を持っていて、根本まで通知して根本で差し替えるというパターンになると思います。

↑という意見

Storyboardとの関係はどうなるのかなと思いました

私はStoryboard使いません。ViewControllerが互いに関心をもつことになってしまう

バイパーでワイヤーフレーム使っていてStoryboard使わないかと思ったが独自にライブラリを作って参照をなくしつつStoryboardを利用するようにしている

あとで見せてください

Githubに公開しています

続きはQAセッションでお願いします。

気に入った記事は はてなブックマーク

はてなブックマークアプリiOS開発チームから来ました! はてなブックマークにはSwift特集があります! 良い記事を見逃さないように、ご利用ください! http://b.hatena.ne.jp/hotentry/it/Swift

そして良いまとめ記事があったらはてなブックマークでブックマークしましょう! try! Swift の記事で盛り上がると嬉しいです!