【入門】オブジェクト指向って本当に必要?
〜ネット会員登録を題材にその力を体感しよう〜

はじめに
「オブジェクト指向(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-a | has-a |
拡張性 | 階層が複雑に | 柔軟に部品を追加 |
結合度 | 高い | 低い |
テストのしやすさ | 難しい | 単体テストしやすい |
4. OOPが生きる場面とは?
- ユーザーや商品、キャラクターなど「実体」が登場するアプリ
- 情報をひとまとまりとして扱いたいとき
- 後で機能を追加・変更する可能性があるとき
- チーム開発で分担しやすくしたいとき
5. まとめ
オブジェクト指向は、「人や物をモデルとして扱う」発想です。
手続き型と比べて学習コストは少し高いですが、後々の開発効率・保守性の差は圧倒的です。
また、継承の使用は目的を絞って最小限にし、現代の設計では委譲による柔軟な構造が重視されます。
おまけ:挑戦課題
- 複数のMemberをList<Member>で管理し、ループで一覧表示する
- Ageを元に「成人」「未成年」を判定するメソッドを追加
- 入力から会員情報を登録できるようにする
ディスカッション
コメント一覧
まだ、コメントがありません