Xamarin製プロダクトのコード共有率について

エムティーアイ Advent Calendar 2016 の16日目です。

アプリ開発チームの田熊です。2016年はXamarin界隈が非常に盛り上がりを見せた1年でしたね。 エムティーアイではXamarinでのアプリ開発が盛んに行われています。 エムティーアイとXamarinについてと、実際にどれくらいコードが共有できているかについて書いていきたいと思います。

エムティーアイとXamarin

エムティーアイがXamarinでの開発をはじめたのは2013年です。当時は1チームでiOS・Androidどちらも開発できるようにしたいという要望から、クロスプラットフォーム開発の気運が高まっていたと記憶しています。 あるチームで実際にクロスプラットフォーム開発をやってみようということになり、いくつかのツールを比較した結果、Xamarinが選択されました。ネイティブと同じように実装できることと、UI部分はプラットフォーム毎の実装できることが、Xamarinが選ばれた理由でした。(当時他のツールはhtmlベースのものが多かった) Xamarin製の初めてのアプリが無事にリリースされた後、他のアプリでもXamarinを使って開発していこうということになり、今では私が知るだけでも7個はXamarin製のプロダクトがあります。 エムティーアイのアプリ開発において、Xamarinは標準的な選択肢になっています。

コードの共有率

クロスプラットフォーム開発のメリットは1つのコードで複数のプラットフォームのアプリが作れることです。 では、実際にXamarinでの開発でどれくらいコードをを共有できているのでしょうか。

VisualStudioのコードメトリクス機能を利用して、4つのプロダクトのCoreプロジェクトとAndroidプロジェクトのコード行を計測します。 共有率はCore/(Core + Android)で計算します。 (iOSはVisualStudioでの環境構築が間に合わなかったので計測できませんでした...)

また、事情によりプロダクト名を公開できないものについては伏せ字にさせていただきます。ちなみに4つ中3が伏せ字です。

ルナルナ体温ノート

初めてXamarinで開発されたアプリです。

iOS Android Xamarin事例紹介ページ

体温ノートはMVCアーキテクチャで作られています。(当時はMVVMやMVPなどは今ほどメジャーではなかった記憶)

Core:7037 Android:10444 共有率:約40%

それほど共有率が高くありません。 事例紹介のページでは70%以上共有できていたとの記載があるので、リリースを繰り返す内に共有率が下がっていってしまったのかもしれません。 私もこちらの案件に関わっていたことがあるのですが、UI部分などの施策が多く共通化が難しかった記憶があります。

プロダクトA

伏せ字のプロダクトAもMVCで開発されています。

Core:1996 Android:2266 共有率:約47%

Core部分よりプラットフォーム固有の実装が多くなっています。 こちらのプロダクトは、プロダクトの特性上共通化出来ない部分があるため共有率が低い可能性があります。

プロダクトB

2つ目の伏せ字プロダクトBもMVCで開発されています。

Core:4115 Android:3632 共有率:約53%

こちらはややCore部分の実装が上回っています。 私はあまりこのプロダクトについての知識がないので、補足事項がありません。

プロダクトC

3つ目の伏せ字プロダクトCはMVVMアーキテクチャで開発されています。

Core:7210 Android:3616 共有率:約67%

こちらのプロダクトはMVVMCrossを利用して作られています。ViewModelもCoreに含まれるため、高い共有率になっています。 私は初期の開発に携わっていたのですが、MVVMCrossはPluginも豊富で非常に楽に開発できた記憶があります。もう2年以上前になるのですが、MVVMCrossは健在なんでしょうか...。

総括

共有率を一覧にしました。

Core Android 共有率
体温ノート 7037 10444 約40%
プロダクトA 1996 2266 約47%
プロダクトB 4115 3632 約53%
プロダクトC 7210 3616 約67%
平均 約52%

私の所感としては、Xamarinのコード共有率は設計やプロダクトの特性に依存します。 コードの共有率を高くしたいのであれば、どこまで共通にするかの設計が重要になりそうです。

また、C#でのコード共有率を計測していきましたが、WebView+HTMLでで共通化することもあります。 それぞれをネイティブで実装すると工数がかさむ箇所は、WebView+HTML実装で工数削減といった工夫がされていたりします。 (多分)メトリクスにHTML部分は含まれていないので、実際のコード共有率はもう少し高いかもしれません。

おわりに

以上、Xamarinプロダクトのコード共有率についてでした。 本記事がXamarinを使うか悩んでいる人の参考になれば幸いです。

VisualStudioを入れるのを面倒くさがった私の代わりにメトリクスをとってくれた同僚のN君、本当にありがとう。