どんな問題?
- スパゲッティコードは,構造をあまりもたないコードの中に現れる
- 開発者自身でさえも構造が把握できない
- オブジェクト指向言語の場合,以下の特徴をもつ
- オブジェクト数が少ない
- メンバ関数は大規模
- オブジェクト間の相互作用が少ない
- オブジェクトの再利用がしにくい
症状と結果
- オブジェクトと関数のうち,一部しか再利用できないとき
- 関数がとても手続き指向のとき
- オブジェクトがprocessと名付けられることが多い
- 実行フローがオブジェクトの実装に影響されるとき
- オブジェクト間の相互作用が少ないとき
- オブジェクトのメンバ関数がパラメータを持たないとき
- オブジェクトの利用パターンの予測がつきやすいとき
- コードの再利用が難しいとき
- オブジェクト指向の利点が失われたとき
- 継承がシステムの拡張に使われない
- ポリモーフィズムが使われない
- 後続の保守が問題を引き起こすとき
原因
- オブジェクト指向設計に疎いこと
- コードレビューがないこと
- 実装より先に設計されないこと
- 開発者が孤独に働くこと
どう解決する?
- リファクタリングはソフト開発の肝
- ソフト開発のコストの70%はソフトの拡張
- 拡張しやすい構造を保つのが大事
- 予期しない要件変更により構造が悪くなるため
- コードのクリーンアップが必要
- 新しい要素が加わるたびに行うべき
- 拡張性が落ちていく
- パフォーマンスにも良い影響
- 新しい要素が加わるたびに行うべき
- 1つ目のゴール
- 良い構造を達成すること
- 2つ目のゴール
- パフォーマンスに効くコード箇所を探すこと
- 3つ目のゴール
- パフォーマンスを高める構造を導入すること
スパゲッティコードを防ぐ
- 保守プロセス
- 最小工数で要件変更に対応するのではなく,
- 時間を使って既存ソフトのリファクタリングを行う
- その順序は以下.
- メンバ変数への抽象的なアクセスをする.
- コードを再利用可能な関数に変換する
- 関数の引数順を統一する
- コードを取り除く
- クラス,関数,型の名前を変更する
より抜本的に見直すには下記の様に行う