2019年1月15日に発売された『iOSアプリ設計パターン入門』が非常に良書だったので紹介します。自分は設計に対してある悩みを抱えていたのですが、この本を読んで一気に解決ました。
iOSエンジニア以外でも参考になるの?
この書籍を紹介された非iOSエンジニアは当然、 「iOS開発してないけど参考になるの?」 と思うでしょう。結論から言うとなります。 事実、自分は機械学習エンジニアでiOSアプリ開発はチュートリアル程度しか経験がないですが、タイトルに書いたように非常に救われました。
この本を読むきっかけは「会社で開催されている読書会の課題図書になったこと」でしたが、その読書会参加メンバー内にもiOSエンジニアは1人もいませんでした。それでも、みんなで話し合って「これにしよう」と決めたという経緯があります。
自分の悩み: 「パターンはわかった。でもどう使うの?」
まずどんなエンジニアにとって良書だったのかという意味で、自分の悩みについて簡単に書きます。
自分の設計に関する一番大きな悩みは、「本で学んだ『理論』や『パターン』をどう実際のアプリケーションに落とし込んでいけばいいかわからない」、というものでした。今までも設計に悩むことは多く、「Java言語で学ぶデザインパターン入門」「エンタープライズ アプリケーションアーキテクチャパターン」「エリック・エヴァンスのドメイン駆動設計」「Clean Architecture 達人に学ぶソフトウェアの構造と設計」など設計に関する書籍はそれなりに(完璧に理解しているかは置いておいて)読んできたのですが、「学んだパターンをどう活用すれば良いか」が恥ずかしながら全く「腹落ち」していませんでした。
「どう活用すれば良いか」だと抽象度が高いので、もう少しだけ具体的に書くと、ある開発プロジェクトにおいて「どのパターンを使うべきで、どのパターンを使うべきでないのかわからない」ということです。例えば過度に設計パターンを詰め込み過ぎたアンチパターンとして「FizzBuzzEnterpriseEdition」が有名ですが、こういった情報から「ただ設計パターンを使えばいいわけではない」ということはわかっています。それでは「どう設計パターンを選んでいけば良いのだろう?」、 それが自分の悩みでした。
ざっくりと全体の内容
全体の内容ですが、下記のように大きく3部構成になっています。「第Ⅰ部」は「設計パターンとは何か、どう実際に適用していけばいいか」、「第Ⅱ部」は「設計パターン1つ1つの丁寧な解説」、「第Ⅲ部」は「実践編で実際のアプリケーション開発を基にしながら設計パターンの解説」という内容です。
- 第Ⅰ部 設計を知る
- 第1章 設計するということ
- 第2章 設計にパターンを適用する前に
- 第3章 Swiftらしく設計する
- 第4章 アーキテクチャのパターンを鳥瞰する
- 第Ⅱ部 iOSアプリのための設計パターン
- 第5章 MVC
- 第6章 MVP
- 第7章 MVVM
- 第8章 Flux
- 第9章 Redux
- 第10章 Clean Architecture
- 第11章 アプリの起動経路
- 第12章 画面遷移のパターン ~ Routerの導入
- 第13章 第2部まとめ ~ アーキテクチャの選定基準
- 第Ⅲ部 設計をサービスに導入する
- 第14章 Fluxの導入例
- 第15章 Reduxの導入例 - 大規模アプリケーションにReduxを導入する
自分のような悩みを持っているエンジニアには「第Ⅰ部」が非常に参考になると思います。「第Ⅱ部」はアーキテクチャそのものを勉強したい人にオススメです。「第Ⅲ部」は非iOSエンジニアにはちょっと馴染みがなく理解するのが難しいかもしれません。
それでは詳細に、この本のおすすめポイントを書いていきます。
理論と理論をつなげてくれる👍
この本の一番素晴らしいところは「理論と理論をつなげてくれる」ところだと思います。 特に「第2章 設計にパターンを適用する前に by @takasekさん」が自分にとっては感銘深い内容でした。
例えば下記のような記載があります。
設計の原則は無制限にシステム全体に振りまくような香水ではありません。過度に原則を使いすぎた設計は逆に「不必要な複雑さ」という臭いを放つことになります。 設計の原則を適用するためにはひとつの前提があるということが分かります。それは、適切な設計の判断のためには変更可能性がどこにあるか知らなくてはならない ということです。
まさにこれは自分が感じていた「どう設計パターンを使えばよいのか」という悩みです。その後、こう続きます。
...(略)... ただそのような努力をしても、想定しない変更に行き当たることがしばしばあります。考えていた計画が頓挫することもあります。開発はいつだって、想定どおりに進まないものです。 それでは結局、私たちはどんな変更にも対応できるようにするしかないのでしょうか。この矛盾にどう対処すればいいのでしょうか。
まずここに非常に共感しました。「どう設計を決定するか」という問いに対しては、「よく考えて適切な設計をするしかない」という結論になりがちです。この問題に対して真っ向から回答しているものは少ないと思います。しかし、本書では明確に答えています。
答えは、 リファクタリングです。 ...(略)...そのためにはテストが必要であり、ひいては設計はテストのしやすさを前提に進める必要があります。
また、具体的な設計についても次のように述べられています。
パターンが最初にあるのではなく、コードを修正していく過程で、その最終形にパターンを見出すのです。 ...(略)...スタートは単純な設計からです。もしそこで既知のパターンが適用できそうであれば、その結果どうなるかを想像できます。パターンの利点・欠点は分析済みですので、いきなり完成度の高い設計に辿り着くこともありえます。あるいは少しずつテストを書きながらリファクタリングを進めることもありえるでしょう。
「なるほど、自分が求めていた答えはこれだったんだ…」と目から鱗が落ちる気持ちでした。もちろんリファクタリングもテストも知っていたのですが、設計と結び付けられていませんでした。自分が知っている知識の中に答えがあったことに驚きでした。
今まで自分の中で「点と点だった概念が線で繋がった」ような感覚でした。 おそらく今まで読んだ有名な本でも、同じようなことが書いてあったとは思うのですが、読みやすい言葉で簡潔に書かれていて非常に「腹落ち」しました。
読み終わった後に@takasekさんのTweetを拝見したのですが、強い意思を持ってこれらの章が書かれていたようです。意思に比例した素晴らしい内容だと思いました。
「設計」を語るとき、アーキテクチャパターンの説明に一足飛びにいくのはとてもありがちな間違いなので、それを防ぎたくて「iOSアプリ設計パターン入門」では「設計とは何か、なぜ必要か」をまず丁寧に整理した結果、その前置きは80ページほどに膨らんだのでした
— takasek (@takasek) 2019年4月30日
でもそれだけ大事な話だと思うんですよ
アーキテクチャの教科書として優秀 👍
「第4章 アーキテクチャのパターンを鳥瞰する by @takasekさん」では「GUIアーキテクチャ」「システムアーキテクチャ」に分類して、MVC、MVP、MVVM、Flux、Redux、レイヤードアーキテクチャ、Hexagonal Architecture、Clean Architectureといったアーキテクチャパターンを歴史を踏まえて簡潔に紹介されています。そもそも有名なアーキテクチャパターンの概要が知りたい方はこの章だけ読むのもオススメです。
また「第Ⅱ部」では詳細に1つ1つのアーキテクチャに関しての説明があり、更に深掘りすることができます。知りたいアーキテクチャについて書かれている章をピックアップして読むのも良いと思います。
出てくるコードが「天然モノ」に近い 👍
こういった設計に関する書籍ではサンプルコードが頻繁に出てきますが、概して「養殖モノ」のコードになりがちです。コードの「天然モノ」「養殖モノ」についてはajito.fmというPodcastでも語られていますが、設計について本当は「実際の現場にある天然モノ」で説明したいが、どうしても「説明用に作った実際にはあり得ないような養殖モノ」になってしまうという話です。
本書籍では出てくるサンプルコードが比較的「天然モノ」感があり、「自分もこういうコード書いてるな」という共感を持って読み進めることができました。その分1つ1つのサンプルコードが長めなのですが、自分的には納得感を持って読めて良かったです。
Swift、iOS開発にも興味が出てくる 👍
「非iOSエンジニアでも読める」と書いたのですが、サンプルコードを読むにあたって最低限のSwift知識があるとより良いかもしれません。Swiftはモダンでスタイリッシュな言語なのでRubyやPython、Javaなどが読める方は8割くらいは読めるのですが、一部独自の言語仕様があります。
自分はSwiftはほとんど知らない状態だったのですが、少しSwiftを調べている中でSwiftの enum
の表現力の高さや willSet
、 didSet
など便利な機能などを知り、「Swift面白い」、単純にもっとSwiftが知りたい! と思いました。 先日Swift UIも発表され、iOS開発も気になっていたので休日にSwiftを使ってiOSアプリ作ってみたいです。
Swiftを勉強するにあたって便利なリンクも貼っておきます。基本的には公式のSwift Tourを読めばほとんどわかると思いますが、日本語版がないこともあり、細かい内容に関してはQiitaでわかりやすい記事を書いている方がたくさんいらっしゃったので参考にしました。
- A Swift Tour — The Swift Programming Language (Swift 5.1)
- Swiftのプロパティ監視(willSet/didSet)の挙動について調べてみた - Qiita
- Swift では Protocol を積極的に使おう - Qiita
- Swiftの列挙型(enum)おさらい - Qiita
- Swiftと3種類のポリモーフィズム - Qiita
さいごに
非iOSエンジニアにもオススメな『iOSアプリ設計パターン入門』の紹介をしました。 自分のように「設計パターンは一通り勉強したけど、実際のアプリケーションにどう適用すればいいの?」という悩みを持っている方に非常にオススメです。 iOSエンジニアだけに読まれるには勿体無い良書なので、是非皆さん読んでみてください。