Droidkaigi2018 day1 参加メモ

まだ途中

Kotlinアンチパターン

以下の環境で得られたアンチパターンについて紹介

  • 巨大なアプリ
  • メンバーの開発経験が様々
  • 最大11人

lateinitのnull初期化

  • 通信後などonCreateなどよりはるか後の処理で初期化してしまい、初期化前にアクセスしてしまう

補足

  • kotlin 1.2 から isInitializedが追加され

apply内でプロパティアクセス形式の処理を書く

  • ローカル線数を宣言すると参照する変数が変わりバグになる

解決策

  • メソッドがあればメソッドアクセスにする
  • apply内はthis必須にする
  • applyを禁止してalsoを使う

nullableのままデータを引き回す

  • 毎回nullの考慮が必要になる

nonnullにするために無効なデータを入れる

  • 無効なデータに意味がある場合にバグる
  • nullが何を表すかで処理するレイヤを決めることで解決

data classのインスタンス生成用のメソッドで制約を持たせる

  • copyメソッドで1部のプロパティのみ変更できるので、制約が守られなくなる

処理を共有化するためだけにBaseクラスを肥大化させる

  • javaでは継承余地も異常と言われていたが、intefeceのdefault実装で共通化すると良さそう
  • java8からあるがminSDKversionを24以降にする必要があったのでKotlinのアンチパターンとして紹介
  • 状態を使いたい場合はclass delegationを使うと良い

拡張関数

  • 一般性がない、局所的にしか使わないメソッドを追加する
  • 公式でありそうな名前なのに雑に実装する
  • 拡張関数が便利なので乱発しがち
  • interfaceのデフォルト実装のスコープに限定する

通常の代入、lazy、custom getterをよくわからすに使う


補足

  • delegated propertyを使うとgetter/setter処理を移譲できる

fragmentのviewをlazyにする

custom getter 値を取得する過程で副作用がある、計算量が多い

  • このような場合はメソッドにする

custom setter で常に必要とは限らない処理をしている

  • 値だけを変更することができなくなってしまう
  • 更新用の処理は関数で提供するほうが良いケースも有る

Deep dive into LayoutManager for RecyclerView

  • キャッシュは2つある
    • recycle
    • scrap
  • RecyclerView.LayoutManagerのsupportsPredictiveItemAnimationsを紹介

DataBindingのコードを読む

  • BindingAdapterをインスタンスメソッドに定義できる
    • Componentを用意して追加する感じ
  • InverseBindingAdapterを使って双方向バインディングの定義ができる

Android における Model-View-Intent アーキテクチャ

セッションは聞いていないのでtwitterを見ていて気になったところだけメモ

マルチモジュールのすヽめ

なぜマルチモジュールなのか

  • 主要機能だけではなくログイン・ログアウトや強制アップデートのサブ機能が多く複雑になっている
  • ログイン・ログアウト、強制アップデートの機能をモジュールとして切り出してマルチモジュール化
  • Android Instant App対応するにはマルチモジュールする必要がある
  • Android Gradle Plugin 3.0.0からマルチモジュールプロジェクトのパフォーマンス・チューニングが行われた
  • domainそうにAccessTokenを持っていてでもそれはinfra層から使うよね。
  • AccessTokenを別モジュールに分けることで上位の層を用意していろいろなところからアクセスできるようにした

デメリット

  • databindingとの相性が悪い
  • appにもmoduleにもdatabindingの生成物か生成作られるようになった
  • moduleでrecyclerViewのBindingaAdapterを定義した場合にappにもrecyclerViewを追加するする必要がある
  • Data Binding Compiler V2で解消される予定

モジュールの分け方について

  • レイアで分ける or 意味のある単位で分ける
  • レイアだけでやるのはおすすめしない。
  • 意味あるまとまりで分けて、さらにレイアで分けると良い

Case Annict

  • 機能整理する
  • 明らかに主要機能から外れている機能を探す
  • 機能間の依存関係を洗い出す
  • グルーピングして依存関係を考える
    • 基盤機能を考える

実際にマルチモジュールにしてみる

  • New Moduleすれば追加できる
  • Androidに依存するならAndroid Module。そうでなければJava Module。
  • modulesディレクトリを作ると見通しが良くなる

モジュール間の連携について

  • moduleをまたがった情報を表示するときどうするか
    • 各moduleでfragmentを定義して、まとめ画面ではatatchするだけにしている
  • 他モジュールから情報を取得したい
  • 最上位層のみを公開する。ViewとServiceで分けている