メソッドの行数について

前提

オブジェクト指向を土台にしたプロジェクトにおいて、メソッドの役割をきちんと理解できていない、または今一つピンと来ない、理解しきれていない人向け。またはあまり意識していないが、コメント入りでメソッドが一画面に収まらないプログラムを書いている人向け。

方法

自身の書いているプログラムがオブジェクト指向になっているか、と問われると、答えに窮することがあると思う。なので、ひとまず自分のプログラムがオブジェクト指向「寄り」になっているか判断する方法から。

難しいことは考えず、「Set,Get」という名称が頭についてメソッドが大半を占めているのであれば、オブジェクト指向寄り、と考えていいと思う。プログラムの最小単位は、究極的には「入力と出力」しかないからだ。より核心に迫るのであれば、1メソッドの平均的な行数を見るのがいい。それが1画面に収まらないような「名前だけゲッター、名前だけセッター」になっている場合は、おそらくもっとふるまいの整理ができるはずだ。

名前だけセッター、名前だけゲッター

例えば、下記のような名称のセッターがあったとする。

        private string Name;
        public void SetName(string name)
        {
            Name = name;
        }

※private string Name { set; get; }でいいだろ?>はい。その通りです。

上記は、よく例に取り上げられるpersonクラスのセッターを切り出したものだ。
特に目新しいものでもない。

        private string Name;
        private int Sex;
        public void SetWomanName(string name)
        {
            Name = name;
            Sex = 1;//0を男、1を女とする
        }

とした場合はどうだろう?
これを許容してしまう懐の広めの人は、名前だけセッターを作ってしまう素養を持っているので注意してほしい。

よろしくない点1
personクラスにSexプロパティがあるのは当然のことだが、personクラス内に「女の人向けのメソッド」が存在するのはよろしくない。これを許容してしまうと、当たり前のようにSetMenNameという無駄なセッターも作らなければならない。オブジェクトとして必要なのは、SetSexなのだ。

よろしくない点2
メソッド名から振る舞いが推察しづらい。そもそも、personクラスそのものが、何をするクラスなのかわからなくなってしまう。personを継承したwomanクラスがあって、コンストラクタでSexを指定するのであれば「わかる」。しかし、personという抽象的な形のものに、「女」という単語はあまりにも具体的すぎる。いい意味で、あやふやな状態が保てなくなるからだ。やるのであれば、womanクラスにして、それ以外のプロパティを抽象的なもので補足していくのがいいだろう。

上記メソッドだとすぐに気づけるが、自身の実務レベルのコーディング成果物を見ると、SetWomanNameはごく当たり前に発生している。UTフェーズで、テストの条件が妙に入り組んでいたり、期待される結果が「文章」になってしまっていることで大抵気づけるので、一つの指標にするといいだろう。

この、ソースコードのリファクタリング作業を繰り返していくと、おのずとソースコードが短くなっていく。
「これ以上は無理」というレベルまで振る舞いを整理できれば、保守容易性指数(コードメトリクス分析)のスコアがグリーンに収まるのは間違いない。

まとめ

1メソッドの行数は短ければ短いほど保守性が高い。それは、現在主流のどの言語でも当てはまる考え方だと思う。情報サイトによっては、具体的に「XX行」と出しているところもあるが、VisualStudioを使用することを前提とするのであれば、最低限、保守容易性指数が30を割るのは避けたほうがいい。可能であれば、1画面に収めたいところだ。まあ、コメント入りで50行程度で納めておくのが良いと思う。

ただし、重要なのは「そのクラスに設計思想に沿った振る舞いの最小単位であるか」という点であり、行数そのものを指定するのはナンセンスだ。しかし、振る舞いをきちんと整理できていれば、おのずと短いコードになっていく、というのが正しいと思う。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です