NCMB Android SDK v2の設計方針

  • 2
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

NCMBエバンジェリストの小山(@koyhoge)です。

2015年9月18日に NCMB の Android SDKバージョン2.0.0-pre としてリリースされ、その後 10月29日にファイルストア機能が実装されて v2.0.0 となりました。このバージョン2系列は、これまでのソースとは別に、全くイチからオープンソースとして公開することを前提に開発されました。

この NCMB Android SDK v2 の設計と初期の開発に関わりましたので、その設計方針や開発中に感じたことなどをメモしておこうと思います。

ちなみに私はJavaでの開発経験は過去に多少あるものの、Androidの開発はほぼ初心者と言ってよく、開発作業を進めていく上で得るものがたくさんありました。AndroidStudioを触るのも初めてでしたし、Gradleを用いたビルドの仕組みを理解するのも興味深いものがありました。

さてNCMB SDKを設計し直すにあたり、最初に考えたのは

  • オープンソースで公開することが決まっているので、内部も機能分割をしっかりおこなって見通しの良いコードにする
  • 決め打ちのパラメータは避け、メソッド引数やリソースなので開発者が上書きできるように
  • ユーザが拡張できる余地を残しておく設計

の3点でした。

HTTPの下回りは別の方が担当していましたが、v1がApache HttpClientを用いていたのに対して、v2ではJava標準のHttpURLConnectionに切り替えようかという議論になっていました。今後はHttpUrlConnectionが標準的に使われるのは間違いなかったのですが、Android 2.2以前のHttpURLConnectionは重大なバグを持っていることが知られていて、つまりはAndroid 2.Xをサポートするかどうかという判断を迫られることになったわけです。結局Android 2.Xはもう良いでしょうということで、Androidの標準指針に乗っ取り、下回りはHttpURLConnectionを用いることに決まりました。

NCMB SDK v2のHTTP通信レイヤーは細かく分けると4層になっています。

  • 最も下層が上記のHttpURLConnectionです。
  • その上にNCMBConnectionという薄いラップ層が来ます。
  • 3番目にNCMBReqeust, NCMBResponseというリクエスト・レスポンスを抽象化した層があって、その中で例えばリクエスト毎のシグネチャの計算等が行われています。
  • 最上層がNCMBServiceを基底としたクラス群で、NCMBのREST APIの各カテゴリごとにクラスが分かれています。たとえばデータストアであればNCMBObjectService会員管理であればNCMBUserServiceといった具合です。

SDK v2がv1と最も違う点は、このAPIを抽象化した層であるNCMBServiceができたことです。v1では例えばNCMBUserクラスは、会員を表すエンティティクラスであると同時に、APIを司るサービスの意味も含んでいました。v2ではエンティティとサービスを明確に分離したので、仮にAPIの追加変更が行われてもエンティティに及ぶ影響は最小限にできますし、エンティティ側で独自の便利機能を追加するのも容易になったと考えています。

NCMB Android SDKはまだ発展途上にあると理解しています。私はすでに開発作業から離れましたが、ソースはGitHubで一般公開されていますので、誰でもPull Requestを送れる状態にあります。機能改善や不満点などはどしどしPull Requestをしていただけると、中の開発者の方々もきっと喜ぶと思います。