構造化プログラミングからオブジェクト指向へ繋ぐブリッジ練習問題セット

ソリューション、プロジェクトの新規作成

練習用に次のようなプロジェクトを作成します

BridgeExercises (ソリューション)
├─ Step1_StructuredDisplay (プロジェクト: 変数だけで学生情報を表示)
├─ Step2_MethodRefactor (プロジェクト:ShowInfo メソッド化・引数あり)
├─ Step3_StudentClass (プロジェクト:Student クラス化)
└─ Step4_BirthdayExtension (プロジェクト: CelebrateBirthday メソッド追加)

✅ 前提

  • 構造化プログラミング(変数・条件分岐・繰り返し・配列)まで習得済み
  • メソッドの基本を一通り理解した段階
  • 「データと処理を“ひとまとまり”にする」イメージをつかむ

■ 練習問題構成

ステップ目的
1. 構造化のみで書くデータと処理が分離している形を体験する
2. メソッドで整理処理を部品化して再利用できることを体験する
3. クラスにまとめるデータと処理を1つに束ねて「モノ化」する

✅ 【ステップ1】構造化での学生情報表示

お題

  • 名前、年齢を変数で保持する
  • 画面に「〇〇さんは△△歳です」と表示する
  • 3人分のデータを順に表示する

ヒント

  • 配列を使ってもOK
  • メソッドは使わない
using System;

class Program 
{
    static void Main() 
    {
        string name1 = "佐藤";
        int age1 = 20;

        string name2 = "鈴木";
        int age2 = 22;

        string name3 = "田中";
        int age3 = 19;

        Console.WriteLine($"{name1}さんは{age1}歳です");
        Console.WriteLine($"{name2}さんは{age2}歳です");
        Console.WriteLine($"{name3}さんは{age3}歳です");
    }
}

✅ 【ステップ2】メソッド化で整理

お題

  • 【問題1】の表示処理を ShowInfo メソッドとして作る
  • 引数で名前と年齢を受け取り表示する

追加条件

  • 3人分を繰り返し呼び出して表示する
using System;

class Program 
{
    static void ShowInfo(string name, int age) 
    {
        Console.WriteLine($"{name}さんは{age}歳です");
    }

    static void Main() 
    {
        ShowInfo("佐藤", 20);
        ShowInfo("鈴木", 22);
        ShowInfo("田中", 19);
    }
}

✅ 【ステップ3】クラス化でオブジェクト指向に変換

お題

  • Student クラスを作る
  • Name と Age をプロパティとして持つ
  • ShowInfo をクラスのメソッドにする
  • 3人分の Student オブジェクトを作成して、順に ShowInfo を呼び出す
using System;

class Student 
{
    public string Name;
    public int Age;

    public void ShowInfo() 
    {
        Console.WriteLine($"{Name}さんは{Age}歳です");
    }
}

class Program 
{
    static void Main() 
    {
        Student s1 = new Student();
        s1.Name = "佐藤";
        s1.Age = 20;

        Student s2 = new Student();
        s2.Name = "鈴木";
        s2.Age = 22;

        Student s3 = new Student();
        s3.Name = "田中";
        s3.Age = 19;

        s1.ShowInfo();
        s2.ShowInfo();
        s3.ShowInfo();
    }
}

✅ 【ステップ4】少し発展

お題

  • Student クラスに新しく CelebrateBirthday() メソッドを追加
  • このメソッドは年齢を1つ増やして「〇〇さんの年齢は△△歳になりました」と表示する
  • 任意の1人の年齢を誕生日で更新してから、もう一度 ShowInfo を呼ぶ
using System;

class Student 
{
    public string Name;
    public int Age;

    public void ShowInfo() 
    {
        Console.WriteLine($"{Name}さんは{Age}歳です");
    }

    public void CelebrateBirthday() 
    {
        Age++;
        Console.WriteLine($"{Name}さんの年齢は{Age}歳になりました");
    }
}

class Program 
{
    static void Main() 
    {
        Student s1 = new Student();
        s1.Name = "佐藤";
        s1.Age = 20;

        Student s2 = new Student();
        s2.Name = "鈴木";
        s2.Age = 22;

        Student s3 = new Student();
        s3.Name = "田中";
        s3.Age = 19;

        s1.ShowInfo();
        s2.ShowInfo();
        s3.ShowInfo();

        Console.WriteLine("--- 誕生日後 ---");
        s2.CelebrateBirthday();

        Console.WriteLine("--- 再表示 ---");
        s2.ShowInfo();
    }
}

✅ 【振り返りワーク】

問い

  • 構造化で書いたときと、クラス化したときの 「見やすさ」「追加変更のしやすさ」 を比較して気づいたことを書いてみましょう。

1. 見やすさ(可読性)の違い

観点構造化のみクラス化後
変数・データのまとまり学生名、点数などが バラバラの変数 として散在し、同じ型のデータが離れて配置される。Student クラスに プロパティとして一括管理。データと意味が近いコードが近接し、一覧性が向上。
処理の流れMain にロジックが集中し、長い手続き的コード になりやすい。表示や計算を メソッドへ分割。Main には “何をするか” だけが残り、上から読んで概略がつかめる。
命名規則の反映グローバル変数名やメソッド名の 重複・衝突 に注意が必要。クラスが名前空間として機能するため、意図した名前 をそのまま付けても衝突しにくい。

2. 追加・変更のしやすさ(保守性)の違い

観点構造化のみクラス化後
新しい属性の追加例:学生に「生年月日」を加えると、表示ロジックや入力ロジックを 複数箇所で修正 する必要がある。Student クラスに BirthDay プロパティを 1 行追加し、必要なメソッドだけ修正 すれば済む。
共通処理の再利用類似表示・計算をするたびに コピペや引数違いの関数 を量産しやすい。Student.Print() や Student.GetAverage() を 一度実装すれば再利用。DRY 原則を守りやすい。
拡張機能の導入例:出席管理機能を追加するとき、既存変数群と新変数群の 関係が追いにくくバグが出やすいAttendance クラスを作って Student に持たせる/継承するなど、OOP の拡張パターンを使って局所的に追加できる。
テスト容易性ロジックが Main に密結合しており、ユニットテストが困難各メソッドが独立しているため、小さな単位でテスト できる。

3. 気づき・学び

  1. 「データ+振る舞い」のまとまりがあると読み手の頭の切り替えコストが下がる
    • クラスは「このデータは何ができる?」を自然に示し、コードレビュー時の認知負荷を大幅に減らした。
  2. 変更箇所を“点”から“面”へ集約できる
    • 構造化では散らばっていた修正が、クラスの内部だけで完結するため影響範囲を正確に把握できる。
  3. 小規模でも OOP の恩恵はあるが、目的を意識したバランスが重要
    • 10 行程度のスクリプトではクラス生成が冗長になる場合もある。「複数人で保守・拡張するか」が採用判断の目安になる。
  4. メソッド命名・可視性(public/private)の設計が“設計書”代わりになる
    • コードそのものが仕様書となり、後工程(ドキュメントやテスト)のコストを抑制できることを体験できた。

4. まとめ

  • 見やすさ:クラス化によってロジックとデータを近づけ、コードの意図が読み取りやすくなった。
  • 追加変更のしやすさ:クラス内部に変更点を閉じ込められ、影響範囲が予測しやすく修正コストが下がった。
  • 総合評価:規模が大きくなるほどクラス化の効果が指数的に現れる。小さな例題でも「後から伸ばす」視点を持つことが重要だと感じた。

✅ 【オプション】

内容できれば
UMLで描くStudent クラス図を手書きしてみる
Excelで考える1行を1人の Student と考えてみる
チーム開発想定誰がどの部分を担当すると効率的か考える

✏️ 【まとめの一言】

ブリッジ練習の目的は、「データと処理を分ける」→「まとめて箱にする」という流れを体験して、オブジェクト指向の必然性を感じることです。

訪問数 6 回, 今日の訪問数 6回

C#,メソッド

Posted by hidepon