6日目のゴール
6日目のテーマは
「C# で“処理をひとかたまりとして名前をつける”感覚をつかむこと」 です。
昨日までは「データをまとめる(配列)」でした。
今日は「処理をまとめる」=メソッド(関数)です。
「同じような処理を何度も書いているな…」と感じたら、
そこにメソッドを切り出すタイミングが来ています。
メソッドは「処理に名前をつけたもの」
まずは一番シンプルなメソッド
C# のメソッドは、ざっくり言うとこういう形です。
戻り値の型 メソッド名(引数のリスト)
{
// やりたい処理
}
C#まずは「あいさつを表示するだけ」のメソッドを作ってみます。
using System;
class Program
{
static void Main(string[] args)
{
SayHello();
SayHello();
}
static void SayHello()
{
Console.WriteLine("こんにちは!");
}
}
C#ここでのポイントは二つです。
Main の外に static void SayHello() という「処理のかたまり」を定義していること
Main の中から SayHello(); と書いて、その処理を呼び出していること
SayHello という名前をつけたことで、
「この一行で“あいさつ処理”が実行される」と読めるようになります。
引数つきメソッドで「違うデータに同じ処理」をする
名前を変えてあいさつする
同じ「あいさつ」でも、
人によってメッセージを変えたいとします。
そのときに使うのが「引数」です。
using System;
class Program
{
static void Main(string[] args)
{
SayHello("太郎");
SayHello("花子");
SayHello("次郎");
}
static void SayHello(string name)
{
Console.WriteLine("こんにちは、" + name + " さん!");
}
}
C#ここで深掘りしたいのは、この部分です。
static void SayHello(string name)
…「string 型の引数 name を受け取るメソッド」
SayHello("太郎");
… 呼び出し側から “太郎” という値を渡している
メソッドの中では、name を普通の変数のように使えます。
「処理は同じだけど、使うデータだけ変えたい」
というときに、引数はものすごく役に立ちます。
戻り値つきメソッドで「計算結果を返す」
足し算メソッドを作る
今度は、「計算して結果を返す」メソッドを作ってみます。
using System;
class Program
{
static void Main(string[] args)
{
int result1 = Add(3, 5);
int result2 = Add(10, 20);
Console.WriteLine("3 + 5 = " + result1);
Console.WriteLine("10 + 20 = " + result2);
}
static int Add(int a, int b)
{
int sum = a + b;
return sum;
}
}
C#ここでのキーワードは「戻り値」です。
static int Add(int a, int b)
…「int 型の結果を返す Add メソッド」
return sum;
…「このメソッドの“答え”として sum を返す」
呼び出し側では、
int result1 = Add(3, 5);
と書くことで、
「Add(3, 5) の結果(8)を result1 に入れる」
という意味になります。
メソッドは「処理に名前をつける」だけでなく、
「計算の“関数”として結果を返す」役割も持てます。
戻り値なし(void)と戻り値ありの違い
「何かするだけ」と「結果を返す」
ここまでで、二種類のメソッドが出てきました。
画面に表示するだけのメソッド:
static void SayHello(string name)
{
Console.WriteLine("こんにちは、" + name + " さん!");
}
C#計算して結果を返すメソッド:
static int Add(int a, int b)
{
int sum = a + b;
return sum;
}
C#void は「何も返さない」という意味です。
「画面に表示する」「ログを出す」など、
“やって終わり”の処理は void で書くことが多いです。
一方、「計算して結果を使いたい」場合は、int や double などの型を戻り値として指定します。
配列+メソッドで「平均計算」をきれいにする
昨日のコードをメソッド化してみる
5日目でやった「配列の平均」を、メソッドにしてみます。
using System;
class Program
{
static void Main(string[] args)
{
int[] scores1 = { 80, 90, 75, 60 };
int[] scores2 = { 100, 95, 80 };
double avg1 = CalcAverage(scores1);
double avg2 = CalcAverage(scores2);
Console.WriteLine("1つ目の平均: " + avg1);
Console.WriteLine("2つ目の平均: " + avg2);
}
static double CalcAverage(int[] scores)
{
int sum = 0;
for (int i = 0; i < scores.Length; i++)
{
sum = sum + scores[i];
}
double average = (double)sum / scores.Length;
return average;
}
}
C#ここでのポイントは、「役割の分担」です。
Main
…「どの配列の平均を取りたいか」を決める場所
… 結果を表示する場所
CalcAverage
…「配列を渡されたら、その平均を計算して返す」ことだけに集中
同じ「平均計算」を、
scores1 にも scores2 にも使い回せています。
「同じ処理を何度も書かない」
これがメソッドの一番大きな価値です。
「名前のつけ方」がメソッドの読みやすさを決める
メソッド名は“何をするか”が分かるように
メソッド名は、
「この処理は何をするのか」が一目で分かるようにつけるのがコツです。
例えば、
CalcAverage … 平均を計算するPrintResult … 結果を表示するIsPassed … 合格かどうかを判定する(bool を返すイメージ)
など、「動詞+目的語」っぽくすると読みやすくなります。
逆に、DoIt や Func1 のような名前だと、
「何をするのか」がコードを開かないと分からなくなります。
メソッドは「処理に名前をつける道具」なので、
その名前を丁寧につけることが、
コード全体の読みやすさに直結します。
6日目のミニアプリ:簡易「合格判定」システム
点数配列から「合格かどうか」を判定する
次のルールで合格判定をしてみます。
平均点が 60 点以上なら「合格」
それ未満なら「不合格」
これをメソッドを使って書いてみます。
using System;
class Program
{
static void Main(string[] args)
{
int[] scoresA = { 70, 80, 65 };
int[] scoresB = { 50, 40, 55 };
Judge("Aさん", scoresA);
Judge("Bさん", scoresB);
}
static void Judge(string name, int[] scores)
{
double average = CalcAverage(scores);
Console.WriteLine(name + " の平均点は " + average + " 点です。");
if (average >= 60)
{
Console.WriteLine("結果:合格");
}
else
{
Console.WriteLine("結果:不合格");
}
Console.WriteLine("----------");
}
static double CalcAverage(int[] scores)
{
int sum = 0;
for (int i = 0; i < scores.Length; i++)
{
sum = sum + scores[i];
}
double average = (double)sum / scores.Length;
return average;
}
}
C#ここでの構造を整理すると、
CalcAverage
…「配列の平均を計算して返す」だけを担当
Judge
…「名前と点数配列を受け取り、平均を出して合否を表示する」
Main
…「誰を判定するか」を決めて、Judge を呼ぶ
という役割分担になっています。
メソッドを使うと、
「どこで何をしているか」がとても見通しやすくなります。
6日目で絶対に押さえておきたいポイント
メソッドの“型”を体で覚える
戻り値なし(void)のメソッド:
static void メソッド名(引数...)
{
// 何かする(表示など)
}
C#戻り値ありのメソッド:
static 戻り値の型 メソッド名(引数...)
{
// 計算など
return 結果;
}
C#呼び出し方:
メソッド名(引数...); // void のとき
型 変数名 = メソッド名(...); // 戻り値ありのとき
C#そして何より大事なのは、
「同じ処理を何度も書いている」と感じたら、
そこをメソッドに切り出せないか考えてみることです。
もし余裕があればやってみてほしいこと
自分用の「メッセージメソッド」を作る
例えば、
「区切り線を表示するメソッド」
「タイトルを表示するメソッド」
「今日の勉強時間を表示するメソッド」
などを作って、Main の中から何度か呼んでみてください。
6日目のまとめ
1〜5日目で「データの扱い方」を学び、
6日目で「処理のまとめ方=メソッド」を学びました。
変数・配列で「値」を整理し、
メソッドで「処理」を整理する。
この二つがそろうと、
コードは「ただ動くもの」から
「意味のある部品が組み合わさったもの」に変わっていきます。
7日目は、ここまでの要素
(変数・if・for・配列・メソッド)をまとめて、
小さな「アプリっぽいもの」を一つ形にしていくイメージです。
