メソッド
メソッドの構成要素
メソッドとは何度も実行する処理をまとめて簡単に実行できるようにするための仕組みです。メソッドを使用することでプログラムの品質 が向上します。具体的には再利用性、可読性、保守性が向上します。 例えば何かのゲームプログラムで以下の処理を何度も実行する必要があるとします。
private void StartGame()
{
    Console.WriteLine("コマンドを入力してください");
    Console.WriteLine("たたかう");
    Console.WriteLine("にげる");
    Console.WriteLine("じゅもん");
    Console.WriteLine("どうぐ");
    //何かの処理…
    Console.WriteLine("コマンドを入力してください");
    Console.WriteLine("たたかう");
    Console.WriteLine("にげる");
    Console.WriteLine("じゅもん");
    Console.WriteLine("どうぐ");
    //何かの処理…
    Console.WriteLine("コマンドを入力してください");
    Console.WriteLine("たたかう");
    Console.WriteLine("にげる");
    Console.WriteLine("じゅもん");
    Console.WriteLine("どうぐ");
    //何かの処理…
}
メソッドを作ると以下のように書くことができるようになります。
private void StartGame()
{
    ShowMessage();
    //何かの処理…
    ShowMessage();
    //何かの処理…
    ShowMessage();
    //何かの処理…
}
void ShowMessage()
{
    Console.WriteLine("コマンドを入力してください");
    Console.WriteLine("たたかう");
    Console.WriteLine("にげる");
    Console.WriteLine("じゅもん");
    Console.WriteLine("どうぐ");
} 
メソッドはいくつかの要素から構成されています。具体的にはアクセス修飾子、staticキーワード、partialキーワード、戻り値、メソッドの名前、 引数のリスト、実行コードから構成されます。メソッドを作成するのに最低限必要なものは戻り値、メソッド名、引き数リスト、実行コードです。 一番シンプルなメソッドを作成するには下のように書くことになります。
戻り値 メソッド名 (引数リスト)
{
    実行コード
} 
引数リストが無い場合は()と書きます。引数についてはあとで説明します。戻り値が無い場合はvoidと書きます。 戻り値がある場合についても後で解説します。メソッド名は自由につけてかまいません。メソッド名に使えない文字(特殊文字)以外であれば アルファベットでも日本語でもメソッド名に使用できます。{}の間に実行したいコードを書きます。もう一度ShowMessageメソッドを 見てみましょう。
void ShowMessage()
{
    Console.WriteLine("コマンドを入力してください");
    Console.WriteLine("たたかう");
    Console.WriteLine("にげる");
    Console.WriteLine("じゅもん");
    Console.WriteLine("どうぐ");
} 
このようにして定義したメソッドは1行書くだけで簡単に何度でも実行できます。
ShowMessage();
このようにメソッドを作成すると再利用性が向上するのがわかると思います。 何度も何度も実行する処理はメソッドにしておけば開発速度の向上につながります。またメソッドを使用することで全体の処理の流れが 読みやすくなっています。適切なメソッド名をつけていけば可読性の向上にもつながります。
引数
引数ありメソッド
何度も使う処理の一部だけ場面場面で違うという場合があったりします。そのような場合に引数ありのメソッドを定義すると便利です。 例えば以下のような場合を考えて見ます。
private void StartGame()
{
    Console.WriteLine("コマンドを入力してください");
    Console.WriteLine("■勇者");
    Console.WriteLine("たたかう");
    Console.WriteLine("にげる");
    Console.WriteLine("じゅもん");
    Console.WriteLine("どうぐ");
    //何かの処理…
    Console.WriteLine("コマンドを入力してください");
    Console.WriteLine("■戦士");
    Console.WriteLine("たたかう");
    Console.WriteLine("にげる");
    Console.WriteLine("じゅもん");
    Console.WriteLine("どうぐ");
    //何かの処理…
    Console.WriteLine("コマンドを入力してください");
    Console.WriteLine("■賢者");
    Console.WriteLine("たたかう");
    Console.WriteLine("にげる");
    Console.WriteLine("じゅもん");
    Console.WriteLine("どうぐ");
    //何かの処理…
}
「コマンドを入力してください」から「どうぐ」までのコードの大部分がほぼ共通ですが■で始まる行の部分だけ異なります。 引数ありメソッドを利用するとこのようなコードを以下のように書くことができるようになります。
private void StartGame()
{
    ShowMessage("■勇者");
    //何かの処理…
    ShowMessage("■戦士");
    //何かの処理…
    ShowMessage("■賢者");
    //何かの処理…

}
void ShowMessage(String name)
{
    Console.WriteLine("コマンドを入力してください");
    Console.WriteLine(name);
    Console.WriteLine("たたかう");
    Console.WriteLine("にげる");
    Console.WriteLine("じゅもん");
    Console.WriteLine("どうぐ");
} 
最初のShowMessage("■勇者")が実行されると、引数リストのnameという変数に"■勇者"という文字列がセットされた上でShowMessageメソッド が実行されます。イメージとしては以下のような形です。

ShowMessage("■戦士")のときにはnameには"■戦士"、ShowMessage("■賢者")のときにはnameには"■賢者"という値が入っています。 このように引数ありのメソッドを定義することで一部だけが違うほぼ同じ処理を共通化できます。
引数リストの文法
引数が1つの場合の引数リストの文法を以下に示します。
(型名 変数名)
型名にはStringやInt32などクラス名を指定する必要があります。変数名は自由につけることができます。引数が2つ以上ある場合は 以下のようにカンマで区切った形になります。
(型名 変数名,型名 変数名,型名 変数名,型名 変数名,型名 変数名)
引数が2つある場合のサンプルコードは以下のようになります。11行目を見てください。
private void StartGame()
{
    ShowMessage(20, "■勇者");
    //何かの処理…
    ShowMessage(40, "■戦士");
    //何かの処理…
    ShowMessage(16, "■賢者");
    //何かの処理…

}
void ShowMessage(Int32 hp, String name)
{
    Console.WriteLine("コマンドを入力してください");
    Console.WriteLine("HP:" + hp);
    Console.WriteLine(name);
    Console.WriteLine("たたかう");
    Console.WriteLine("にげる");
    Console.WriteLine("じゅもん");
    Console.WriteLine("どうぐ");
} 
ShowMessage(20, "■勇者")が実行されるとhpには20、nameには"■勇者"という値がセットされてメソッドの実行コードが実行されます。
戻り値
メソッドの呼出し
戻り値ありのメソッドを使用するとメソッド内で生成した値を呼び出し元で変数に代入できます。例えば以下のようなコードがあるとします。
private void StartGame()
{
    Console.WriteLine("コマンドを入力してください");
    Console.WriteLine("たたかう");
    Console.WriteLine("にげる");
    Console.WriteLine("じゅもん");
    Console.WriteLine("どうぐ");
    //何かの処理…
    Console.WriteLine("コマンドを入力してください");
    Console.WriteLine("たたかう");
    Console.WriteLine("にげる");
    Console.WriteLine("じゅもん");
    Console.WriteLine("どうぐ");
    //何かの処理…
    Console.WriteLine("コマンドを入力してください");
    Console.WriteLine("たたかう");
    Console.WriteLine("にげる");
    Console.WriteLine("じゅもん");
    Console.WriteLine("どうぐ");
    //何かの処理…
}
戻り値ありのメソッドを使用するとこのように書き換えることができます。 戻り値ありのメソッドを作成するには例えばメソッドの最後にreturn 変数名という行を記述します。20行目を見てください。
private void StartGame()
{
    String text = CreateMessage();
    Console.WriteLine(text);
    //何かの処理…
    Console.WriteLine(text);
    //何かの処理…
    Console.WriteLine(text);
    //何かの処理…

}
void CreateMessage()
{
    //Environment.NewLineは改行を表します
    String message = "コマンドを入力してください" + Environment.NewLine
        + "たたかう" + Environment.NewLine
        + "にげる" + Environment.NewLine
        + "じゅもん" + Environment.NewLine
        + "どうぐ" + Environment.NewLine;
    return message;
} 
戻り値ありのメソッドの場合は引数の場合と逆に呼び出し元に値を渡すことができます。
引数と戻り値を使うことでメソッド間で値を受け渡しでき、様々な処理を共通化することが可能です。
メソッドとプログラムの品質
可読性
メソッド名を適切に命名するとソースコードの全てを解読しなくてもおおまかな処理の流れをつかむことができます。
private void StartGame()
{
    //データベースからデータを取得
    var d = GetDataFromDatabase();
    //取得したデータを元にコントロールを作成
    var c = CreateListTableControl(d);
    //作成したコントロールを画面に表示
    ShowDataToUI(c);
}
再利用性
メソッドを作成すると1行書くだけで処理を実行できます。コードの再利用によってプログラム作成の効率化が期待できます。
保守性
プログラムを書いていると既に作成した部分のプログラムを修正したいということがよくあります。 例えば以下のコードで「コマンド」→「命令」というように変更したいとします。 この場合修正すべき箇所は3箇所あることになります。
private void StartGame()
{
    Console.WriteLine("コマンドを入力してください");
    Console.WriteLine("たたかう");
    Console.WriteLine("にげる");
    Console.WriteLine("じゅもん");
    Console.WriteLine("どうぐ");
    //何かの処理…
    Console.WriteLine("コマンドを入力してください");
    Console.WriteLine("たたかう");
    Console.WriteLine("にげる");
    Console.WriteLine("じゅもん");
    Console.WriteLine("どうぐ");
    //何かの処理…
    Console.WriteLine("コマンドを入力してください");
    Console.WriteLine("たたかう");
    Console.WriteLine("にげる");
    Console.WriteLine("じゅもん");
    Console.WriteLine("どうぐ");
    //何かの処理…

}
以下のようにメソッドを作成してプログラムを書いている場合、修正箇所が1箇所でよいことになります。
private void StartGame()
{
    ShowMessage();
    //何かの処理…
    ShowMessage();
    //何かの処理…
    ShowMessage();
    //何かの処理…

}
void ShowMessage()
{
    Console.WriteLine("コマンドを入力してください");
    Console.WriteLine("たたかう");
    Console.WriteLine("にげる");
    Console.WriteLine("じゅもん");
    Console.WriteLine("どうぐ");
} 
このようにプログラムを修正(保守)しようとした際に修正箇所が少なくてすむようなプログラムのことを 保守性が高いプログラムといいます。 今回は3つと1つでしたが実際にプログラムを作成していると100個とか修正箇所ができたりします。 メソッドをうまく作成して保守性の高いプログラムを作成しているとプログラムの作成効率が大幅に向上します。
Create at 2012/1/17 LastUpdate 2012/1/20