読者です 読者をやめる 読者になる 読者になる

visible true

技術的なメモを書く

Kotlin Tips: 可読性のために拡張関数で別名をつける

問題

次のコードはRxJavaのCompletableを利用している例である。

repository.deleteEntry(entry)
    .subscribe(
      { e ->
        view.hideProgress()
        view.showError(e)
      },
      {
        view.hideProgress()
      }
    )

このコードには次の問題がある。

  • repository.deleteEntry()がCompletableを返す事をコードからは読み取れない。
  • subscribe()の第一引数がonError:(Throwable)->UnitだがObservableはonNext:(T)->Unitを第一引数にとるので直感に反する

つまりロジック上問題ないがコードを読んだ時にわかりづらいという問題が発生する。

改善策

2つの問題を解決するためにCompletableにsubscribeCompletable()という名前の関数を追加する。

RxExtensions.kt

fun Completable.subscribeCompletable(onError: (Throwable) -> Unit, onComplete: () -> Unit) = subscribe(onError, onComplete)

Completable.subscribe()に別名をつけることで可読性が向上する。

repository.deleteEntry(entry)
    .subscribeCompletable(
      { e ->
        view.hideProgress()
        view.showError(e)
      },
      {
        view.hideProgress()
      }
    )

さらなる議論

別名をつけると言っても実際は拡張関数を実現するためにRxExtensionsKtクラスが作成され内部にはメソッドやネストしたクラスが作られる。可読性を取るかメソッド数、クラス数を取るかについては別途議論する必要がある。