24
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

初心者こそ知っておきたい「単一責任の原則」

24
Posted at

プログラミングを始めたばかりの頃って、
「動けばいいや!」と勢いでコードを書きがちですよね。

でも、あとで読み返すと、

  • どこを直せばいいのか分からない
  • 1行変えたら別の場所が壊れた
  • クラスが巨大化して手がつけられない

こんな経験、ありませんか。

そんな“未来の自分を助ける”ための考え方として、
単一責任の原則(Single Responsibility Principle / SRP)
というものがあります。


単一責任の原則って何?

ざっくり言うと、

「1つのクラス(またはメソッド)は、1つの責任だけを持つべき」

という考え方です。

もっと噛み砕くと、

  • 1つのクラスにいろんな役割を詰め込まない
  • 1つのメソッドに“あれもこれも”やらせない
  • 1つの変更理由しか持たないようにする

ということです。


なんでそんなに大事なの?

初心者のうちは「別に1クラスで全部書いても動くし…」と思うかもしれません。
でも、アプリが大きくなるほど、SRPを守っているかどうかで難易度が全然違います。

SRPを守ると起きる良いこと

  • 修正がしやすい
    どこを直せばいいかが明確になる。

  • バグが減る
    影響範囲が小さくなるので壊れにくい。

  • テストしやすい
    役割が分かれていると単体テストが簡単。

  • 再利用しやすい
    “1つのことだけやる部品”は使い回しやすい。

逆に、SRPを無視すると、

  • クラスが肥大化して“神クラス”になる
  • 修正のたびに別の場所が壊れる
  • テストが書けない
  • そもそも読む気が起きない

という地獄が待っています。


具体例を見てみよう

❌ 悪い例:1つのクラスに全部詰め込む

public class UserService
{
    public void Register(string name, string email)
    {
        // 入力チェック
        if (string.IsNullOrWhiteSpace(name) || string.IsNullOrWhiteSpace(email))
        {
            throw new ArgumentException("Invalid input");
        }

        // DB保存
        SaveToDatabase(name, email);

        // メール送信
        SendMail(email, "登録ありがとう!");
    }

    private void SaveToDatabase(string name, string email)
    {
        // DB保存処理(仮)
    }

    private void SendMail(string email, string message)
    {
        // メール送信処理(仮)
    }
}

このクラスは、

  • 入力チェック
  • DB保存
  • メール送信

という3つの責任を持っています。

これが積み重なると、クラスがどんどん巨大化していきます。


⭕ 良い例:責任ごとに分ける

public class UserValidator
{
    public void Validate(string name, string email)
    {
        if (string.IsNullOrWhiteSpace(name) || string.IsNullOrWhiteSpace(email))
        {
            throw new ArgumentException("Invalid input");
        }
    }
}

public class UserRepository
{
    public void Save(string name, string email)
    {
        // DB保存処理(仮)
    }
}

public class Mailer
{
    public void SendWelcome(string email)
    {
        // メール送信処理(仮)
    }
}

public class UserService
{
    private readonly UserValidator _validator = new();
    private readonly UserRepository _repository = new();
    private readonly Mailer _mailer = new();

    public void Register(string name, string email)
    {
        _validator.Validate(name, email);
        _repository.Save(name, email);
        _mailer.SendWelcome(email);
    }
}

こうすると、

  • 入力チェックを変えたい → UserValidator だけ触ればOK
  • DBを変えたい → UserRepository だけ触ればOK
  • メール文面を変えたい → Mailer だけ触ればOK

と、修正ポイントが明確になります。


「分けすぎじゃない?」と思ったあなたへ

初心者の方からよく聞くのが、

「こんなに細かく分ける必要あるの?」

という疑問です。

正直、最初は“分けすぎ”くらいでちょうどいいです。
慣れてくると、どこまで分けるべきか自然と分かるようになります。

大事なのは、

  • 1つのクラスが複数の理由で変更される状態を避けること
  • 役割を明確にして、未来の自分が困らないようにすること

この2つです。


まとめ

  • 単一責任の原則は「1つのクラスは1つのことだけやる」という考え方
  • コードが読みやすく、修正しやすく、バグが減る
  • 最初は“分けすぎ”くらいでOK
  • 未来の自分を助けるための習慣だと思って取り入れてみると良い

24
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?