Skip to content

Instantly share code, notes, and snippets.

@ikesyo
Last active August 9, 2020 01:19
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ikesyo/1641650a09c8c8b928d60f58a4245967 to your computer and use it in GitHub Desktop.
Save ikesyo/1641650a09c8c8b928d60f58a4245967 to your computer and use it in GitHub Desktop.
Type aliasesによる互換性確保 #Kansaikt

Type aliasesによる互換性確保

Kansai.kt #4 〜呑んだくれLT大会〜の発表資料とさせてください。

自己紹介

今日はAndroid寄りの話をします

AndroidXの移行のdiffを見るの大変ですよね

  • AndroidX Overview  |  Android Developers
  • GradleのdependenciesのアーティファクトIDの変更
  • パッケージの変更
    • ソースコード
    • XML
  • 変更自体は"Migrate to AndroidX"がやってくれる
  • importやXML内の参照の変更がありまくる
    • diffが多くてPRのレビューが大変
    • importの変更はほぼ見る必要なくても、他に意味ある変更があると埋もれる
    • 並行する機能開発との衝突

Type aliasesでimportを先に置き換える

package androidx.fragment.app

import android.support.v4.app.Fragment
import android.support.v4.app.FragmentManager
import android.support.v4.app.FragmentStatePagerAdapter

typealias Fragment = Fragment
typealias FragmentManager = FragmentManager
typealias FragmentStatePagerAdapter = FragmentStatePagerAdapter
  import android.content.Context
- import android.support.v4.app.Fragment
- import android.support.v4.app.FragmentManager
- import android.support.v4.app.FragmentStatePagerAdapter
+ import androidx.fragment.app.Fragment
+ import androidx.fragment.app.FragmentManager
+ import androidx.fragment.app.FragmentStatePagerAdapter
  • AndroidX移行前でも、移行後と同じパッケージでimportしておける
  • FragmentやAppCompatActivity、RecyclerViewなど数が多そうなところをやるだけでも差分をずいぶん減らせそう
    • 差分をいくつかのPRに分割しておける
  • JavaコードやXML(レイアウトやAndroidManifestなど)からはtypealiasは参照できない
    • JavaとKotlinの混在プロジェクトやXMLもカバーしたい場合は、同様に移行後のパッケージでサブクラスを作っておけばよさそう?

疑問

応用

  • ライブラリでの後方互換性確保
    • クラス名を変更したい
    • 単に変更すると破壊的変更になる
    • typealiasで変更前の名前も提供する
    • ついでに@Deprecatedアノテーションも付けるとよさそう
class NewClass { ... }

@Deprecated(
    message = "Renamed to NewClass",
    replaceWith = ReplaceWith("NewClass")
)
typealias OldClass = NewClass

ありがとうございました🍻

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment