#2 未経験→iOSエンジニアの道のり-ライブラリと設計



# はじめに

これは #1 の続きです。プログラミング力０からアプリリリースまで行った流れを書いているのでよければどうぞ。


# Index
1. [#1 未経験→iOSエンジニアの道のり-開発に挑戦~リリースまで](https://qiita.com/57shota/items/6c31fa44340d120bec39)
2. #2 未経験→iOSエンジニアの道のり-ライブラリと設計　←　ここ
    3. 読んだ設計に関する書籍
    4. いくつかの設計パターンを実装してみる
    5. ライブラリ
3. [#3 未経験→iOSエンジニアの道のり-git周り](https://qiita.com/57shota/items/63573de6186fcaa52584)
4. [#4 未経験→iOSエンジニアの道のり- 使用ツールやwebサイト](https://qiita.com/57shota/items/b32b4a462d048e69ed32)
5. [#5 未経験→iOSエンジニアの道のり-現場着任前/後の取り組み](https://qiita.com/57shota/items/52b6238442d83cb2f13d)


## 設計とライブラリたち
アプリをリリースしたらこんな俺でもリリースできるんや！ってちょっとした自身がついたそれも束の間、もっと技術力あげたいと思い模索していると大きな問題にぶつかりました。それは、


**ちょっと変更したいことあるけど、コードがぐちゃぐちゃ過ぎて卍**


そうそれはまるで放置したスパゲッティ。「ここを変更したらこっちも変更して、んじゃこっちも変更して、あれんじゃここ全部変更か、てかこれここに書いて良いのか、ていうか始まりどこで終わりどこ？あれ、これどういう意味だっけ。…...何もでけへん」となり御手げになります。

家を建てるときはまず設計書を作って一定のルールに準拠して家を建てますよね、誰も木材をヒッチャカメッチャカ積み上げません。一つ抜いたら崩れてしまいます。まるでジェンガの後半戦です。
それを上手いことしてるくれる**設計パターン（アーキテクチャ）**というものがいくつも開発にも存在し、機能変更に最小限の変更で対応できたり、これはそっちでこれはここ！のようにチーム開発で構造理解の共有ができるようになります。

私はこの壁に全力で走り出してから大激突して大怪我をしたので、できれればアプリリリースに向けた開発を始める前に少しでも理解したい部分です。
とはいえ上にも書いたように、パターンがいくつもあります。アプリの規模や内容によって相性もあります。なので今後選定する力も必要になりますが、私が目を通した本、とりあえず実装してみたアーキテクチャを記載します。やはりここに関してはGoogleだけではきついことろがありますので、これに限らず書籍を一つくらい読むのが手っ取り早いのかなぁと感じます。


あとライブラリたち。
ライブラリとはサードパーティ製の拡張機能のようなものです。純粋な`Swift`だと面倒だったものを簡単に書けるようにしてくれるものです。
現場でほぼ確実に使用する鉄板や、私が現場に入る前に触れたもの・触れとけばよかったものをざっとまとめますので、もし私と似たような道を歩む人がいればアーキテクチャと一緒にある程度把握してリリースの際に実装して見るなどしてみるのが良いかもしれませんね。


ようやくなんとなくコードがかけるようになってきた段階でまた新たな多量の知識を詰め込むのも苦労しますので、徐々にコツコツとやっていくのが良いと思います。


# 2-1. 読んだ設計に関する書籍
## iOSアプリ設計パターン入門
https://peaks.cc/books/iOS_architecture


界隈では割と有名？な一冊です。だいたいどこに行っても紹介されている本で、設計ってどんなものがあるんだろという疑問を解消してくれるかと思います。
`MVC` `MVP` `MVVM` `Clean Architecture` `Redux`など現在現場でよく使われるものを説明されています。
私はこちらに書かれてあるサンプルコードを模写したり、自分コードにいろんなパターンを実装してみたりしました。より深く理解する、プロジェクト規模が大きくなった場合の応用には別途フローが必要になると思いますが、私が行ったのはこれだけです。設計って大変。


そして今まで自学でここまで来ているので、ここまでのフェーズだと**やったこと、ぶつかったことしか知らない**ですよね？この本に限らずですが、強制的に新しい知識にエンカウントするので知見が少し広がると思います。。
まだまだ知識が足りないと悟った私は、設計とは関係ないですが以下の本もこの段階で読み進めました。


## [改訂新版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語
https://www.amazon.co.jp/dp/B07JWCXW4R/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

設計の本ではないですが、同じタイミングで読んだので。
他にも似たような書籍がありますが、特に決定打はなく、レビュー読んだりしてさっと選びました。
ただ、初心者がいっぺん読んだだけで全部理解するのは不可能だと思ってます。なので、こんなのがあるんかーくらいで留めるだけでも触れるだけで知見は広がるかと。もちろん理解できたらそれに越したことはないです。あとは辞書的に私は活用しています。


#### 2-1 まとめ
私はとりあえず色々なパターンにざっくりなれる、知るということを行いたかったのでこの２冊は要件を満たしてくれる面ではよかったと思います。ただ、ここから各種レベルアップとなると新たな教材が必要になると思いますので試行錯誤していく必要がありあますね。


#### 段階レベル
* 設計というものを知る
* パターンの種類を知る
* ここまでで使用してこなかった書き方を知る


# 2-2. いくつかの設計パターンを実装してみる
設計について調べたりしてみると、「こいつはあーだあいつはあーだ」とかなり情報が溢れているのがわかると思いますが、できればよく使われるもの、簡単なものをから優先的に掘り下げたいと感じると思います。
私も全てをカバーした訳でもないし今だに未実装のパターンもありますが、そんな中先日qiitaにいい記事が投稿されていたので共有します。


参考記事
https://qiita.com/navitime_tech/items/602d3286f23952ae0149


パターンの有名どころの説明と、使用割合が記事の下の方にのっています。会社、チームの色などもあるので一概には言えませんが、世間的にはこんな感じらしいです。


|3年以上前|3年以内|
|:---|:---|
|1. MVC|1. MVP|
|2. MVP|2. MVVM|
|3. others|3. VIPER|
||4. others|


３年前と３年以内での新規プロジェクトに置けるアーキテクチャの採用ランキングは記事によるとこのような感じみたいです。上でも言いましたが、あくまで会社等により差はあると思います。


ちなみに弊プロジェクトでは`Redux`とか`CleanArchitecture`とかちょっと後回しにしてしまった部分がちょうど多くて苦戦してます。


## 実装してみたパターン
* MVC
* MVP
* MVVM


これに加え、以下も簡単なアプリなどで経験することを個人的におすすめします。

* Redux
* CleanArchitecture
* VIPER


#### 2-2 まとめ
リリースしたアプリの設計がカオスすぎてから気付いた部分ですが、是非大がかりな制作を行う前に設計についてある程度の理解を持つことを強く勧めます。いずれ通らなければいけないところですので、個人アプリのリリースに適応することでそれがまた経験となります。設計パターンをフルで理解するのにも時間を要しますし、プロジェクトの一部にだけ適用する、○○ + ○○の組み合わせ、など一筋縄では行かないので是非序盤で進めてください。


#### 段階レベル
* 有名どころの設計パターンをいくつか経験
* それぞれの設計の特徴を少し掴む
* Dependency Injection、RxSwiftなど新しい概念を経験


# 2-3. ライブラリ
冒頭でも説明しましたが、ライブラリとは面倒な書き方を楽にしてくれるサードパーティ製のカスタムアイテムみたいなものです。例えば、キーボードをぴゅっと出して次のフィールドにジャンプして、のような実装をするために色々書かなければいけなかったものを、数行で実装できたりなどなど。


上記で説明した一部の設計において、ほぼマストで取り入れるライブラリ等もありますので有名どころをメインに、現場に入る前に触ったもの、触っておけばよかったなと感じたものを記載します。
時間があれば触れてみてください。
なお、実装の簡単さなどの順で記載している訳ではないので悪しからず笑


## とりあえず触っておいたライブラリ


参考URLには私のQiitaストックに入っているものをいくつか紹介します。


### RxSwift
https://github.com/ReactiveX/RxSwift


Rxは**Reactive Extensions**の略で非同期処理、イベント処理の扱いに特化したライブラリ。`RxSwift`は独自の概念を採用しているのでかなり癖があります。が、知らない人はおそらくいません。MVVMアーキテクチャではだいたいセットです。現場に入る前に使いこなせるかどうかは置いておいて、概念の理解とざっと実装を経験するくらいはしておいたほうがいいと私は思います。


参考:
https://qiita.com/nakailand/items/8b54dc9b4b39b0809c57
https://qiita.com/k5n/items/e80ab6bff4bbb170122d
https://qiita.com/toRisouP/items/f6088963037bfda658d3
https://qiita.com/orimomo/items/3120aff12a06f0ab14e2


### Alamofire
https://github.com/Alamofire/Alamofire


http通信の記述に置いて、簡略化してくれるライブラリ。スポーツブランドでいうナイキレベルの立ち位置ですので絶対の経験を強く勧めます。通信系はだいたいこれを使うと行っても過言ではないんじゃないでしょうか。


参考:
https://qiita.com/asakahara/items/2b01738419a03314d845
https://qiita.com/kano0512s/items/c328f185e782b5bbddaf


#### AlamofireImage
https://github.com/Alamofire/AlamofireImage


`Alamofire`系統で画像キャッシュライブラリも使用したので記載します。要はhttp通信において取得した画像の操作をサポートしてくれるライブラリです。


### SwiftyJSON
https://github.com/SwiftyJSON/SwiftyJSON


`JSON`形式のファイル操作を簡略化してくれるライブラリ。http通信を行う場合の`JSON`ファイル操作でよく使用します。`Alamofire`とセットの使用もよく見かけるかもしれません。


参考：
https://qiita.com/yutat93/items/1b6dfe34fa8537cf3329


### SWXMLHash
https://github.com/drmohundro/SWXMLHash


`XML`形式のファイル操作を簡略化してくれるライブラリ。http通信を行う場合の`XML`ファイル操作でよく使用します。あまり`XML`ファイルの操作は多くないと思いますが、使用用途は上記同様です。


参考：
https://qiita.com/hgffgh/items/f5fa228560ddc660d6bb


### IQKeyboard
https://github.com/hackiftekhar/IQKeyboardManager


キーボード操作を簡略化してくれるライブラリ。複数フィールドが縦に並ぶ文字入力の場合、スキップボタンのタップで次へジャンプのような実装を求められますが、これを導入すると一瞬です。楽すぎてずっと使っているので、私正直キーボードの実装わかりません。


### LTMorphingLabel
https://github.com/lexrus/LTMorphingLabel


飛び道具感強いですが、ラベルに様々なアニメーションエフェクトをかけてくれるライブラリです。就活中の技術課題で使用しましたが、ちょうど私が求めているもので使い勝ってものよく楽しいです。


## 出来れば触っておきたかったライブラリ


### ReSwift
https://github.com/ReSwift/ReSwift


どうやら`Javascript`界隈では有名？な`Redux`を`Swift`でも実装できるようにしてくれたのがこちら。上記の設計のパートでもあげた`Redux`を実装する際はマストで入るでしょう。私は`Redux`自体を入社前に実装していなかったので、この二つをペアで経験しておいたらよかったなと感じました。


参考：
qiitaではないですが実装を試してみるのなら私の好きなraywenderlichのチュートリアルがわかりやすかったです。
https://www.raywenderlich.com/516-reswift-tutorial-memory-game-app


割と使えるwebサイトは　#5  にて紹介するのでよければどうぞ。


### Moya
https://github.com/Moya/Moya


`Moya`は実は内部で`Alamofire`を叩いている通信系ライブラリで、局部的な使用だった`Alamofire`のラッパー的立ち回りをしてくれるライブラリです。イメージは上記リンクから確認できると思いますが、これも有名なので触りくらいはしておいてもよかったかなと感じました。ですが、オプショナルですので`Alamofire`を先に触ることを勧めます。


### SwiftLint
https://github.com/realm/SwiftLint


SwiftLintはコード解析ツールと呼ばれているもので、1行に対する記述が多すぎないか、ネストが深くないかなどを解析してくれます。チーム開発で統一性を持たせたい時に非常に役立ちますね。


### Realm Database
https://github.com/realm/realm-cocoa


CoreDataなどの代替えとなるデータ保存やデバイス間データ同期をさぽーとしてくれるデータストアライブラリ。個人アプリでのデータ保存はUserDefaultsを使用していたのでこういうのも経験しておけば良かったと感じました。レルムと読むそうですが、今の今までリアルムかと思っていました。まぁ、所詮カタカナなんでどちらでもいいんじゃないですかね。。あとロゴのデザインが素敵です。


参考
https://qiita.com/ottijp/items/35dee1c03e055e450c81


### Kingfisher
https://github.com/onevcat/Kingfisher


こちらもhttp通信に置ける画像キャッシュ系ライブラリですが、alamofireImageよりを人気があるようです。様々なプロジェクトで見かけるので用途たけ攫っておくくらいしても損はないかと思います。


上記のAlamofireImageを含んだ画像キャッシュ系ライブラリの比較記事がありますので、違いは以下を参考にしていただければと思います。
参考
https://qiita.com/H_Crane/items/422811dfc18ae919f8a4


### R.swift
https://github.com/mac-cain13/R.swift


R.swiftは、コード補完によりリソースファイルにアクセスができるようになり、ハードコーディング によるスペルミスエラーの防止などに役立ちます。いろんなプロジェクトを落としてきて覗くとプロジェクト内にR.swiftというファイルがよくあるので、これを知る前は 触っちゃいけなそうなデフォルトのシステム的なファイル みたいに思っていました笑
理解しておくだけで混乱を招かなくなるのでサラッと攫っておいてもいいと思います。


参考
https://medium.com/@daikimochizuki/ios-swift-4-r-swift%E3%81%A7%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E7%AE%A1%E7%90%86%E3%82%92%E6%A5%BD%E3%81%A1%E3%82%93%E3%81%AB-7047feb37f01


#### 2-3 まとめ
使ってみたアプリ、出来ればやっておいたほうがよかったライブラリを紹介しました。ライブラリは様々な種類があり、初めのまだコードを読むことに慣れていない頃は元々のコードなのかライブラリが干渉している書き方なのかもわからず読解に時間がかかります。ライブラリを用いている場合は決まった書き方をしていることも多いので、たくさん知っていると読解力も上がり一番最初にプロジェクトに取りかかる時のストレスがだいぶ軽減されるかと思うので、出来るだけ事前に把握しておきたいなという部分です。


#### 段階レベル
* 有名どころのライブラリをいくつか
* `RxSwift`に苦戦が、概念とオブザーバーパターンなどを理解
* なんとなく現場ではこういうライブラリが使用されているのかなと把握


# #2まとめ
設計パターンやライブラリをたくさん知っておくというのは、綺麗なコードライティングに直接的に繋がりますが、リーディングにすごく影響があると感じています。何十何百というファイル数を扱う現場のプロジェクトを目の前に出された時、上記二つの知見があるとコード、データの動きの推測が可能になり、読解をサポートしてくれます。
プログラミングは慣れれば慣れるほど、読み書きのスピードが上がると思いますので、今後のためにも早い段階でどんどん顔を突っ込んでいくとあとあと楽になるんじゃないでしょうか。


次は開発で利用必須の`git`について書いています。
次 → 3. [#3 未経験→iOSエンジニアの道のり-git周り](https://qiita.com/57shota/items/63573de6186fcaa52584)