Infinito Nirone 7

白羽の矢を刺すスタイル

potatotips #21 にいってきた

最近の Potatotips はずっと倍率が高く競争が激化していて、なかなか当選しないのですが、今回晴れて発表枠が当たったので、「Popup view on Mortar」というテーマで話をしてきました。

Mortar といえば、Fragment に対抗しかつシンプルな API を提供しようという構想のもと Square, Inc. が主導してメンテナンスしているライブラリですが、 いかんせん Fragment を置き換えるという性格上なかなかドラスティックに現在のアプリを Mortar に乗り換えるというのが難しかったりしますし、 サンプルとライブラリを読む以外によいドキュメントないしチュートリアルが無いので、導入と理解のハードルも高かったりしますが、コンセプトそのものは素晴らしいですし、 実際導入してみると、Fragment に戻ろうとは思わなくなるほどにはよいライブラリだと思っています。

基本的な考え方は以下のようなものになります。

  1. Dagger と共に用いることを前提としている
  2. 1 つの Activity の中で複数の View とその状態を持ち、それらの遷移を管理する
  3. Activity が持つ View は、Presenter への参照をもち、状態やライフサイクルの管理とモデルへのアクセスを Presenter に委譲する
  4. Dagger のモジュールは Presenter ごと個別に宣言され、スコープが細かく定義される

基本的に、画面の構成単位は View になります。Activity は 1 つであるという前提があるためこうなります。 画面の構成単位たる View は、対応する Presenter を持っていて、View の状態やライフサイクルの管理、モデルへのアクセス等の、 Activity や Fragment が持っていた部分を Presenter が受け持ちます。Presenter はどの View に紐づくものかを知っているので、Presenter から View のメソッドを呼び出すことができます。

Fragment がコンポーネントのモジュール化をするという触れ込みで導入されましたが、結果再利用性の高い Fragment を作るには熟練のワザマエが必要で、 かつそれほど再利用性が必要かと問われると、タブレット対応以外に思い浮かばない。その割には、Fragment の仕組みが複雑かつデバッグの困難性が高いので、 それであれば旧来の View の仕組みを整理して同じことを実現できる Mortar の思想はとても良いものだと感じます。

ただ、現時点で使用者も少なくドキュメントも十分とはいえず、人知れず存在している機能もあります。

そのなかの一つが Popup ですが、主に AlertDialog のような Dialog をあつかうための仕組みです。 DialogFragment とくらべて圧倒的に便利な点は、Dialog の選択に関するコールバックが DialogFragment では otto や EventBus を使うことを考えますが、 Popup では Presenter でコールバックが受け取れるため、無駄にイベントオブジェクトを生成したりインタフェースを切ったりということが一切必要なくなります。

Mortar、地味ながら良いライブラリですので、MVC につかれた方は是非 MVP の勉強も兼ねて触ってみてはいかがでしょうか。