[Swift|Kotlin]+Rxで作ったネイティブアプリのコードの違い

したこと

ReactiveXでiOS,Androidで同じ機能を持つネイティブアプリを作ったので、コードにどれぐらいの違いが出たのかまとめてみました。


言語

iOSはSwift, AndroidはKotlinで作りました。


アーキテクチャ(?)

どこまで忠実にできたか分かりませんが、MVVMで作りました。
詳細はググってください。
とりあえずこのプロジェクトでは以下のような括りで作っています。

階層 内容
View ビュー
Controller(ViewController, Activity/Fragment) ViewModelの情報をViewに表示する。
ViewModel Viewに表示する情報を作る。
Model Viewに関係しないほぼすべての処理
Entity データ
Repository データベースやサーバからデータを取得する。
Coordinator Application Coordinatorを使ってぐちゃぐちゃになった遷移を綺麗に管理する

ライブラリ

# Android iOS
フォーム QMBForm Eureka
Rx RxJava,RxAndroid,RxKotlin RxSwift,RxCocoa,RxOptional,RxViewModel
非同期画像表示 Picasso HanekeSwift
カレンダー Caldroid CVCalendar
通信 OkHttp,Retrofit Alamofire
イベントバス EventBus SwiftEventBus
ログ Timber CocoaLumberjack
JSON変換 Gson SwiftyJSON,ObjectMapper
フォント Android-Iconics FontAwesome.swift
日付 ThreeTen Android Backport SwiftDate
カメラ SquareCamera TGCameraViewController
地図 Google Mobile Services GoogleMaps
データベース Realm Realm
プログレス 自作 JGProgressHUD
レイアウト調整 該当なし SnapKit
デザイン 該当なし Chameleon
画像キャッシュ 自作 Nuke
ドロップダウンメニュー 自作 BTNavigationDropdownMenu

集計結果

ステップ数はclocで行いました。
また、ライブラリは除いています。


機能ごとのステップ数

  • 共通Aは全体的に使用しているクラス
  • 共通Bは一部機能で使用しているクラス
  • FWは主にRxで便利な機能をまとめたクラス
# Android iOS Android - iOS
機能A 3028 3165 -137
機能B 715 659 56
機能C 666 556 110
機能D 440 477 -37
機能E 628 552 76
機能F 335 312 23
機能G 216 130 86
機能H 938 739 199
共通A 1242 679 563
共通B 651 542 109
通信 26 4 22
FW 487 336 151
その他 422 497 -75
合計 9794 8648 1146

階層ごとのステップ数

# Android iOS Android-iOS
Controller,Adapter 3473 2044 1429
View 772 425 347
ViewModel 1110 1307 -197
Model 1423 1312 111
Entity 1269 1576 -307
Repository 853 839 14
Coordinator 62 269 -207
Other 832 876 -44
合計 9794 8648 1146

感想

  • Androidでは、あるクラス2つのファイルを分け、iOSでは同じファイルにした、またその逆もあったので、統一すればよかった。
  • Androidの共通Aが多いのは、フォームライブラリのEurekaがあまり拡張せずにも使えたのに対し、QMBFormは結構拡張が多かった。
  • Coordinatorに差があるのは、AndroidとiOSとで少し仕組みが違ったせいかな。
  • iOSを作った後に、Androidを作ったこともあるのかもしれないけど、AndroidはUI周りは自分で作らないといけないことが多かった。
  • KotlinとSwiftでは、感覚的にはコード量はKotlinの方が少なく感じたけど、AndroidとiOSとでは、Androidの方が書かないといけない量が多かった。
  • RxJava 1.xで作ったけど、2.xで作れる自信がない。みんなどうしてるんだろう。

最後に

Kotlin/Swift+Rxで作れば結構なコードを同じ感じで作れるのは分かった。
ただ、Xamarinでもいいんじゃねぇのかという話も出てくる。

KotlinとSwiftの違い、というか、ここがよかった的なものもまとめたいと思います。