YelpはBentoをオープンソースとして公開した。再利用可能なさまざまなコンポーネントをひとつの画面に組み合わせることで、モジュール化されたユーザインターフェースをAndroid上に構築するフレームワークだ。
同社のエンジニアであるTyler Argo氏によると、モジュラリティはコンポーネントの再利用と並んで、Bentoの重要な目標である。
Bentoフレームワークを使用すれば、複雑なインターフェイスを、モジュール化されて理解が容易で、ダイナミックでテスト性のよい、一連のコンポーネントに簡単に分割できます。
Yelpによると、BentoはEpoxyに着想を得ている。Epoxyは、複雑なUIの構築を目的として、RecycleViewをベースにAirbnbが開発したオープンソースライブラリである。ただしBentoは、ViewPagerとListViewもサポートしていることからも、RecyclerViewの単なるラッパだと見るべきではない。さらに、同社エンジニアのDiego Waxemberg氏が記しているようにBentoは、FrameLayoutやLinearLayoutに簡単に拡張することができるのだ。
Bentoは、さまざまなビューをグループ化する多くのAndroidアプリを、共通のモジュラUIで構築する手段を提供する。すべてのビューが同種である場合には、RecyclerViewでも、このようなグループを簡単に作成できるが、通常は多くの定型コードを記述する必要がある。Epoxyのようなライブラリでは、より高レベルの抽象化を提供することによって、RecycleViewベースのUIの効率的な開発を実現している。例えば、Epoxyでは、ビューに表示するモデルの作成にアノテーションを使った処理を行なうが、Bentoのアプローチは大きく異なり、これらのビューをモジュール化された再利用可能なコンポーネントにまとめた上で、そのビュー(Component
)内に拡張されるべきデータとそれを展開するロジック、インタラクションを処理するロジックをパッケージにする(ComponentViewHolder
)。最終的にはComponentController
を使用して、画面上にまとめられているさまざまなコンポーネントをすべて管理する。ヘルパクラスも用意されているため、少なくとも単純なケースならば、Component
とComponentViewHolder
の一部を定義するだけで、その他の基盤となるメカニズムを意識する必要はない。例えば、ListComponent
、PaginatingListComponent
、CarouselComponent
などが用意されている。
ビュー間でのコンポーネントの再利用性の例として、Waxemberg氏は、YelpアプリケーションのBusiness Passportの事例を挙げている。このアプリケーションでは、ビジネスページ、ユーザプロファイル、デリバリ画面など、多くの画面でコンポーネントが再利用されている。Bentoのもうひとつの興味深い機能は、既存のアプリケーションにコンポーネントを段階的に導入できるために、UIを最初から書き直す必要がないことだ。特にYelpでは、約1年にわたって、この機能を使って数多くのアプリを段階的にBentoに移植している。RecyclerViewに代わるビューをBentoがサポートしたことは、自身のアプリをBentoに移植したいと考えていた開発者にとっても、最初にRecycleViewを使うコードに変更する必要がなくなるという意味で朗報である。
Waxemberg氏が概説しているように、BentoとEpoxyの他の大きな違いは、Bentoにはアノテーションプロセッサがないこと、RecyclerViewのセマンティクスを維持したことによって学習曲線が穏やかであること、外部依存性を持たないことだ。アノテーションをサポートしなかったことは、コンパイル時間の面で過大なコストを発生させないための、意識的な設計上の決定だった、とWaxemberg氏は説明している。特にYelpでは、100万行以上のソースコードを、平均1分以内のコンパイル時間でビルドすることが可能である。
BentoはGitHubで公開されており、Gradleを使ってインストールすることができる。