どこでも見れるメモ帳

とあるSEの備忘録。何かあれば気軽にコメントください〜

git blameによるSRP(単一責任原則)の定量化

はじめに

ソースコードを静的解析することでSRP(単一責任原則)を定量的に算出します.*1
svn blameによるSRP算出*2を参考に、git blameによる算出をshで行ってみました.
このSRP値が最大のモジュールが王様モジュールに相当します.

http://f.st-hatena.com/images/fotolife/n/ni66ling/20150625/20150625000750.png?1435158531?changed=1435158531

# 単一責務性の違反指数(SRP)
#   SRP=R+U+((L/100)-5)
#     R:修正リビジョンのユニーク数
#     U:修正ユーザのユニーク数
#     L:モジュールのライン数
function get_SRP() {
  local target_filepath=$1
  echo $(( \
    $(git --no-pager blame --line-porcelain $target_filepath | sed -n 's/^summary //p' | sort | uniq -c | sort -rn | wc -l) + \
    $(git --no-pager blame --line-porcelain $target_filepath | sed -n 's/^author //p' | sort | uniq -c | sort -rn | wc -l) + \
    ( $(cat $target_filepath | wc -l) / 100 - 5) \
  )) $target_filepath
}

# SRPが酷い順(大きい順)に "SRP ファイル名" を標準出力
for file in `git ls-files app lib config vendor script | grep -E '\.rb$'`; do
  get_SRP $file
done | sort -k1,1 -nr 

※ここではrailsリポジトリを対象にしたため,rbファイルを対象にしていますが,別言語でも全く同様に扱えます.

関連する過去記事

ni66ling.hatenadiary.jp

*1:静的解析とかいうとかっこよかったりしますが,やってることはとても単純です.

*2:第8回 Perlによる大規模システム開発・設計のツボ(3):Perl Hackers Hub|gihyo.jp … 技術評論社 - http://gihyo.jp/dev/serial/01/perl-hackers-hub/000803