基礎から学ぶC#入門 90日コース | クラス・インスタンス・設計 - Day 34:クラスのメソッド

Web APP 90日で身につけるC#
スポンサーリンク
スポンサーリンク

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 のインスタンスに対して呼び出される
  • メソッドの中では、そのインスタンスの NameAge を使って処理している

というところです。

重要ポイント:

  • インスタンスメソッドは「そのオブジェクト自身のデータ」を使う処理を書く場所です。
  • 「このクラスのオブジェクトは何ができるべきか?」を考えると、インスタンスメソッドの形が見えてきます。

クラスの責務を考える

責務とは「そのクラスの担当範囲」

オブジェクト指向でよく出てくる言葉に、

責務(せきむ)

があります。 これは、

「そのクラスが何を担当するのか」

という意味です。

例えば、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 つ考えて、「このクラスは何ができるべきか?」を言葉で書き出してみる
  • その言葉を、インスタンスメソッドとしてコードに落とし込んでみる
  • データと処理がきれいにまとまっているか、眺めてみる

といった練習を通して、 クラス設計を「難しい理論」ではなく、 「自分の頭の中のイメージをコードにする楽しい作業」として、少しずつ体に馴染ませていってください。

タイトルとURLをコピーしました