はじめに
これは #1 の続きです。プログラミング力0からアプリリリースまで行った流れを書いているのでよければどうぞ。
Index
- #1 未経験→iOSエンジニアの道のり-開発に挑戦~リリースまで
- #2 未経験→iOSエンジニアの道のり-ライブラリと設計 ← ここ
3. 読んだ設計に関する書籍
4. いくつかの設計パターンを実装してみる
5. ライブラリ - #3 未経験→iOSエンジニアの道のり-git周り
- #4 未経験→iOSエンジニアの道のり- 使用ツールやwebサイト
- #5 未経験→iOSエンジニアの道のり-現場着任前/後の取り組み
設計とライブラリたち
アプリをリリースしたらこんな俺でもリリースできるんや!ってちょっとした自身がついたそれも束の間、もっと技術力あげたいと思い模索していると大きな問題にぶつかりました。それは、
ちょっと変更したいことあるけど、コードがぐちゃぐちゃ過ぎて卍
そうそれはまるで放置したスパゲッティ。「ここを変更したらこっちも変更して、んじゃこっちも変更して、あれんじゃここ全部変更か、てかこれここに書いて良いのか、ていうか始まりどこで終わりどこ?あれ、これどういう意味だっけ。…...何もでけへん」となり御手げになります。
家を建てるときはまず設計書を作って一定のルールに準拠して家を建てますよね、誰も木材をヒッチャカメッチャカ積み上げません。一つ抜いたら崩れてしまいます。まるでジェンガの後半戦です。
それを上手いことしてるくれる**設計パターン(アーキテクチャ)**というものがいくつも開発にも存在し、機能変更に最小限の変更で対応できたり、これはそっちでこれはここ!のようにチーム開発で構造理解の共有ができるようになります。
私はこの壁に全力で走り出してから大激突して大怪我をしたので、できれればアプリリリースに向けた開発を始める前に少しでも理解したい部分です。
とはいえ上にも書いたように、パターンがいくつもあります。アプリの規模や内容によって相性もあります。なので今後選定する力も必要になりますが、私が目を通した本、とりあえず実装してみたアーキテクチャを記載します。やはりここに関してはGoogleだけではきついことろがありますので、これに限らず書籍を一つくらい読むのが手っ取り早いのかなぁと感じます。
あとライブラリたち。
ライブラリとはサードパーティ製の拡張機能のようなものです。純粋なSwift
だと面倒だったものを簡単に書けるようにしてくれるものです。
現場でほぼ確実に使用する鉄板や、私が現場に入る前に触れたもの・触れとけばよかったものをざっとまとめますので、もし私と似たような道を歩む人がいればアーキテクチャと一緒にある程度把握してリリースの際に実装して見るなどしてみるのが良いかもしれませんね。
ようやくなんとなくコードがかけるようになってきた段階でまた新たな多量の知識を詰め込むのも苦労しますので、徐々にコツコツとやっていくのが良いと思います。
2-1. 読んだ設計に関する書籍
iOSアプリ設計パターン入門
界隈では割と有名?な一冊です。だいたいどこに行っても紹介されている本で、設計ってどんなものがあるんだろという疑問を解消してくれるかと思います。
MVC
MVP
MVVM
Clean Architecture
Redux
など現在現場でよく使われるものを説明されています。
私はこちらに書かれてあるサンプルコードを模写したり、自分コードにいろんなパターンを実装してみたりしました。より深く理解する、プロジェクト規模が大きくなった場合の応用には別途フローが必要になると思いますが、私が行ったのはこれだけです。設計って大変。
そして今まで自学でここまで来ているので、ここまでのフェーズだとやったこと、ぶつかったことしか知らないですよね?この本に限らずですが、強制的に新しい知識にエンカウントするので知見が少し広がると思います。。
まだまだ知識が足りないと悟った私は、設計とは関係ないですが以下の本もこの段階で読み進めました。
[改訂新版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語
設計の本ではないですが、同じタイミングで読んだので。
他にも似たような書籍がありますが、特に決定打はなく、レビュー読んだりしてさっと選びました。
ただ、初心者がいっぺん読んだだけで全部理解するのは不可能だと思ってます。なので、こんなのがあるんかーくらいで留めるだけでも触れるだけで知見は広がるかと。もちろん理解できたらそれに越したことはないです。あとは辞書的に私は活用しています。
2-1 まとめ
私はとりあえず色々なパターンにざっくりなれる、知るということを行いたかったのでこの2冊は要件を満たしてくれる面ではよかったと思います。ただ、ここから各種レベルアップとなると新たな教材が必要になると思いますので試行錯誤していく必要がありあますね。
段階レベル
- 設計というものを知る
- パターンの種類を知る
- ここまでで使用してこなかった書き方を知る
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 |
3年前と3年以内での新規プロジェクトに置けるアーキテクチャの採用ランキングは記事によるとこのような感じみたいです。上でも言いましたが、あくまで会社等により差はあると思います。
ちなみに弊プロジェクトではRedux
とかCleanArchitecture
とかちょっと後回しにしてしまった部分がちょうど多くて苦戦してます。
実装してみたパターン
- MVC
- MVP
- MVVM
これに加え、以下も簡単なアプリなどで経験することを個人的におすすめします。
- Redux
- CleanArchitecture
- VIPER
2-2 まとめ
リリースしたアプリの設計がカオスすぎてから気付いた部分ですが、是非大がかりな制作を行う前に設計についてある程度の理解を持つことを強く勧めます。いずれ通らなければいけないところですので、個人アプリのリリースに適応することでそれがまた経験となります。設計パターンをフルで理解するのにも時間を要しますし、プロジェクトの一部にだけ適用する、○○ + ○○の組み合わせ、など一筋縄では行かないので是非序盤で進めてください。
段階レベル
- 有名どころの設計パターンをいくつか経験
- それぞれの設計の特徴を少し掴む
- Dependency Injection、RxSwiftなど新しい概念を経験
2-3. ライブラリ
冒頭でも説明しましたが、ライブラリとは面倒な書き方を楽にしてくれるサードパーティ製のカスタムアイテムみたいなものです。例えば、キーボードをぴゅっと出して次のフィールドにジャンプして、のような実装をするために色々書かなければいけなかったものを、数行で実装できたりなどなど。
上記で説明した一部の設計において、ほぼマストで取り入れるライブラリ等もありますので有名どころをメインに、現場に入る前に触ったもの、触っておけばよかったなと感じたものを記載します。
時間があれば触れてみてください。
なお、実装の簡単さなどの順で記載している訳ではないので悪しからず笑
とりあえず触っておいたライブラリ
参考URLには私のQiitaストックに入っているものをいくつか紹介します。
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
http通信の記述に置いて、簡略化してくれるライブラリ。スポーツブランドでいうナイキレベルの立ち位置ですので絶対の経験を強く勧めます。通信系はだいたいこれを使うと行っても過言ではないんじゃないでしょうか。
参考:
https://qiita.com/asakahara/items/2b01738419a03314d845
https://qiita.com/kano0512s/items/c328f185e782b5bbddaf
AlamofireImage
Alamofire
系統で画像キャッシュライブラリも使用したので記載します。要はhttp通信において取得した画像の操作をサポートしてくれるライブラリです。
SwiftyJSON
JSON
形式のファイル操作を簡略化してくれるライブラリ。http通信を行う場合のJSON
ファイル操作でよく使用します。Alamofire
とセットの使用もよく見かけるかもしれません。
参考:
https://qiita.com/yutat93/items/1b6dfe34fa8537cf3329
SWXMLHash
XML
形式のファイル操作を簡略化してくれるライブラリ。http通信を行う場合のXML
ファイル操作でよく使用します。あまりXML
ファイルの操作は多くないと思いますが、使用用途は上記同様です。
参考:
https://qiita.com/hgffgh/items/f5fa228560ddc660d6bb
IQKeyboard
キーボード操作を簡略化してくれるライブラリ。複数フィールドが縦に並ぶ文字入力の場合、スキップボタンのタップで次へジャンプのような実装を求められますが、これを導入すると一瞬です。楽すぎてずっと使っているので、私正直キーボードの実装わかりません。
LTMorphingLabel
飛び道具感強いですが、ラベルに様々なアニメーションエフェクトをかけてくれるライブラリです。就活中の技術課題で使用しましたが、ちょうど私が求めているもので使い勝ってものよく楽しいです。
出来れば触っておきたかったライブラリ
ReSwift
どうやらJavascript
界隈では有名?なRedux
をSwift
でも実装できるようにしてくれたのがこちら。上記の設計のパートでもあげたRedux
を実装する際はマストで入るでしょう。私はRedux
自体を入社前に実装していなかったので、この二つをペアで経験しておいたらよかったなと感じました。
参考:
qiitaではないですが実装を試してみるのなら私の好きなraywenderlichのチュートリアルがわかりやすかったです。
https://www.raywenderlich.com/516-reswift-tutorial-memory-game-app
割と使えるwebサイトは #5 にて紹介するのでよければどうぞ。
Moya
Moya
は実は内部でAlamofire
を叩いている通信系ライブラリで、局部的な使用だったAlamofire
のラッパー的立ち回りをしてくれるライブラリです。イメージは上記リンクから確認できると思いますが、これも有名なので触りくらいはしておいてもよかったかなと感じました。ですが、オプショナルですのでAlamofire
を先に触ることを勧めます。
SwiftLint
SwiftLintはコード解析ツールと呼ばれているもので、1行に対する記述が多すぎないか、ネストが深くないかなどを解析してくれます。チーム開発で統一性を持たせたい時に非常に役立ちますね。
Realm Database
CoreDataなどの代替えとなるデータ保存やデバイス間データ同期をさぽーとしてくれるデータストアライブラリ。個人アプリでのデータ保存はUserDefaultsを使用していたのでこういうのも経験しておけば良かったと感じました。レルムと読むそうですが、今の今までリアルムかと思っていました。まぁ、所詮カタカナなんでどちらでもいいんじゃないですかね。。あとロゴのデザインが素敵です。
参考
https://qiita.com/ottijp/items/35dee1c03e055e450c81
Kingfisher
こちらもhttp通信に置ける画像キャッシュ系ライブラリですが、alamofireImageよりを人気があるようです。様々なプロジェクトで見かけるので用途たけ攫っておくくらいしても損はないかと思います。
上記のAlamofireImageを含んだ画像キャッシュ系ライブラリの比較記事がありますので、違いは以下を参考にしていただければと思います。
参考
https://qiita.com/H_Crane/items/422811dfc18ae919f8a4
R.swift
R.swiftは、コード補完によりリソースファイルにアクセスができるようになり、ハードコーディング によるスペルミスエラーの防止などに役立ちます。いろんなプロジェクトを落としてきて覗くとプロジェクト内にR.swiftというファイルがよくあるので、これを知る前は 触っちゃいけなそうなデフォルトのシステム的なファイル みたいに思っていました笑
理解しておくだけで混乱を招かなくなるのでサラッと攫っておいてもいいと思います。
2-3 まとめ
使ってみたアプリ、出来ればやっておいたほうがよかったライブラリを紹介しました。ライブラリは様々な種類があり、初めのまだコードを読むことに慣れていない頃は元々のコードなのかライブラリが干渉している書き方なのかもわからず読解に時間がかかります。ライブラリを用いている場合は決まった書き方をしていることも多いので、たくさん知っていると読解力も上がり一番最初にプロジェクトに取りかかる時のストレスがだいぶ軽減されるかと思うので、出来るだけ事前に把握しておきたいなという部分です。
段階レベル
- 有名どころのライブラリをいくつか
-
RxSwift
に苦戦が、概念とオブザーバーパターンなどを理解 - なんとなく現場ではこういうライブラリが使用されているのかなと把握
#2まとめ
設計パターンやライブラリをたくさん知っておくというのは、綺麗なコードライティングに直接的に繋がりますが、リーディングにすごく影響があると感じています。何十何百というファイル数を扱う現場のプロジェクトを目の前に出された時、上記二つの知見があるとコード、データの動きの推測が可能になり、読解をサポートしてくれます。
プログラミングは慣れれば慣れるほど、読み書きのスピードが上がると思いますので、今後のためにも早い段階でどんどん顔を突っ込んでいくとあとあと楽になるんじゃないでしょうか。
次は開発で利用必須のgit
について書いています。
次 → 3. #3 未経験→iOSエンジニアの道のり-git周り