iOSにおけるクリーンアーキテクチャよもやま話 #swtws

# この記事は何？
[Swift Tweets](https://swift-tweets.github.io/)でTweet LTさせていただいたもののまとめになります。イベントのスポンサーとして Qiita に許可をいただいた上で、このような形（ツイートの引用）で投稿しています。

# 発表形式

Twitterのアンケート機能を使って話す内容を決めてみました。短い5分のLT時間で、できるだけニーズある話をしたかったという意図での試みでした。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【アンケートのお願い】<br>いきなりですがクリーンアーキテクチャに関してLTします田中です。<br>参加者の皆さんが気になることのアンケートを取りたいです。<br>アンケートの結果に応じて話す内容を変えようと思ってます。<br><br>iOSにおけるCAに関して気になるところはどこですか？<a href="https://twitter.com/hashtag/swtws?src=hash">#swtws</a></p>&mdash; ロスリックのダンボー田中 (@ktanaka117) <a href="https://twitter.com/ktanaka117/status/820255683907989504">2017年1月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

クリーンアーキテクチャに対する意識調査にもなってよいアンケートだったなと個人的に思っています。

もともと3つ話を作っておいてありました。本番では得票数の多かった**話その1の「そもそもCAってなに？」**の内容をTweetしましたが、せっかく用意したのでその他も公開しちゃいます。

# iOSにおけるクリーンアーキテクチャよもやま話

※ここで使っているCAという表記はClean Architectureの略になっています。

## はじめに

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">🍺など飲みながらゆるく始めさせていただきます。<br><br>それでは聞いてください、<br>「iOSにおけるクリーンアーキテクチャよもやま話」<a href="https://twitter.com/hashtag/swtws?src=hash">#swtws</a> <a href="https://t.co/zdpSXKH3OW">pic.twitter.com/zdpSXKH3OW</a></p>&mdash; ロスリックのダンボー田中 (@ktanaka117) <a href="https://twitter.com/ktanaka117/status/820299199908442112">2017年1月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【自己紹介】<br><br>おばんです、クラスメソッドでiOSをやりながらブログを書いている田中賢治といいます。<br>アイコンの通り、一部では「ダンボールの人」と呼ばれています。<br><br>詳しくは👇<a href="https://t.co/1WAWbzjLuy">https://t.co/1WAWbzjLuy</a><a href="https://twitter.com/hashtag/swtws?src=hash">#swtws</a> <a href="https://t.co/fMDSK4Aozy">pic.twitter.com/fMDSK4Aozy</a></p>&mdash; ロスリックのダンボー田中 (@ktanaka117) <a href="https://twitter.com/ktanaka117/status/820299391927861249">2017年1月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【今日する話の説明】<br><br>今回はアンケートを取った中の「そもそもCAってなに？」について話していきますが、みなさんの発表が終わり次第他の話も垂れ流します。Qiitaにもまとめますのでご安心を。（というか話したい）<br><br>100票以上集まりました、すごい。<a href="https://twitter.com/hashtag/swtws?src=hash">#swtws</a> <a href="https://t.co/PsAHNv2mc0">pic.twitter.com/PsAHNv2mc0</a></p>&mdash; ロスリックのダンボー田中 (@ktanaka117) <a href="https://twitter.com/ktanaka117/status/820299541098307585">2017年1月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## 話その1: 「そもそもCAってなに？」

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【元ネタ】<br><br>元ネタと翻訳版は以下のリンク。<a href="https://t.co/vblzZQgx06">https://t.co/vblzZQgx06</a><a href="https://t.co/DA6OM0Z57x">https://t.co/DA6OM0Z57x</a><br><br>CA（=クリーンアーキテクチャ）に関してはいくつかの要件が元ネタに書いてあるけれど今回は省略。是非読んでみてください。<a href="https://twitter.com/hashtag/swtws?src=hash">#swtws</a></p>&mdash; ロスリックのダンボー田中 (@ktanaka117) <a href="https://twitter.com/ktanaka117/status/820299681783656448">2017年1月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【iOSにおけるCA】<br><br>僕がiOSでCAを採用するにあたって大いに参考にさせていただいているのが以下のリンク先です。むしろパクってます、ありがとうございます。<br>サンプルコードも載っているのでとてもわかりやすいです。<a href="https://t.co/RQv7olSnqP">https://t.co/RQv7olSnqP</a><a href="https://twitter.com/hashtag/swtws?src=hash">#swtws</a></p>&mdash; ロスリックのダンボー田中 (@ktanaka117) <a href="https://twitter.com/ktanaka117/status/820299860792311810">2017年1月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">この記事ね。<a href="https://twitter.com/hashtag/swtws?src=hash">#swtws</a> <a href="https://t.co/BLn2b14idB">pic.twitter.com/BLn2b14idB</a></p>&mdash; ロスリックのダンボー田中 (@ktanaka117) <a href="https://twitter.com/ktanaka117/status/820300140103667712">2017年1月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【iOSにおけるCA】<br><br>iOSにおけるCAはおおまかな説明をすると添付している画像の通りの層と役割ごとに分けた設計です。(前ツイートのリンク先よりお借りしてます)<br>役割ごとの説明は先述のリンク先で説明されています。<a href="https://twitter.com/hashtag/swtws?src=hash">#swtws</a> <a href="https://t.co/o11PAgZnA2">pic.twitter.com/o11PAgZnA2</a></p>&mdash; ロスリックのダンボー田中 (@ktanaka117) <a href="https://twitter.com/ktanaka117/status/820300292075884548">2017年1月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【iOSでCAを取り入れると良いこと】<br><br>以下が挙げられます。<br><br>・役割を分けることでMV○系におけるModel部分の曖昧さが無くなるので、エンジニア同士の経験値の差を埋めてくれる<br>・処理とデータの流れが追いやすい<br>・疎結合な作りなのでテストしやすくなる<a href="https://twitter.com/hashtag/swtws?src=hash">#swtws</a></p>&mdash; ロスリックのダンボー田中 (@ktanaka117) <a href="https://twitter.com/ktanaka117/status/820300462146494464">2017年1月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【iOSでCAを取り入れるとつらいこと】<br><br>・導入コストが高い<br>・ファイル数・コード量が増える<br><br>複雑なアプリor開発期間の長いアプリでないとオーバーコストな設計なので採用には見極めが必要。後者に関しては僕の後の <a href="https://twitter.com/yhirose741">@yhirose741</a> さんから詳しく説明があるかも<a href="https://twitter.com/hashtag/swtws?src=hash">#swtws</a></p>&mdash; ロスリックのダンボー田中 (@ktanaka117) <a href="https://twitter.com/ktanaka117/status/820300623748829186">2017年1月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【CA導入までの流れ】<br><br>・CAは理解するのが難しい。一度簡単なアプリを「チームで」作ってみるとよい。<br>・いきなり案件導入するとチーム内で認識の齟齬が生まれてしまって苦労する。（体験談）<br><br>続きはWebで。<a href="https://t.co/nqkoBtyNM6">https://t.co/nqkoBtyNM6</a><a href="https://twitter.com/hashtag/swtws?src=hash">#swtws</a></p>&mdash; ロスリックのダンボー田中 (@ktanaka117) <a href="https://twitter.com/ktanaka117/status/820300855572250628">2017年1月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">この記事ね。<a href="https://twitter.com/hashtag/swtws?src=hash">#swtws</a> <a href="https://t.co/4ZZSSkb2vD">pic.twitter.com/4ZZSSkb2vD</a></p>&mdash; ロスリックのダンボー田中 (@ktanaka117) <a href="https://twitter.com/ktanaka117/status/820301046115401728">2017年1月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【さいごに】<br><br>以上、「そもそもCAってなに？」についてお話ししました。<br><br>今日の発表がみなさまのより良い開発の一助となれば幸いです。ごTweet聴ありがとうございました。(続く<a href="https://twitter.com/hashtag/swtws?src=hash">#swtws</a> <a href="https://t.co/1iVuqKaatX">pic.twitter.com/1iVuqKaatX</a></p>&mdash; ロスリックのダンボー田中 (@ktanaka117) <a href="https://twitter.com/ktanaka117/status/820301167435640833">2017年1月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## 発表後

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">この後のフリートークでは<br><br>・アンケートの中の取り上げなかったトピックの話（発表用に話は用意してある）<br>・CAと他のアーキテクチャの比較の話<br>・CAに則ったコードって実際どんな風に書くの？<br><br>などなんでもウェルカムです。気軽にお声がけください。<a href="https://twitter.com/hashtag/swtws?src=hash">#swtws</a></p>&mdash; ロスリックのダンボー田中 (@ktanaka117) <a href="https://twitter.com/ktanaka117/status/820301210028646401">2017年1月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【宣伝・参考・関連】<br><br>あと勉強会やってます、よろしく！！！📦<a href="https://t.co/tff3kvnJUg">https://t.co/tff3kvnJUg</a><a href="https://t.co/RQv7olSnqP">https://t.co/RQv7olSnqP</a><a href="https://t.co/Ty9aw4hEvU">https://t.co/Ty9aw4hEvU</a><a href="https://t.co/nqkoBtyNM6">https://t.co/nqkoBtyNM6</a><a href="https://twitter.com/hashtag/swtws?src=hash">#swtws</a></p>&mdash; ロスリックのダンボー田中 (@ktanaka117) <a href="https://twitter.com/ktanaka117/status/820301256392511488">2017年1月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">以上、温かみのある手Tweetでした！ありがとうございましたー<a href="https://twitter.com/hashtag/swtws?src=hash">#swtws</a></p>&mdash; ロスリックのダンボー田中 (@ktanaka117) <a href="https://twitter.com/ktanaka117/status/820301376269873155">2017年1月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## 話その2: 「CAを採用するとなにが良いの？」

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">勝手にSwift Tweets 第二部<br><br>「CAを採用するとなにが良いの？」<br><br>  <a href="https://twitter.com/hashtag/swtws?src=hash">#swtws</a></p>&mdash; ロスリックのダンボー田中 (@ktanaka117) <a href="https://twitter.com/ktanaka117/status/820306317759787008">2017年1月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【CAを採用した際のメリット】<br><br>以下が挙げられます。<br><br>1. MV○系アーキテクチャにおけるModelという曖昧な存在を細分化して明確にしてくれる<br>2. 処理とデータの流れが追いやすい<br>3. テストしやすい<a href="https://twitter.com/hashtag/swtws?src=hash">#swtws</a></p>&mdash; ロスリックのダンボー田中 (@ktanaka117) <a href="https://twitter.com/ktanaka117/status/820306447015677953">2017年1月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【1. MV○系におけr(ry】<br><br>設計の力はエンジニアによって差が出がちです。<br>それに対してCAは層と役割を細分化することによって明確な設計指標を提示することができます。<br>力量や好み関係なく統一した設計で開発を進めることができるのは大きなメリットです。<a href="https://twitter.com/hashtag/swtws?src=hash">#swtws</a></p>&mdash; ロスリックのダンボー田中 (@ktanaka117) <a href="https://twitter.com/ktanaka117/status/820307413781708803">2017年1月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【2. 処理とデータの流れが追いやすい】<br><br>CAは依存を単一方向に統一した作りになっているので、処理の流れが追いやすいです。<br>VC -&gt; Presenter -&gt; UseCase -&gt; ... と処理は流れて、戻ってくるときは必ずその逆の順になる作りなので、<a href="https://twitter.com/hashtag/swtws?src=hash">#swtws</a> <a href="https://t.co/pPlD4cOAFE">pic.twitter.com/pPlD4cOAFE</a></p>&mdash; ロスリックのダンボー田中 (@ktanaka117) <a href="https://twitter.com/ktanaka117/status/820307487492481024">2017年1月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【3. テストしやすい】<br><br>役割 = 機能として細かく分割されて独立しているのでテストしやすい作りになっています。<br>この話に関しては前の発表の参考リンクのサンプルコードにも載っていますが、各役割はそれぞれインターフェースを作る実装となることもうまく作用します。<a href="https://twitter.com/hashtag/swtws?src=hash">#swtws</a></p>&mdash; ロスリックのダンボー田中 (@ktanaka117) <a href="https://twitter.com/ktanaka117/status/820307028044152834">2017年1月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【CAを採用した際のデメリット】<br><br>これについてはさきほどの「そもそもCAってなに？」で言った通り。<a href="https://twitter.com/hashtag/swtws?src=hash">#swtws</a></p>&mdash; ロスリックのダンボー田中 (@ktanaka117) <a href="https://twitter.com/ktanaka117/status/820307229429506048">2017年1月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## 話その3: 「CAを採用すべき場面ってどういうとき？」

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">そして最後。<br>アンケートで「そもそもCAってなに？」という話と票が割れた<br>「CAを採用すべき場面ってどういうとき？」<a href="https://twitter.com/hashtag/swtws?src=hash">#swtws</a> <a href="https://t.co/598ILq8T6x">pic.twitter.com/598ILq8T6x</a></p>&mdash; ロスリックのダンボー田中 (@ktanaka117) <a href="https://twitter.com/ktanaka117/status/820307849825746944">2017年1月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【CAを利用すべきシーン】<br><br>以下が挙げられます。<br><br>・アプリの作りが複雑な場合<br>・アプリの開発期間が（大体）1年以上の規模の場合（メンテなど含む）<br><br>そのアプリの複雑さと開発規模で考えます。アーキテクチャ選定の具体的な線引きについては、今度ブログに書きます。<a href="https://twitter.com/hashtag/swtws?src=hash">#swtws</a></p>&mdash; ロスリックのダンボー田中 (@ktanaka117) <a href="https://twitter.com/ktanaka117/status/820307975440973825">2017年1月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【CAを利用すべきでないシーン】<br>利用すべきシーンに当てはまらない場合です。<br>なぜかといえば、CAは非常に大きな作りをした設計だからです。ファイル数・コード量がとても増えるため、CA以外の設計と比較した時に圧倒的にアプリを作るためにかかる工数が増えてしまうからです。<a href="https://twitter.com/hashtag/swtws?src=hash">#swtws</a></p>&mdash; ロスリックのダンボー田中 (@ktanaka117) <a href="https://twitter.com/ktanaka117/status/820308108840824833">2017年1月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【CAを利用すべきでないシーン】<br><br>どれくらいファイルが増えるかといえば添付の画像の役割分、インターフェースと実装をそれぞれ作る必要があります。作ったファイルにはそれぞれの実装が書かれますので、工数が増えるということがお分かり頂けると思います。<a href="https://twitter.com/hashtag/swtws?src=hash">#swtws</a> <a href="https://t.co/vPOWc8Wl6i">pic.twitter.com/vPOWc8Wl6i</a></p>&mdash; ロスリックのダンボー田中 (@ktanaka117) <a href="https://twitter.com/ktanaka117/status/820308227971653632">2017年1月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【CAを利用すべきでないシーン】<br><br>添付画像はCAでログイン機能を作ってみた時のものです。<br>お気づきになられただろうか...、画面左端のファイルインスペクタに映る圧倒的ファイル数...。もう一度ご覧いただk（ry<br><br>ちょっと一機能作るだけでもこんだけ多くなる<a href="https://twitter.com/hashtag/swtws?src=hash">#swtws</a> <a href="https://t.co/ZfIZOj0AnF">pic.twitter.com/ZfIZOj0AnF</a></p>&mdash; ロスリックのダンボー田中 (@ktanaka117) <a href="https://twitter.com/ktanaka117/status/820308428945883137">2017年1月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【補足】<br><br>あと一人開発の時にCAは要らない。個人開発で、CA実装の練習と思って作っているアプリがあるんですが、実装の重さと一人開発の寂しさで死ぬ。<a href="https://twitter.com/hashtag/swtws?src=hash">#swtws</a></p>&mdash; ロスリックのダンボー田中 (@ktanaka117) <a href="https://twitter.com/ktanaka117/status/820308547892187136">2017年1月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">【その他のアーキテクチャとの比較】<br><br>これまで述べてきたようにCAの採用にはそれがコストに見合うかの見極めが肝心です。<br><br>他にもMVCやMVP、MVVMにVIPERなどありますが、僕の感覚は添付の画像の通りです。詳しくは省きますが気になる方は後ほどリプください。<a href="https://twitter.com/hashtag/swtws?src=hash">#swtws</a> <a href="https://t.co/AYO8S2Y01i">pic.twitter.com/AYO8S2Y01i</a></p>&mdash; ロスリックのダンボー田中 (@ktanaka117) <a href="https://twitter.com/ktanaka117/status/820308631828606977">2017年1月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">以上でっしたー。TweetできたのでQiitaにまとめまっす😗 <a href="https://twitter.com/hashtag/swtws?src=hash">#swtws</a></p>&mdash; ロスリックのダンボー田中 (@ktanaka117) <a href="https://twitter.com/ktanaka117/status/820308825722892288">2017年1月14日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>