UserDefaultsについて
「ある画面を表示したかどうか」などの情報をアプリに保存する場合、UserDefaultsを利用する機会が多いと思います。
UserDefaultsを利用して値を保存することに目を向けがちですが、アプリ開発では機能追加だけでなく、利用しなくなった機能を削除することももちろんあります。
その際に機能を削除する際に不要となるUserDefaultsのキーを適切に扱わなければ、同一のキーを利用して意図しない動作につながってしまうケースがあります
この記事では既存の不要となったキーの管理方法についてまとめ、新しい管理方法についてまとめたものとなります。
既存の管理方法
1. キーごと削除する
不要となったキーを削除するパターンです。もし別の機能開発で全く同じキー名が利用されるケースがあった場合、未然に防ぐことができなくなるためあまりおすすめはできません。
2. prefix / suffix
利用していないキー名にprefixやsuffixを加えることで管理するパターンです。
利用されていないキーが明示的にはなりますが、キー名が増えてくると行数が増え見通しが悪くなります。
また、Active Compilation Conditions
を利用して、Release
ビルドでは含めないなどを設定しないとdeprecatedなキーが成果物に含まれてしまいます。
static let isHoge = "isHoge"
// deprecated keys
static let deprecated_isFoo = "isFoo"
.
.
.
3. コメント化
使用されなくなったキーをコメントで管理するパターンです。
筆者はこのパターン方法で管理したことはないですが、コメントで管理することで視認性が落ちるのが気になります。
static let isHoge = "isHoge"
// deprecated keys
// static let isFoo = "isFoo"
.
.
.
他にもこんな風に管理しているなどがあれば教えていただけるとありがたいです
どのような管理方法が理想か
上記のような管理方法を洗い出し、以下の用件が満たせていれば理想だと考えました。
- どのキーが使用されなくなったかがわかる状態
- 使用されいているキーと不要なキーの管理が分離されている
- 既に利用していないキー名を再度利用しようとした場合、ビルド時にエラー検知
新しい管理方法
ドットファイルとスクリプトで管理するパターンを考えてみました。
- 使用しなくなったキー名を
.unused_userdefaults_key
で管理 - buildPhaseでスクリプトを実行し、使用していないキーを利用する場合エラーを出力
1. ドットファイルを用意
使用しなくなったキー名をまとめた.unused_userdefaults_key
を用意します
is_hoge
is_foo
2. スクリプトファイルを用意
キーをまとめたswiftファイルを引数として、.unused_userdefaults_key
と一致するものが含まれていればエラーを出力するスクリプトを用意します
#!/bin/sh
file_path=$1
index_array=`cat -n ${file_path}| nl -nln | grep -f .unused_userdefaults_key | cut -d " " -f1`
if (( ${#index_array[@]} )); then
for i in ${index_array[@]}
do
echo "${file_path}:${i}:0: error: It's a key name that's already in use."
done
exit 1
fi
3. Build Phasesに組み込み
unused_userdefaults_key.sh
をBuildPhasesで実行するようにします
動作GIF
SwiftyUserDefaultsを利用した場合の動作GIFです。
GitHubにもプロジェクトを公開しているので、興味がある人は確認してみてください。
GitHub: https://github.com/funzin/UnusedUserDefaultsKeyExmaple
まとめ
不要となったUserDefaultsキーの管理方法についてまとめてみました。
削除したキーが復活して事故を防ぐには有効だと思いますので、ぜひ参考にしてもらえるとうれしいです。