初心者のためのC#プログラミング本格入門85 - 内部クラスを使って可読性を上げよう
前回の新しいテストプログラムができましたが、式と正しい値が離れていて不便でした。これはちょっとした不便ですが、それを見逃さないのがプログラミング上達の道です。式と値をセットで記述するとくれば、読者が思いつくのはタプルでしょう。しかしタプル(System.Tuple)はプロパティがItem1とかなので読み難いです。テストを書いて間もないころだと覚えているでしょうが、1年経ってからプログラムを見ると意味が分からないかもしれません。
System.Tupleよりも読みやすいのはクラスですが、下手にクラスを量産すると余計に読み難くなります。何故ならば、他のプログラムから「見えてしまう」からです。ならば他のプログラムから見えないクラスが定義できれば便利です。それを可能とするのが内部クラスです。
内部クラスというのは、クラスの内部に定義できるクラスです。実際に見てみれば分かると思います。
class MultiAnalyzerTest : Test
{
//関係のないプログラムは省略・・・
//複数の式の計算処理をチェック
private class TestData
{
//式
private string m_exp;
public string Expression { get { return this.m_exp; } }
//値
private int m_value;
public int RightValue { get { return this.m_value; } }
//式と値を設定
public TestData( string expression, int rightValue )
{
this.m_exp = expression;
this.m_value = rightValue;
}
}
public void CalculateMultiExpression()
{
TestData[] tests = new TestData[]
{
//基本チェック
new TestData( "( + 1 2 ) + 3", ( 1 + 2 ) + 3 ),
new TestData( "( + 1 2 ) * 3", ( 1 + 2) * 3 ),
new TestData( "( + 1 2 ) - 3", ( 1 + 2 ) - 3 ),
new TestData( "( + 1 2 ) / 3", ( 1 + 2 ) / 3 ),
//演算の順番チェック
new TestData( "( + 3 4 ) + 3", ( 3 + 4 ) + 3 ),
new TestData( "( + 3 4 ) * 3", ( 3 + 4 ) * 3 ),
new TestData( "( + 3 4 ) - 3", ( 3 + 4 ) - 3 ),
new TestData( "( * 3 4 ) / 3", ( 3 * 4 ) / 3 )
};
foreach ( TestData test in tests )
{
CalculateMultiExpression(
test.Expression, test.RightValue );
}
}
}
前回のプログラムと比べると、だいぶ読みやすくなりました。内部クラスは「private class TestData」の部分です。クラス定義内でクラスを定義しています。これが内部クラスの書き方です。ただし内部クラスは必ずしもprivateにする必要はありません。ですが、publicにすると違うプログラムからアクセス出来てしまいます。それを有効利用するのは内部クラスの違う使用目的であり、今回の話題とは別のプログラミングテクニックなので、今のところは気にしないでください。何度か書いていますが、C#はプログラムが読みやすくなる工夫がされているので、ちょっと気になったら新しい文法を調べましょう。そうすれば、ぐんぐんとプログラミングが上達します。