LoginSignup
11
11

More than 1 year has passed since last update.

SOLID原則を勉強する その1~単一責任の原則 (SRP)~

Last updated at Posted at 2021-07-11

目次

  1. SOLID原則を勉強する その1~単一責任の原則 (SRP)~ ←いまここ
  2. SOLID原則を勉強する その2~オープン・クローズド原則(OCP)~
  3. SOLID原則を勉強する その3~リスコフの置換原則(LSP)~
  4. SOLID原則を勉強する その4~インターフェース分離の原則(ISP)~
  5. SOLID原則を勉強する その5~依存性逆転の原則(DIP)~

前置き

書籍を読んだり、ググったりして、自分に分かりやすいようにまとめた記事です。
より詳しく知りたい方は、下記の参考文献を読んでみてください。

参考文献

Clean Architecture 達人に学ぶソフトウェアの構造と設計 | Amazon
Adaptive Code ~ C#実践開発手法 | Amazon
C#の設計の基本【SOLID原則】まとめ
Unity開発で使える設計の話+Zenjectの紹介

単一責任の原則 (SRP)

  • 1個のクラスの役割は1つ
    • 1つのクラスを変更する理由は1つでないといけない
  • なにか仕様変更があったとき、他のクラスに影響しないようにする
    • 変更する理由が同じものを集める、変更する理由が違うものは分ける

  • モジュールはたったひとつのアクターに対して責務を負うべき
    • モジュール:ソースコード
    • アクター:変更を望む人たちをひとまとめにしたグループ
  • 一番わかりやすいのは、データを関数から切り離す
    • 各クラスは、特定の機能に必要なソースコードだけ持っている = 他のクラスについては知らない
  • 複数のクラスをインスタンス化して管理しなければならない そんなときは Facade パターンを使う

コード例

「弾を作成(撃つ)する」機能と「機体を移動する」機能を持つ Spaceship クラスに単一責任の原則を適用してみる
こちらのサンプルコードを参考にしました。unity3d-jp-tutorials/2d-shooting-game

before

Spaceship.cs
using UnityEngine;

// Rigidbody2Dコンポーネントを必須にする
[RequireComponent(typeof(Rigidbody2D))]
public class Spaceship : MonoBehaviour
{
    // 移動スピード
    public float speed;

    // 弾を撃つ間隔
    public float shotDelay;

    // 弾のPrefab
    public GameObject bullet;

    // 弾の作成
    public void Shot (Transform origin)
    {
        Instantiate (bullet, origin.position, origin.rotation);
    }

    // 機体の移動
    public void Move (Vector2 direction)
    {
        GetComponent<Rigidbody2D>().velocity = direction * speed;
    }
}

after

  • 「弾を作成(撃つ)する」機能と「機体を移動する」機能をクラスごとに分ける
    • Shooter クラスと Movable クラスに分割
Shooter.cs
using UnityEngine;

public class Shooter : MonoBehaviour
{
    // 弾を撃つ間隔
    [SerializeField] float _shotDelay;
    // 弾の Prefab
    [SerializeField] GameObject _bullet;

    public float ShotDelay
    {
        get { return _shotDelay; }
    }

    // 弾の作成
    public void Shot(Transform origin)
    {
        Instantiate(_bullet, origin.position, origin.rotation);
    }
}
Movable.cs
using UnityEngine;

public class Movable : MonoBehaviour
{
    // 移動速度
    [SerializeField] float _speed;
    // SpaceshipのRigidbody
    [SerializeField] Rigidbody2D _rigidbody;

    // 機体の移動
    public void Move(Vector2 direction)
    {
        _rigidbody.velocity = direction * _speed;
    }
}

終わりに

もし、変なところがあったらぜひ教えてください。
オープン・クローズド原則(OCP)、リスコフの置換原則(LSP)、インターフェース分離の原則(ISP)、依存性逆転の原則(DIP) もいずれ記事にする予定です。

11
11
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
11
11