初心者のためのC#プログラミング本格入門58 - 類似した処理から考えよう
「複数の式を個々の式へと分割する。 」について考えてみましょう。初心者の方はいきなりプログラムが思い浮かばないかもしれません。初心者用のプログラミング本を読んだのはいいが、自分が欲しいプログラムが思い浮かばない人が沢山いるそうです。
私の場合は、10年以上システムを開発しているので、お客様の言葉を聞けばその場で思いつきます。おそらく、他のプロの方もそうでしょう。初心者の方はこういったプロの技は真似できないと感じるでしょうが、それは特別な才能ではないと思います。慣れの問題でしょう。
プロと初心者の違いは何よりも経験の量です。それを補うには、初めの内は「似たプログラムを探しそれを元に改良する」行為を繰り返すと、自然とプログラム言語が日本語と同じように使いこなせるようになります。C#はプログラミング言語なので、使っているうちに自然と日本語と同様に慣れてくるのです。心配要りません。
「複数の式を個々の式へと分割する。 」と似た処理をこの連載の中で解説しています。そのプログラムを元に考えれば、初心者であってもプログラムが作れます。読み進める前に、この連載を通じて作ってきたプログラムから、類似したプログラムを探してみましょう。
答えは「式から数値を取り出す」処理です。1つの文字列から複数の式を取り出す行為は、1つの文字列から複数の数値を取り出す処理と酷似しています。その処理をしているのはAnalyzerオブジェクトのAddValuesメソッドです。
public void AddValues( string inputValues )
{
bool loopFlag = true;
string tmp = inputValues;
do
{
System.Tuple<bool, float, string> value = TryValue( tmp );
loopFlag = value.Item1;
if ( loopFlag == true )
{
this.values.Add( value.Item2 );
tmp = value.Item3;
}
} while ( loopFlag == true );
}
このプログラムを元に、複数の式を個々の式へと分割するDivisionAnalyzerメソッドを作りましょう。
private void DivisionAnalyzer( string inputValue )
{
bool loopFlag = true;
string tmp = inputValue;
do
{
System.Tuple<bool, string, string> value = CutExpression( tmp );
loopFlag = value.Item1;
Analyzer analyzer = new Analyzer();
analyzer.AnalyzeExpression( value.Item3 );
this.analyzers.Add( analyzer );
tmp = value.Item2;
} while ( loopFlag == true );
}
DivisionAnalyzerメソッドは少し長くなっていますが、大まかな考えはAddValueメソッドと同じです。違いは、CutExpressionメソッドを使って式を分割している点と、個々の式に対応するAnalyzerオブジェクトを初期化して格納している点です。この様に類似したものを探す能力を鍛えるのが、プログラミング上達のポイントです。堅苦しい言葉で言えば、物事を抽象化して考える力です。初心者が陥りやすい落とし穴は、文法主義と暗記主義です。
文法を暗記してもプログラミングはできません。また、プログラミング本を読んで「サンプルをそのまま暗記」してもプログラミングをする力は身につきません。文法もサンプルプログラムの暗記もある程度必要ですが、何かを実現する創造力は反復して磨く必要があります。
どんな凄い人でも初心者の時代があります。それを才能という言葉で逃げるのは簡単です。ですが、凄い人は才能の一言で済ませられない地道な努力をしています。努力が出来るか否かが明暗を分けています。貴方も磨けば宝石になるかもしれません。磨いてみないと分かりません。
未来のプロがこの記事を読んでいる事を願って今回はこれで終わります。実はこのプログラム、このままでは正常に動作しません。次回、プログラムを改良をします。お楽しみに。