【入門】オブジェクト指向って本当に必要?

〜ネット会員登録を題材にその力を体感しよう〜

はじめに

「オブジェクト指向(OOP)って何のためにあるの?」

「難しそうだし、書かなくても動くんじゃないの?」

…そう思ったことはありませんか?

本記事では、「ネット会員登録」の仕組みを題材にして、OOPを使うメリットを実際のコードの比較から体感してもらいます。

初心者でもわかる構成で、手続き型 → OOPへのリファクタリングまで丁寧に追っていきます。


プロジェクト名 MemberRegistrationOopDemo


1. 非オブジェクト指向で書いた会員登録

まずは、クラスを使わない「非オブジェクト指向」なコードから見てみましょう。

string name = "田中太郎";
string email = "tanaka@example.com";
int age = 25;

Console.WriteLine("登録ユーザー:");
Console.WriteLine($"名前: {name}");
Console.WriteLine($"メール: {email}");
Console.WriteLine($"年齢: {age}");

このコード自体は正しく動作しますが、次のような課題があります。

■ 課題点

  • ユーザーが2人、3人と増えるたびに変数が爆発
  • データ構造がバラバラで扱いづらい
  • 表示や処理の再利用がしにくい
  • 保守性が低く、変更が面倒

2. クラスを使ってオブジェクト指向で書くと?

では、次にオブジェクト指向を使って同じ処理を書いてみましょう。

class Member
{
    public string Name { get; set; }
    public string Email { get; set; }
    public int Age { get; set; }

    public void ShowInfo()
    {
        Console.WriteLine("登録ユーザー:");
        Console.WriteLine($"名前: {Name}");
        Console.WriteLine($"メール: {Email}");
        Console.WriteLine($"年齢: {Age}");
    }
}

このクラスを使って、以下のようにオブジェクトを生成します。

class Program
{
    static void Main()
    {
        Member member1 = new Member
        {
            Name = "田中太郎",
            Email = "tanaka@example.com",
            Age = 25
        };

        member1.ShowInfo();
    }
}

■ 改善されたポイント

  • 名前・メール・年齢を1つの「まとまり」として扱える
  • メソッドで処理をカプセル化(再利用&拡張しやすい)
  • 複数ユーザーの管理が格段にしやすくなる

3. 拡張してみよう:プレミアム会員の情報を追加

A. 一般的な方法:継承(現代では推奨されにくい)

class PremiumMember : Member
{
    public string PremiumCode { get; set; }

    public void ShowPremiumInfo()
    {
        ShowInfo();
        Console.WriteLine($"プレミアムコード: {PremiumCode}");
    }
}
var pMember = new PremiumMember
{
    Name = "佐藤花子",
    Email = "hanako@example.com",
    Age = 30,
    PremiumCode = "PRM2025"
};

pMember.ShowPremiumInfo();

上記のような継承の使い方は、初心者にとって分かりやすい導入例としては有効ですが、実際の開発では次の理由から避けられる傾向があります:

■ 継承が避けられる理由

  • 「〜は〜である(is-a)」という関係が明確でないと設計が破綻しやすい
  • 基底クラスの変更が派生クラスすべてに波及する
  • 機能追加のたびに継承階層が増えると保守が困難になる

■ 推奨される方法:「委譲(コンポジション)」

プレミアム情報を別クラスにし、それを Member クラスが所有する形にします(has-a関係)。

class Member
{
    public string Name { get; set; }
    public string Email { get; set; }
    public int Age { get; set; }

    public PremiumInfo Premium { get; set; }  // null なら無料会員
}

class PremiumInfo
{
    public string PremiumCode { get; set; }
    public DateTime ExpirationDate { get; set; }

    public void ShowPremium()
    {
        Console.WriteLine($"プレミアムコード: {PremiumCode}");
        Console.WriteLine($"期限: {ExpirationDate:yyyy/MM/dd}");
    }
}

使用例:

var member = new Member
{
    Name = "佐藤花子",
    Email = "hanako@example.com",
    Age = 30,
    Premium = new PremiumInfo
    {
        PremiumCode = "PRM2025",
        ExpirationDate = DateTime.Now.AddMonths(6)
    }
};

member.Premium?.ShowPremium();

継承と委譲の比較

観点継承委譲(コンポジション)
関係性is-ahas-a
拡張性階層が複雑に柔軟に部品を追加
結合度高い低い
テストのしやすさ難しい単体テストしやすい

4. OOPが生きる場面とは?

  • ユーザーや商品、キャラクターなど「実体」が登場するアプリ
  • 情報をひとまとまりとして扱いたいとき
  • 後で機能を追加・変更する可能性があるとき
  • チーム開発で分担しやすくしたいとき

5. まとめ

オブジェクト指向は、「人や物をモデルとして扱う」発想です。

手続き型と比べて学習コストは少し高いですが、後々の開発効率・保守性の差は圧倒的です。

また、継承の使用は目的を絞って最小限にし、現代の設計では委譲による柔軟な構造が重視されます。


おまけ:挑戦課題

  • 複数のMemberをList<Member>で管理し、ループで一覧表示する
  • Ageを元に「成人」「未成年」を判定するメソッドを追加
  • 入力から会員情報を登録できるようにする

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