Day 34 のゴールと全体像
Day 34 のテーマは 「クラスのメソッド」 です。 ここまでで、クラス・フィールド・プロパティ・コンストラクタと、 「オブジェクトの中身」や「生まれ方」を見てきました。
今日はそこから一歩進んで、
- インスタンスメソッド
- クラスの責務
- データと処理をまとめる
という視点で、 「クラスにどんなメソッドを書けばいいのか」を考えていきます。
雑誌の記事を読むような気持ちで、 「クラスに性格や仕事を与えていく感覚」を楽しんでください。
インスタンスメソッドとは何か
「そのオブジェクトがする仕事」を表すメソッド
インスタンスメソッドは、
「インスタンス(オブジェクト)に対して呼び出すメソッド」
です。
もう少し柔らかく言うと、
「そのオブジェクトが自分のデータを使って行う処理」
だと思ってください。
たとえば、Person クラスに「自己紹介する」という仕事を与えると、こうなります。
class Person
{
public string Name { get; set; }
public int Age { get; set; }
// インスタンスメソッド:この人が自己紹介する
public void Introduce()
{
Console.WriteLine($"こんにちは、{Name} です。年齢は {Age} 歳です。");
}
}
class Program
{
static void Main(string[] args)
{
Person p = new Person
{
Name = "太郎",
Age = 20
};
// インスタンス p に対してメソッドを呼び出す
p.Introduce();
Console.ReadLine();
}
}
C#ここでのポイントは、
IntroduceメソッドはPersonのインスタンスに対して呼び出される- メソッドの中では、そのインスタンスの
NameとAgeを使って処理している
というところです。
重要ポイント:
- インスタンスメソッドは「そのオブジェクト自身のデータ」を使う処理を書く場所です。
- 「このクラスのオブジェクトは何ができるべきか?」を考えると、インスタンスメソッドの形が見えてきます。
クラスの責務を考える
責務とは「そのクラスの担当範囲」
オブジェクト指向でよく出てくる言葉に、
責務(せきむ)
があります。 これは、
「そのクラスが何を担当するのか」
という意味です。
例えば、Student クラスを考えてみましょう。
- データ
- 名前
- 点数
- 責務(担当する仕事)
- 合格かどうか判定する
- 自分の情報を表示する
この「責務」をコードに落とし込むと、こうなります。
class Student
{
// データ
public string Name { get; set; }
public int Score { get; set; }
// 責務1:合格かどうか判定する
public bool IsPassed()
{
return Score >= 60;
}
// 責務2:自分の情報を表示する
public void PrintInfo()
{
Console.WriteLine($"名前: {Name}, 点数: {Score}, 合格: {IsPassed()}");
}
}
C#このクラスを使う側は、
class Program
{
static void Main(string[] args)
{
Student s = new Student
{
Name = "花子",
Score = 85
};
s.PrintInfo(); // 学生自身に「情報を表示して」とお願いするイメージ
Console.ReadLine();
}
}
C#という形で、 「学生に自分の仕事をしてもらう」ような感覚でメソッドを呼び出します。
重要ポイント:
- クラスの責務を考えるときは、 「このクラスは何を知っていて、何ができるべきか?」 をセットで考えると整理しやすいです。
- 責務が増えすぎると「何でも屋クラス」になってしまうので、 なるべく 1 クラス 1 役割 を意識すると、設計がきれいになります。
データと処理をまとめる意味
「バラバラの変数と関数」から「まとまりのあるクラス」へ
Day 30 までの世界では、
- データ:変数・配列・Dictionary
- 処理:メソッド
というように、データと処理を別々に書くことが多かったと思います。
オブジェクト指向では、
「あるもの(概念)に関するデータと処理を、1つのクラスにまとめる」
という考え方をします。
例えば、成績管理を「バラバラな変数とメソッド」で書くと、こんな感じになります。
// バラバラなスタイルの例
string name = "太郎";
int score = 70;
bool IsPassed(int s)
{
return s >= 60;
}
void PrintInfo(string n, int s)
{
Console.WriteLine($"名前: {n}, 点数: {s}, 合格: {IsPassed(s)}");
}
C#これでも動きますが、 「名前と点数はセットなのに、コード上はバラバラ」という状態になっています。
これをクラスにまとめると、
class Student
{
public string Name { get; set; }
public int Score { get; set; }
public bool IsPassed()
{
return Score >= 60;
}
public void PrintInfo()
{
Console.WriteLine($"名前: {Name}, 点数: {Score}, 合格: {IsPassed()}");
}
}
C#という形になり、
- 名前と点数が「学生」という単位でまとまる
- 合格判定や表示も「学生の仕事」としてまとまる
ことで、コードの見通しがぐっと良くなります。
重要ポイント:
- データと処理をクラスにまとめることで、 「現実のものに近い形」でコードを考えられるようになります。
- これがオブジェクト指向の大きなメリットのひとつです。
インスタンスメソッドを設計するステップ
ステップ 1:クラスの「役割」を言葉で書き出す
まず、クラスの役割を日本語で書いてみます。
例:Product クラス
- 商品名と価格を持つ
- 税込み価格を計算できる
- 情報を表示できる
ステップ 2:それぞれを「データ」と「処理」に分ける
- データ
- 商品名
- 価格
- 処理
- 税込み価格を計算する
- 情報を表示する
ステップ 3:クラスに落とし込む
class Product
{
// データ
public string Name { get; set; }
public int Price { get; set; }
// 処理1:税込価格を計算する
public int GetPriceWithTax()
{
return (int)(Price * 1.10); // 消費税 10% と仮定
}
// 処理2:情報を表示する
public void PrintInfo()
{
Console.WriteLine($"商品名: {Name}, 価格(税抜): {Price}, 価格(税込): {GetPriceWithTax()}");
}
}
C#使う側は、
class Program
{
static void Main(string[] args)
{
Product p = new Product
{
Name = "ノート",
Price = 100
};
p.PrintInfo();
Console.ReadLine();
}
}
C#という形で、 「商品に自分の情報を表示してもらう」イメージでメソッドを呼び出します。
Day 34 用の練習テンプレート
最後に、インスタンスメソッドと責務の練習に使えるテンプレートを紹介します。 自分の好きなテーマに置き換えて遊んでみてください。
タスク(ToDo)クラスの例
using System;
class TaskItem
{
// データ:タスクのタイトルと完了フラグ
public string Title { get; set; }
public bool IsDone { get; private set; }
// 責務1:タスクを完了にする
public void Complete()
{
IsDone = true;
Console.WriteLine($"タスク「{Title}」を完了にしました。");
}
// 責務2:タスクの状態を表示する
public void PrintStatus()
{
string status = IsDone ? "完了" : "未完了";
Console.WriteLine($"タスク: {Title}, 状態: {status}");
}
}
class Program
{
static void Main(string[] args)
{
TaskItem task = new TaskItem
{
Title = "C# の勉強をする"
};
task.PrintStatus(); // まだ未完了
task.Complete(); // 完了にする
task.PrintStatus(); // 完了になっている
Console.ReadLine();
}
}
C#このテンプレートをベースにして、
Bookクラスで「読了フラグを切り替えるメソッド」を作るUserクラスで「ログインする/ログアウトするメソッド」を作るOrderクラスで「合計金額を計算するメソッド」を作る
など、いろいろな「インスタンスメソッド」を考えてみると、 クラスの責務とメソッド設計の感覚がぐっと身近になります。
Day 34 のまとめ
Day 34 では、
- インスタンスメソッド = オブジェクトが自分のデータを使って行う処理
- クラスの責務 = そのクラスが何を担当するのか、という役割の考え方
- データと処理をまとめる = 現実のものに近い形でコードを整理すること
という流れで、 「クラスにどんなメソッドを書けばいいのか」を考える視点を育てました。
この先、
- クラス同士の関係(1対多、親子など)
- 責務の分割と再利用
- より大きなプログラムの設計
に進んでいくとき、 今日学んだ 「クラスの責務」と「インスタンスメソッド」 は、 設計の軸になる大事なテーマです。
ぜひ、
- 自分でクラスを 1 つ考えて、「このクラスは何ができるべきか?」を言葉で書き出してみる
- その言葉を、インスタンスメソッドとしてコードに落とし込んでみる
- データと処理がきれいにまとまっているか、眺めてみる
といった練習を通して、 クラス設計を「難しい理論」ではなく、 「自分の頭の中のイメージをコードにする楽しい作業」として、少しずつ体に馴染ませていってください。
