[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を使ってぐちゃぐちゃになった遷移を綺麗に管理する](http://qiita.com/endorno@github/items/d0b25c47e3c5a7b48865)|

---

# ライブラリ

|#|Android|iOS|
|:-------|:------|:----|
|フォーム|[QMBForm](https://github.com/quemb/QMBForm)|[Eureka](https://github.com/xmartlabs/Eureka)|
|Rx|[RxJava](https://github.com/ReactiveX/RxJava),[RxAndroid](https://github.com/ReactiveX/RxAndroid),[RxKotlin](https://github.com/ReactiveX/RxKotlin)|[RxSwift](https://github.com/ReactiveX/RxSwift),[RxCocoa](https://github.com/ReactiveX/RxSwift/tree/master/RxCocoa),[RxOptional](https://github.com/RxSwiftCommunity/RxOptional),[RxViewModel](https://github.com/RxSwiftCommunity/RxViewModel)|
|非同期画像表示|[Picasso](http://square.github.io/picasso/)|[HanekeSwift](https://github.com/Haneke/HanekeSwift)|
|カレンダー|[Caldroid](https://github.com/roomorama/Caldroid)|[CVCalendar](https://github.com/Mozharovsky/CVCalendar)|
|通信|[OkHttp](http://square.github.io/okhttp/),[Retrofit](https://square.github.io/retrofit/)|[Alamofire](https://github.com/Alamofire/Alamofire)|
|イベントバス|[EventBus](https://github.com/greenrobot/EventBus)|[SwiftEventBus](https://github.com/cesarferreira/SwiftEventBus)|
|ログ|[Timber](https://github.com/JakeWharton/timber)|[CocoaLumberjack](https://github.com/CocoaLumberjack/CocoaLumberjack)|
|JSON変換|[Gson](https://github.com/google/gson)|[SwiftyJSON](https://github.com/SwiftyJSON/SwiftyJSON),[ObjectMapper](https://github.com/Hearst-DD/ObjectMapper)|
|フォント|[Android-Iconics](https://github.com/mikepenz/Android-Iconics)|[FontAwesome.swift](https://github.com/thii/FontAwesome.swift)|
|日付|[ThreeTen Android Backport](https://github.com/JakeWharton/ThreeTenABP)|[SwiftDate](https://github.com/malcommac/SwiftDate)|
|カメラ|[SquareCamera](https://github.com/boxme/SquareCamera)|[TGCameraViewController](https://github.com/tdginternet/TGCameraViewController)|
|地図|[Google Mobile Services](https://www.android.com/gms/)|[GoogleMaps](https://developers.google.com/maps/documentation/ios-sdk/?hl=ja)|
|データベース|[Realm](https://realm.io/)|[Realm](https://realm.io/)|
|プログレス|自作|[JGProgressHUD](https://github.com/JonasGessner/JGProgressHUD)|
|レイアウト調整|該当なし|[SnapKit](https://github.com/SnapKit/SnapKit)|
|デザイン|該当なし|[Chameleon](https://github.com/ViccAlexander/Chameleon)|
|画像キャッシュ|自作|[Nuke](https://github.com/kean/Nuke)|
|ドロップダウンメニュー|自作|[BTNavigationDropdownMenu](https://github.com/PhamBaTho/BTNavigationDropdownMenu)|

---

# 集計結果
ステップ数は[cloc](https://github.com/AlDanial/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の違い、というか、ここがよかった的なものもまとめたいと思います。