【ソフト開発 アンチパターン】Spaghetti Code

どんな問題?

  • スパゲッティコードは,構造をあまりもたないコードの中に現れる
    • 開発者自身でさえも構造が把握できない

  • オブジェクト指向言語の場合,以下の特徴をもつ
    • オブジェクト数が少ない
    • メンバ関数は大規模
    • オブジェクト間の相互作用が少ない
    • オブジェクトの再利用がしにくい

f:id:yusuke_ujitoko:20161207215757p:plain:w400

症状と結果

  • オブジェクトと関数のうち,一部しか再利用できないとき
  • 関数がとても手続き指向のとき
    • オブジェクトがprocessと名付けられることが多い
  • 実行フローがオブジェクトの実装に影響されるとき
  • オブジェクト間の相互作用が少ないとき
  • オブジェクトのメンバ関数がパラメータを持たないとき
  • オブジェクトの利用パターンの予測がつきやすいとき
  • コードの再利用が難しいとき
  • オブジェクト指向の利点が失われたとき
  • 後続の保守が問題を引き起こすとき

原因

  • オブジェクト指向設計に疎いこと
  • コードレビューがないこと
  • 実装より先に設計されないこと
  • 開発者が孤独に働くこと

どう解決する?

  • リファクタリングはソフト開発の肝
    • ソフト開発のコストの70%はソフトの拡張
    • 拡張しやすい構造を保つのが大事

  • 予期しない要件変更により構造が悪くなるため
  • コードのクリーンアップが必要
    • 新しい要素が加わるたびに行うべき
      • 拡張性が落ちていく
    • パフォーマンスにも良い影響

  • 1つ目のゴール
    • 良い構造を達成すること
  • 2つ目のゴール
    • パフォーマンスに効くコード箇所を探すこと
  • 3つ目のゴール
    • パフォーマンスを高める構造を導入すること
スパゲッティコードを防ぐ
  • 保守プロセス
    • 最小工数で要件変更に対応するのではなく,
    • 時間を使って既存ソフトのリファクタリングを行う
      • その順序は以下.

  1. メンバ変数への抽象的なアクセスをする.
  2. コードを再利用可能な関数に変換する
  3. 関数の引数順を統一する
  4. コードを取り除く
  5. クラス,関数,型の名前を変更する

より抜本的に見直すには下記の様に行う

  1. オブジェクト指向分析を行ってドメインモデルを作る
  2. 分離されたデザインモデルを作る
  3. 開発者が全てを理解できるまでオブジェクトを分割する
  4. デザインモデルに基づいて実装する
    ある程度まで行ったら,ドメインモデルとデザインモデルを改善する

yusuke-ujitoko.hatenablog.com