可読性に関するソフトウェアメトリクスを考えた

新しいソフトウェアメトリクスを思いつきました。

ソフトウェアメトリクスとは、ソフトウェアの特性を推定するための定量値のことです。バグの数とかレビューの時間とか開発の過程で得られる値もありますし、テストの数だとかカバレージといったテストを評価する値もあります。ソースコード自体から測定されるものとしては、LOC (Line Of Code)やCyclomatic Complexityがよく知られています。それぞれ、ソースコードの規模・複雑さを示すものです。*1

近年では、ソフトウェアの特性としてソースコードの可読性が重要視されるようになっています。ソースコードは書く時間よりも読まれる時間の方が長い。読むための労力が少ないソースコードは、生産性を向上させ、バグも少なくなります。

可読性を高めるためには、適切な名付けやコメント、明快な処理のフローが必要です。名付けやコメントについては、数値化することは難しいのでフローの部分に焦点を当てて評価するメトリクスを考えました。

読みやすいコードというのは、読みやすい文章と一致しています。文章というのは必ず前の文を受けて次の文が続きます。唐突に前の文と関連がない文が現れていたら、それは文章としては成立していません。ソースコードも文章と同様に、前の文を受けて次の文が続くべきなのです。

ソースコードで、前の文を受けるというのは同じ変数を操作しているということです。前の文で操作した変数を次の文でも操作するようにすれば、文章のように前の文を受けて話を展開していく形になります。

しかし、プログラムでは前の文を受けないような記述もできてしまいます。ある行で操作した変数を離れた行で再び操作すると、前の操作を思い返さなければならないので、読みづらくなります。理想的には、ある行で操作する変数は、そこで最初に操作するか、直前の行で操作されているべきです。

そこで、「変数の使用される間隔の平均値」を可読性の指標としたらよいのではないかと考えました。関数やメソッド(ルーチンとよぶ)ごとに計算される値です。このメトリクスを仮に d として、d は以下で定義されます。

     1   L  n(l)
d = ―――  Σ   Σ  f(x,l)
     L  l=1 x=1


           0                 (変数 x が行 l で最初に操作された場合)
f(x,l) = {
           l - 前回変数xが操作された行 - 1 (変数 x が行 l 以前で操作されている場合)

ここで、

  • L : ルーチンの行数
  • l : ルーチン内の行番号
  • n(l) : 行lで操作される変数の数
  • x : 行lで操作される変数

となります。

d = 0 だとルーチンの可読性は理想的で、d の値が大きくなるほどそのルーチンは可読性が悪いということになります。

具体的なソースコードについて、d を計算し、d がどのような場合に大きくなるかというのは、次回に考えてみたい。

The Art of Readable Code (Theory in Practice)

The Art of Readable Code (Theory in Practice)


2016-06-02

同様の発想をしている論文を見つけた:

http://sdl.ist.osaka-u.ac.jp/pman/pman3.cgi?DOWNLOAD=228