初心者のためのC#プログラミング本格入門44 - メソッドを保有するクラスを決定する方法
今回までの記事を読めば、メソッドの有用性が分かると思います。しかしながら初心者の人は、どのメソッドをどのクラスで定義するべきなのかが分からず困ると思います。何故ならば、オブジェクト指向プログラミングが分からない人に話しを聞いてみると、この疑問でつまずいているからです。そこで今回は、どのメソッドをどのクラスに定義するべきなのかについて一つの指針を書く事にしました。
結論から書くと、メソッドとクラスの関係はオブジェクト指向設計で決定します。しかし、初心者の方はオブジェクト指向設計ができないのが普通です。そこで、簡単な方法を書きます。
最初はひとまず静的メソッドを定義します。次に、細かい単位の静的メソッドをまとめた静的メソッドを定義します。文章だと難しく感じるかもしれませんが、サンプルプログラムのAnalyzeExpressionメソッドを思い返せば簡単な事だとわかると思います。
大きな単位のメソッドを定義した後は、新しいクラスを定義します。そして、そのメソッドを新しいクラスへ移動します。そうすると、その移動するメソッドが必要とする変数と返す値が判明しますので、それらの変数をメソッドと同じクラスのフィールドとして定義します。
ここまでの手順で、細かい単位の処理をするメソッド数個、細かい処理を纏めるメソッド1個、フィールド数を持つクラスが出来上がります。後は、そのクラスのプロパティを参照しているメソッドを移動します。サンプルプログラムではCalculationメソッドがこれに該当します。
class Analyzer
{
//※Calculation以外は省略しています
public int Calculation()
{
int result = 0;
switch ( this.sign )
{
case '+':
for ( int i = 0; i < this.count; i++ )
{
result += this.values[ i ];
}
break;
case '-':
result = this.values[ 0 ];
for ( int i = 1; i < this.count; i++ )
{
result -= this.values[ i ];
}
break;
case '*':
result = 1;
for ( int i = 0; i < this.count; i++ )
{
result *= this.values[ i ];
}
break;
case '/':
result = this.values[ 0 ];
for ( int i = 1; i < this.count; i++ )
{
int value = this.values[ i ];
if ( value == 0 )
{
return 0;
}
result /= value;
}
break;
case '%':
result = this.values[ 0 ];
for ( int i = 1; i < this.count; i++ )
{
result %= this.values[ i ];
}
break;
}
return result;
}
}
この様にすれば、プログラムが簡潔で読みやすくなります。
static void Main()
{
string end = "";
do
{
//計算式を入力
string message = "計算式を入力して下さい";
string inputValue = InputValue( message );
//計算式を解析して値と符号を得る
Analyzer analyzer = new Analyzer();
analyzer.AnalyzeExpression( inputValue );
if ( analyzer.Success == false | analyzer.Count <= 1 )
{
string error = "計算式が間違っています。";
end = "Error";
System.Console.WriteLine( error );
continue;
}
//計算して結果を表示
int resultValue = analyzer.Calculation();
ShowResult( inputValue, resultValue );
System.Console.WriteLine( "" );
end = GetEnd();
} while ( end != "" );
}
以前のサンプルプログラム
int resultValue = Calculation(
analyzer.Values, analyzer.Sign, analyzer.Count );
と比べると簡潔で読みやすくなっています。以上の様に、フィールドとメソッドの関係からクラスを導くのがオブジェクト指向プログラミングの基本です。また、オブジェクト指向プログラミングは人間のためのものなので、読みやすさと理解しやすさを基準に置きます。この2つの原則を覚えておけば、難しいオブジェクト指向プログラミングが分かりやすくなります。