この記事は、
初心者のためのC#プログラミング本格入門83の続きです。前回は、仕様と関係しているバグに対する対処法について解説しました。今回は、同一の名前を持つメソッドについて解説します。
前回全てのエラーがなくなったので、サンプルプログラムに新しい機能を追加します。今現在単一の式は計算できています。今度は複数の式の計算をします。新しい機能を追加したくなったら、テストプログラムから書きます。
class MultiAnalyzerTest : Test
{
//全てのテストを実行する
public override void ExecuteAllTest()
{
this.AnalyzeSimpleExpression();
this.ErrorExpressionCheck();
this.ErrorAndSuccess();
this.AllErrorExpressionDelete();
this.CalculateSimpleExpression();
this.CalculateMultiExpression(); //追加
}
//複数の式の計算処理をチェック
public void CalculateMultiExpression()
{
++this.testCount;
string expression = "( + 1 2 ) + 3";
this.target = new MultiAnalyzer();
this.target.AnalyzeExpression( expression );
double result = this.target.Calculation();
double rightValue = 6;
if ( result != rightValue )
{
++errorCount;
System.Console.Write(
expression + "の計算処理が正しくありません。");
System.Console.Write(
" 正しい値:{0},", rightValue );
System.Console.WriteLine(
" 処理結果;{0}", result );
}
}
}
始めは簡単な物が良いので、このテストでは「 1 + 2 + 3 」を計算しています。まだ、複数の式を計算するプログラムをプログラミングしていませんから、デバッグ実行(F5)するとエラーが発生します。正しくテストが実行されている事を確認するためにデバッグ実行して下さい。なお、System.Console.WriteLineメソッドで新しい方式を使っています文字列内に「{0}」が指定されている点に注意して下さい。「"正しい値:" + rightValue + ","」の様に。
文字列の連結を繰り返さないように出来ます。この新しい方法を使うともっと省略できます。使いようによってはプログラムが見やすくなります。
System.Console.WriteLine(
expression +
"の計算処理が正しくありません。 正しい値:{0}, 処理結果;{1}",
rightValue, result );
「{0}」と「{1}」に注目して下さい。この数値は指定する番号です。0番から指定する事に注意して下さい。
話しを戻します。複数の式を計算する手順を考えてみましょう。そうすれば、自ずとプログラムが分かります。
【複数の式を計算する手順】
- 1つめの式を計算。
- 1つめの式を計算した結果を2つめの式に追加。
- 2つめの式を計算。
※ただし式は解析済みとします。
この様に1つの式を計算し、後の計算式に値を追加していけば、複数の式の計算が出来ます。次にこのプログラムを追加する場所を考えます。複数の式を計算するのですから追加する場所は「MultiAnalyzerオブジェクトのCalculationメソッド」です。今まで学習した知識を活かして自分でプログラミングしてみて下さい。ヒントは「一時的なオブジェクト活用する」です。
できましたか?模範解答を示します。
//計算式の計算結果を返す
public double Calculation()
{
//初期値を設定
double result = 0.0f;
//複数の式を計算
System.Collections.Generic.List<Analyzer> temps =
new System.Collections.Generic.List<Analyzer>();
temps.Add ( new Analyzer( analyzers[ 0 ] ) );
if ( analyzers.Count > 1 )
{
for ( int i = 1; i < this.analyzers.Count; ++i )
{
Analyzer temp = new Analyzer( analyzers[ i ] );
double backValue = analyzers[ i - 1 ].Calculation();
temp.AddValues( backValue );
temps.Add( temp );
}
}
//最終的な計算結果を返す
result = temps[ temps.Count - 1 ].Calculation();
return result;
}
自分でプログラミングした人は、ちょっとした問題がある事に気付くと思います。それは、一時的なオブジェクトを作るプログラムと値を追加するプログラムです。今まで習った文法の知識では、違う名前のメソッドを定義しなくてはなりません。ですが、新しいC#の機能を使用すると
同名のメソッドとコンストラクタが定義できます。やり方は簡単です。
class Analyzer
{
//同じ値を持つオブジェクトを作成
public Analyzer( Analyzer source )
{
this.success = source.success;
this.sign = source.sign;
this.values =
new System.Collections.Generic.List<double>();
this.values.AddRange( source.values );
}
//値を直接追加
public void AddValues( double value )
{
this.values.Add( value );
}
}
特にこれと言った文法はありません。同じ名前を持つメソッドとコンストラクタを定義できます。違うのは引数の型だけです。これはオブジェクト指向プログラミングの機能で
多重定義もしくは
オーバーロードと呼びます。多重定義を使用すると、
同じ内容のメソッドに違う名前をつける苦労から解放されます。初心者の方は、これが意味するところが良く分からないと思います。ですが、この機能があるのとないのとでは大きな違いがあります。
例えば、もしC#に多重定義の機能がなければ、System.Console.WriteLineToInt、System.Console.WriteLineToFloatの様に微妙に名前が違うメソッドを型の数だけ定義しなくてはなりません。これではオブジェクト使う人が大変です。
些細な事だと思う人もいるでしょう。しかし、
もともとプログラミングは細かい作業なので、些細な差がプログラミングに大きな影響を与えます。プログラミングだけの話しではなく、プログラムの設計にも影響を与えます。違いが分かる人になる事もまたプログラミング上達の道なのです。
テーマ : プログラミング
ジャンル : コンピュータ