コンテンツにスキップ

2025年5月24日

今週の活動

  • リファクタリング 既存のコードを安全に改善するの第5章、第6章を読んだ
    • 第5章「カタログの紹介」
      • リファクタリング技法の構成要素(名前、概要、動機、手順、例)を説明
    • 第6章「リファクタリングはじめの一歩」
      • 最も頻繁に使用される基本的なリファクタリング技法を紹介
      • 関数の抽出
        • 長い関数から一部のコードを別の関数として切り出す
      • 関数のインライン化
        • 過度に細分化された関数を整理
      • 変数の抽出
        • 複雑な式を変数に代入して意味を明確にする
      • 変数のインライン化
        • 不要な変数を除去してコードを簡潔にする
      • 関数宣言の変更
        • 関数名やパラメーターを変更してより適切な形にする
      • 変数のカプセル化
        • グローバル変数などを関数でカプセル化してアクセスを制御
      • 変数名の変更
        • より適切で意味の明確な変数名に変更
      • パラメータオブジェクトの導入
        • 複数のパラメータを1つのオブジェクトにまとめる
      • 関数群のクラスへの集約
        • 関連する関数群を1つのクラスにまとめる
      • 関数群の変換への集約
        • データ変換を行う関数群を1つの変換関数にまとめる
      • フェーズの分離
        • 1つの処理を複数の明確なフェーズに分割
  • 静的解析ルールの分析方法
    • 解析結果を数値化でき、かつ測定期間内に変化が現れる場合は、外れ値の検出手法を使用できる
      • 測定期間内で変化を測定できなければ、従来通りしきい値での判定が必要 ![[images/maintainability_decision_tree.webp]]
  • 外れ値の検出手法の分類
    • 基本統計量を用いた手法
      • Zスコア
        • データの平均と標準偏差を用いて、各データポイントが平均からどの程度離れているかを測定
      • 修正Zスコア
        • 平均の代わりに中央値、標準偏差の代わりに正規四分位範囲(\(IQR = Q3 - Q1\))を使用し、外れ値に強い検出を行う
    • 近傍距離を用いた手法
      • k近傍法
        • 各データポイントのk番目に近い近傍までの距離を計算し、この距離が大きいポイントを外れ値とする
      • LOF(Local Outlier Factor)
        • 各点の局所密度と近傍点の局所密度を比較し、相対的に密度が低い点を外れ値として検出
    • 密度を用いた手法
      • DBSCAN(Density-Based Spatial Clustering of Applications with Noise)
        • どのクラスターにも属さないノイズ点を外れ値として検出
      • Isolation Forest
        • ランダムに特徴量と分割点を選んで二分木を構築し、各点を孤立させるのに必要な分割回数が少ない点を外れ値とする
  • ソフトウェアのモジュール化に関する論文を読んだ
    • Using Cohesion and Coupling for Software Remodularization: Is It Enough?
      • 研究1
        • 目的
          • 実際のソフトウェアシステムのモジュール化が、理論的に最適とされるモジュール化からどれだけ乖離しているかを定量的に測定
          • 開発者が実際に、モジュール化において凝集度と結合度のバランスを意識しているかを検証
        • 手法
          • 100のオープンソースシステムを対象とする
          • 凝集度と結合度の観点から近似解との差異を測定
          • MoJoFMを用いて、実際のシステム開発で凝集度と結合度のどちらが重視されているかを分析
        • 達成されたこと
          • 構造的凝集度・結合度: MoJoFMの中央値が13.3(実際の構造と理想の構造の差はおよそ87%)
          • 概念的凝集度・結合度: MoJoFMの中央値が16.2(実際の構造と理想の構造の差はおよそ84%)
          • 以上の結果から、実際のシステムのモジュール構造は、近似解から大幅に乖離していると分かった
          • 対象システムの57%が凝集度において近似値よりも劣っていた
          • レイヤー構造による凝集度の低下が影響している可能性がある
        • 達成されなかったこと
          • ソフトウェアシステムの凝集度と結合度の最適解を求める問題(凝集度を最大化し、結合度を最小化する問題)はNP困難であるため、この研究では遺伝的アルゴリズムによる近似解と、実際の値を比較した
            • そのため、厳密なモジュール分割手法については論じていない
      • 研究2
        • 目的
          • 開発者の主観的視点から、モジュール化において重視される要因を明らかにする
        • 手法
          • 29人の開発者にアンケートを行い、主観的評価を収集
          • 凝集度と結合度以外に考慮する要因を特定
          • 実際の開発現場で行われているリファクタリングによる再モジュール化の実態を把握
        • 達成されたこと
          • 回答者の75%がモジュール化品質を重視していることを確認
          • 回答者の86%は再モジュール化経験があることを確認
          • 回答者の83%は凝集度と結合度以外の特性がモジュール化を導くと回答
        • 達成されなかったこと
          • 回答率が11%と低く、代表性に疑問がある
          • サンプルサイズが29であり、統計的な一般化が難しい
          • 再モジュール化に影響を与える、凝集度と結合度以外の特性が明らかにされていない

得られた成果

  • モジュールの一般的な品質指標
    • \(MQ = 凝集度の平均 - 結合度の平均\)
  • クラスをモジュールに分割する際の組み合わせは、クラスの数に応じて指数的に増加するため、最適なモジュール分割を見つける問題を解くことは難しい
    • 遺伝的アルゴリズムやクラスタリングなどのヒューリスティック手法を用いることで近似解を得られるが、モジュール分割において考慮されるべき要素は、凝集度と結合度以外にも存在することが前述した研究で示唆されている
  • プロジェクトによってメトリクスの解釈が異なる
    • ソフトウェアの構造のみに着目し、構造の改善方法を最適化問題として解くのは実用的ではない
    • 開発者に単一の行動のみを推奨するような手法を提案するのは避けるべきであると考える
  • 近年の研究では、凝集度と結合度を概念的に捉えることもある
    • 概念的凝集度・結合度
      • コメントや識別子に埋め込まれた意味的な情報を分析
    • 構造的凝集度・結合度
      • 本来の定義
      • 凝集度: モジュール内の要素がどの程度一緒に属しているか
      • 結合度: モジュールがどの程度相互に依存しているか

直面した課題

  • 今回提案する手法にどのような役割を持たせるべきか考える必要がある
    • 提案手法が何において効果的であれば良いのか?
    • 依然として解決できないと思われる問題は何か?

来週の計画

  • Kent Beckが書いた「テスト駆動開発」を読む
    • TDDの基本サイクルである「Red-Green-Refactor」を理解したい
  • 概念的凝集度・結合度のように、新しい論文ではメトリクスの解釈が大きく異なることがあるので、適宜、原著論文を読む
  • ソフトウェアメトリクスをメソッド・クラス単位で計算するライブラリを探す
    • リファクタリングの単位としてメソッドやクラスが利用されることが多いため
  • リポジトリの選定基準としてApacheプロジェクトが適切かどうか調べる