これまで、個人開発で製作してきたAndroidアプリ「書籍管理ができる巻数メモ」は継続的に機能追加するアップデートは行ってきたものの、リファクタリングによって刷新するような事はしてきませんでした。
仕事でもAndroidアプリを開発するようになり、知識も少しずつ増えてきたので、思い切ってリファクタリングをしてみることにしました。
なぜリファクタリング?
個人開発をしていると、ゼロから作ったり、どんどん機能を追加したりすることはよくありますが、既存機能をリファクタリングするというのは、やろう!って思わないとなかなかやらないと思います。
リファクタリングの難しいところは、
- 変更後も既存と同等の機能を実現する
- 変更前のデータも引き継ぐ
etc...
既にサービスを提供しているものをそのまま継続して利用できるようにしなければなりません。なので、リファクタリングをするということも新しい技術的な知識が習得できると思ったのが背景にあります。
今回のリファクタリングの要点
今回、リファクタリングによって変更したポイントは以下です。
- 画面レイアウトの全面的な刷新
- JavaからKotlinへの使用言語の変更
- LiveDataを利用したMVVMモデルへの刷新
- DBアクセスをSQLiteOpenHelperからRoomライブラリへの変更
それぞれの内容について具体的に書いていきたいと思います。
画面レイアウト
せっかくなので、最初は画面レイアウトも刷新しました。
アプリのテーマカラーを基調としてマテリアルデザイン風にしてみました。
ActivityもFragmentActivityからAppCompatActivityを継承するように変更したり、フローティングボタンを活用するように変更してみました。
JavaからKotlinへの使用言語の変更
これまでずっとJavaを利用してAndroidアプリを開発していましたが、仕事でもKotlinを利用するようになり、だいぶKotlin言語にも慣れてきたので、全部Kotlinで書き直すことにしました。
といっても、AndroidStudioには便利な機能があるため、まずは以下の操作でJavaファイルをKotlinファイルへ一気に変換します。
app/javaフォルダを右クリック→「Convert Java File to Kotlin File」を選択
もちろん、ただ変換しただけではビルドが通らないので、この後はひたすらエラーとなっている箇所を修正していきました。
LiveDataを利用したMVVMモデルへの刷新
今回のリファクタリングで大きく刷新した部分はアーキテクチャです。
修正前後でのクラス図については以下のようになります。
修正前
修正後
修正前では、ListDataManagerクラスがデータを管理する形となっており、SQliteOpenHelperを継承したListDataOpenHelperを利用してDBへのアクセスを行っていました。
修正後では、ComicMemoRoomDatabaseクラスでRoomライブラリを利用したDBへのアクセスの実現と、ComicPagerViewModelクラスが非同期でのDB操作のAPIの提供と、DB更新完了時のLiveDataを利用した更新通知を実現することで、MVVMモデルへのアーキテクチャ変更を行いました。
DBアクセスをSQLiteOpenHelperからRoomライブラリへの変更
DBアクセスをRoomライブラリを利用した実装に変更する際に気をつけるのが、データエンティティクラスの定義と、データアクセスオブジェクトクラスの定義です。
今回は、それぞれComicクラスとComicDaoクラスを定義しました。
また、SqliteOpenHelperを利用したテーブル定義からRoomライブラリを利用したテーブル定義へと変更する場合には、テーブルデータのマイグレーションを行う必要がありました。
各カラムの変数名や型を合わせても実はあってなかったという場合には、「Migration didn't properly handle」というExceptionが発生してしまいます。
この原因としては、例えばエンティティをLong型で定義してもSQLiteの型になるときにはINTEGERとなったりしますし、null許容型変数で定義をしない場合は移行前のテーブルもNOT NULL制約が付いている必要がありました。
移行前後でカラムの型を合わせるためにMigrationクラスのmigrateメソッドをoverrideして合わせました。
具体的なソースコードは、以下から参照出来ますので参照してみてもらえればと思います。
※v2.5タグとv3.0.0タグを比較すると分かりやすいと思います。
さいごに
リファクタリングしたアプリは既にGooglePlayで公開されていますので是非触ってみて下さい!
GitHubのソースコードを参照しながら動作を見てもらうとより分かりやすいのではないかと思います。
また、今回のアーキテクチャを適用するにあたり、参考にしたサイトは以下となりますのでこちらもおすすめです!
所用時間は60分でハンズオン形式で学ぶ事が出来ます。
Codelab Android Room とビュー - Kotlin