初心者のためのC#プログラミング本格入門45 - プロパティかメソッドかそれが問題だ
「プロパティとメソッドどちらを使えばいいのか?」という質問をよく聞きます。今回はその疑問について書きます。その疑問について考えるにあたって、プロパティとメソッドについておさらいする必要があります。
メソッドとは、オブジェクトの振る舞いを表すものです。一方プロパティは、オブジェクトの状態を示す情報です。恐らく初心者の方は、現時点でははっきりと分からないと思いますが、気にする必要はありません。イメージだけ掴めばOKです。
概念を完璧に理解してから前に進もうとしても、C#プログラミングは際限なく深く、実地訓練をしないと習得できません。何故ならば、プログラミングは実学であり、教科書を暗記するのと同じ要領では知識を活かせず、その結果結局C#プログラミングの技法を習得できないからです。「手を動かしつつ学ぶ」それがC#プログラミング上達の近道です。
文章だけでは分かり難いので教材に使っているサンプルを使って解説を進めます。プロパティを使えば、プログラムの量が減ります。
//プロパティ使用前
if ( analyzer.Success == false | analyzer.Count <= 1 )
{
string error = "計算式が間違っています。";
end = "Error";
System.Console.WriteLine( error );
continue;
}
//プロパティ使用後
if ( analyzer.Success == false )
{
string error = "計算式が間違っています。";
end = "Error";
System.Console.WriteLine( error );
continue;
}
プロパティ使用前のサンプルプログラムは、変数を使用した時の名残です。Successプロパティは、AnalyzeExpressionメソッド内で「this.success = this.count != 0 & signInfo.Item1 == true;」と算出されているので改めて個数(Count)を調べる必要はありません。この例から分かるように、プロパティを使用するとプログラムが分かりやすくなります。では、同様の考えでCalculationメソッドを見た場合、代わりにResultプロパティを定義すればいいと考える人もいる事でしょう。そうすれば・・・
//メソッドの場合は読みやすくするため変数が必要
int resultValue = analyzer.Calculation();
ShowResult( inputValue, resultValue );
//こっちの方が読みやすい
ShowResult( inputValue, analyzer.Result );
と素直に記述できます。一応メソッドでも一行で記述(ShowResult( inputValue, analyzer.Calculation() );)できますが、どちらかといえばプロパティの方が自然に見えるでしょう。ですが、この事例の場合プロパティよりもメソッドを使う方が一般的です。何故ならば、結果は計算という振る舞いの結果生まれるものだからです。感覚論だと受け取る人がいるかもしれませんが、これには理論的な根拠があります。計算には各種の情報が必要になります。その情報は解析をするたびに変化します。従って、結果を取得するには毎回計算処理をしなくてはなりません。もし、以前計算した結果を返すようにすれば、それはバグを生む元凶になりえます。
毎回計算するという事は、そのプロパティにアクセスした際に予想以上に時間がかかり、そのオブジェクトを使用するプログラマを戸惑わせてしまいます。ですから、プロパティは単純なものにするのが原則です。
他にも原則がありますが、ひとまず今回解説した事を覚えておけば、メソッドとプロパティで悩む時間が減るでしょう。C#プログラミングを習得するという事は、ただ文法を覚えるのではなく、こういった使い分けする力を身につける事も含まれています。