初心者のためのC#プログラミング本格入門99 - ファイルを分割して関心事を分離しよう
以前この連載で、関心事の分離について解説しました。おさらいすると、プログラミングで実現しようとしている物事の1つ1つを、ちゃんと分けるという考え方の事です。物足りない説明ですが、初心者の頃は下手に細かい所にクビを突っ込まず、イメージを固める所から始めるのがベストです。厳密な定義を暗唱しても、実際に使えなければ意味がありません。ですから最初は、分かりやすい言葉を使って、頭にイメージを定着させます。厳密な定義は、イメージを持ってから、より深く学習する時に利用します。
話を戻します。以前、インナークラス(内部クラス)の概念を適用して、foreachループに対応するために必要なインターフェイスの定義を分けて、サンプルプログラムを定義しました。しかしこの方法には1つ問題があります。それは読み難い事です。プログラムが読みにくいと、プログラミングをする人の集中力を殺いでしまう恐れがあります。そうなってしまうと、関心事の分離が実践できません。幸いC#には、この状況で役立つ文法があります。
C#にはpartialキーワードがあります。このキーワードを使用すると、プログラムファイルを分割できます。どういう事かと言いますと・・・
//ファイルSimpleList.cs
partial class SimpleList :
System.Collections.Generic.IEnumerable< int >
{
//プログラムは省略
}
//ファイルSimpleList_Enumerator.cs
//※ファイル名は人間が分かれば何でもよい
partial class SimpleList :
System.Collections.Generic.IEnumerable< int >
{
public System.Collections.Generic.IEnumerator< int >
GetEnumerator()
{
return ( System.Collections.Generic.IEnumerator< int > )
new Enumerator( this.data );
}
System.Collections.IEnumerator
System.Collections.IEnumerable.GetEnumerator()
{
return ( System.Collections.IEnumerator )
new Enumerator( this.data );
}
private class Enumerator :
System.Collections.Generic.IEnumerable< int >,
System.Collections.Generic.IEnumerator< int >
{
//プログラムは省略
}
}
こうすることにより、foreachループ対応の事ならSimpleList_Enumerator.cs、本題ならばSimpleList_Enumerator.csと言うふうに読めばよいように出来ます。こうすれば、混乱する可能性が減ります。実はこの文法C#で多用されています。具体的には、開発ソフトで自動的に生成されたファイルで使用されています。試しに、メニューの「ファイル」→「新規作成」→「プロジェクト」で表示される画面の中から、Windowsフォームを選んで下さい。その後、ソリューションエクスプローラーの中から、ファイルForm1とForm1.Designer.csを探して中身を見て下さい。もし表示されない場合は、ソリューションエクスプローラーの上の方にある「全てのファイルを表示」をクリックして下さい。この2つのファイルを読むと、Form1クラスにpartialキーワードが付いている事と、デザインと内容が分離されている事が確認できます。
開発ソフトは、何故1つのオブジェクトの定義を2つのファイルに分けているのでしょうか?それは、デザインと機能を分離できるからです。大半の人は開発ソフトを使って画面をデザインします。この場合、もし1つのファイルでプログラムを定義していると、自動生成されたプログラムと、自分で書いたプログラムがごちゃ混ぜになってしまいます。そうなってしまうと、プログラミングに意識を集中できません。その事態を敷設ために、マイクロソフトの開発ソフトは、この様にしています。
初心者の人はまだファイルを分割することの何がよいのか分からないと思いますが、ファイルを分割する立点がもうひとつあります。それは、分業が出来る事です。複数の人間でソフトを作るとき、役割に対応してファイルを用意できます。もしファイルが分割できなければ、「画面のデザインをしたいからそのファイル貸して」とか「おいおい、デザインを変える筈が俺が打ったプログラムまで変更されているぞ。」などといった事件が起きてしまいます。そういったトラブルを避けるために、ファイルを分割するのはよい事です。
ただし、だからと言って無暗に分割すればいいというものでもありません。分割しすぎるとファイルの管理が大変です。どんな便利な文法でも、考えずに多用すればなんらかの問題が必ず発生します。続く...