どうしてコードはレガシーになるのか
TRANSCRIPT
旧 新
ファイル数 370 (Java) 738 (Java + Kotlin)
平均行数 306 77 / 72 (Java / Kotlin)
最長ファイルの行数 4535 1275 / 462 (Java / Kotlin)
最長ファイルの種別 Activity View (1275行のファイル)
コードの見通しがよくなりました✧\\ ۹( 'ω' )و //✧
横たわるレガシーコード
最長4535行のActivity全体的にコピペ
inner classから外のクラスへ参照もちまくり org.apache.http に密結合でSDKのアップデートができず
ローカル変数で良いものまで全部クラスフィールド
フィールドへ再代入しまくりで、どれがどのタイミングで変更され
るのか
コンストラクタの中で自クラスのインスタンスを作って何もしない
etc...
コンストラクタの中で自クラスのインスタンスを作って何もしない図
class Hoge { public Hoge(String param) { ... }
public Hoge() { // 誤 new Hoge("default"); // 正 // this("default"); }}
イケてないポイント
最長4535行のActivity全体的にコピペ
inner classから外のクラスへ参照もちまくり org.apache.http に密結合でSDKのアップデートができず
ローカル変数で良いものまで全部クラスフィールド
フィールドへ再代入しまくりで、どれがどのタイミングで変更され
るのか
コンストラクタの中で自クラスのインスタンスを作って何もしない
1. 設計方針が不明瞭前任者不在 & 設計に関するドキュメント皆無
「この後どう書けばよいのか」後任にはっきりと伝わらない
そもそもAPI以外ほぼ全部がActivityに直書きされていた後任もそこに書けばいいと思ってしまう(思ってしまった)
割れ窓理論
その結果がこれだよ
最長4535行のActivity全体的にコピペ
2. 密結合設計方針が不明瞭であることも密結合になる原因の一つ
長大なコードがべた書きされている
修正にとても時間がかかる
そもそもモジュール化されていない
時間がかかりすぎるのでリファクタリングは断念された
古いコードを使い続けざるを得ない
更にべた書きのコードが増える
以下ループ
その結果がこれだよ
inner classから外のクラスへ参照もちまくり org.apache.http に密結合でSDKのアップデートができず
3. 力量不足 & セーフティネットの欠如
まずい書き方をする人が居て、それを止める仕組みがなかった
コードレビュー文化がない時代に書かれていた
コーディング規約もなかった
噂によると初期開発者のレベルはかなり低かったらしい
その結果がこれだよ
ローカル変数で良いものまで全部クラスフィールド
フィールドへ再代入しまくりで、どれがどのタイミングで変更
されるのか読めない
コンストラクタの中で自クラスのインスタンスを作って何もし
ない
設計とドキュメント
設計方針はClean ArchitectureとMVPの間の子依存は一方向に
重視する原則や歴史的経緯をWikiにクラス説明などはJavaDocコメントに
作った本人も、どんなものだったか忘れる
思い出せるので仕事が早い
モジュール化
普通にJavaらしくクラスを使う
ちゃんと役割分担する
情報源
情報の表示
仕様の実行
『何でもActivity (Controller)に書かない』と気をつけるだけでも違
う
処理の抽象度を高めることで、本質的なことだけ考えられる
コードレビュー実施 & コーディング規約整備
gitlabのMerge Request使用チームを跨いでのレビュー
弊社サービスpoiboyのAndroidメンバーと相互レビュー
全員のレベルアップ+モチベーションアップ
規約を整備
AOSPとクックパッドさんのJavaコーディング規約をベースに
改変しながら
Kotlinの規約も用意考えないといけないことが減って楽に