eurekaに入ってから半年が経過。 pairsのAndroidアプリを開発してる。 どういう会社だとか書くのは面倒なのでやったことだけ軽くリストアップ。
やったこと
- Orma導入
- Kotlin導入
- Dagger導入
- Architecture改善
Orma導入
SQLiteいじるのにActiveAndroidを使っていた。ActiveAndroidは遅いし開発とまってるし、使い続けてもメリットは無いなということでOrmaへの移行を行った。
Ormaは速い。
クエリビルダはカラム単位でメソッドを自動生成してくれる。文字列を使ってカラム名を指定とかする必要がない。Typoによるバグは出ないし、テーブル定義でカラム名が変更されたらクエリビルダにも変更が加わるのでコンパイルが通らなくなる。
マイグレーションはリネーム以外は自動。
素晴らしいですね。
pairsはテーブル数多いしカラムも多かったのでそれなりに大変だった。
まったく根拠のない推測だけど、いまどきのネイティブアプリはDBそんなに複雑なものは無いと思うので大体の場合は大変ではないともう。
Kotlin導入
個人で一番書いている言語。仕事でも書きたいなと思ってた。
個人的にKotlinで気に入っている機能はnull安全と関数リテラル。
NPEが起こりうるコード書けない仕様になってる。
関数を変数に代入したり関数に渡したりできる。
チームに「Kotlinどう?」って聞くと、拒否反応は出なかった。
Kotlin勉強会を開いたり社内LT大会でKotlinを布教した。
フルKotlinにする予定は今のところない。ViewのみJavaで書いて、PresenterやModelはKotlinで書いてる。
追記: 結局Kotlin最高だなとなってそういった制限は撤廃された。
Dagger導入
後述するArchitectureの改善するにあたってDaggerがないと厳しい感じだったので導入。
Architecture改善
API周り・DB周りのインターフェースがstaticメソッドで、テストが書きにくかった。
class FooDao {
public static List<Foo> findAll() {
return App.getOrma().selectFromFoo().toList();
}
public static void save(Foo foo) {
App.getOrma.insertIntoFoo(foo);
}
}
class FooClient {
public static Observable<Foo> fetch() {
return Client.getRetrofit()
.create(FooService.class)
.fetch()
.doOnNext(new Action1() {
public void call(Foo foo) {
FooDao.save(foo);
}
});
}
}
リクエストの度にRetrofit#createをコールするので処理に無駄が多かった。
DB周りはOrma移行のときに改善するチャンスがあったが、移行と改善を並行させたら絶対コケると思ったのでインターフェースは全く変えてなかった。
依存する物(Service/Orma)はすべてコンストラクタで受け取るように変更。
ClientはRetrofitが生成したServiceを叩くだけのクラスに。
DaoはOrmaを叩くだけのクラスに。
RepositoryはClientで通信してDaoでINSERTする、Daoを叩いてSELECTする。
UseCaseは必要なRepositoryを使ってビジネスロジックをもつ。
PresenterはUseCaseとViewの架け橋的存在。
といった感じに。
他
最近は施策もやった。
あとはちょこちょこリファクタリングしたり、勉強会ひらいたり、AssociateEngineerやインターン生にレクチャーしたり。