これは
この記事は、Yamapエンジニア Advent Calendar 2022の12月23日の記事です。
こんにちは、YamapでiOSエンジニアをやっている竹ノ内です。
普段はiOSアプリの開発に従事しています。
Yamapアプリは、歴史のあるアプリで元々はObjective-Cで書かれていましたが、それをSwift化したり、度々のリファクタリングと並行しながら、機能追加を重ねて成長してきました。
ただ、長年運用されている影響で全体を通して、
使われていないコードががそのままになっているところもあり、見通しが悪い箇所がありました。
なので、Peripheryを導入して、シェイプアップを図ることにしました。
そもそもPeripheryとは
Peripheryとは使われていないコードに対して、警告を出してくれるライブラリです。
The goal of Periphery is to report instances of unused declarations. A declaration is a class, struct, protocol, function, property, constructor, enum, typealias, associatedtype, etc. As you'd expect, Periphery is able to identify simple unreferenced declarations, e.g a class that is no longer used anywhere in your codebase.
(Peripheryの目的は、使用されていない宣言のインスタンスを報告することです。宣言とは、クラス、構造体、プロトコル、関数、プロパティ、コンストラクタ、enum、typealias、associatedtypeなどのことです。予想通り、Peripheryは参照されない単純な宣言を特定することができます。例えば、コードベースのどこでも使用されなくなったクラスなどです。)
とのことで、
宣言して使われてない変数だけでなく、メソッドの不要な引数に対しても警告を表示してくれます。
Homebrew, SPM, CocoaPodsからインストールすることができます。
日本語だとこちらがわかりやすいかと思います。
実際に導入してみた
元々どんな状態だったのか
プロジェクト内で、Peripheryを実行すると、約1000件の警告が出ました。
導入後はどうなったのか
リファクタリングも同時に並行しながら進めていたので、全てを消したわけでないですが、
最終的に、数千行のコードの削減をすることができました🤝
ビルド時間は影響あった?
Periphery導入後で、約6秒くらいビルド時間が短くなりました。
正直微妙な差ではありますが、各メンバーやCIでのビルド時間が短くなることを考えると、
もっと大きな差になりそうです。
導入してみての感想
- 意外と機械的に消すことはできなかった
- 誤検知されているパターンもあった
- 想定より時間がかかった
- 実装ミスに気が付くこともできてよかった
- Protocolではなくて、Classを参照してるところなども修正できた
- リファクタリングを並行することができたので、コード削減以上のものができた
今後は?
毎回のビルドでPeripheryを走らせると、CIが厳しいので、1日一回実行して、Slack等に通知できれば、継続的に改善することができそうです。
以上
終わり