SOLIDとは、Robert C. Martin(通称アンクル・ボブ)が提唱したソフトウェア設計のための5つの原則の集合です。これらの原則は、柔軟で保守性の高いソフトウェアシステムを構築するのに役立ちます。SOLID は以下の5つの頭文字から成ります:

  1. Single Responsibility Principle (SRP): シングル責任原則
  2. Open/Closed Principle (OCP): オープン/クローズド原則
  3. Liskov Substitution Principle (LSP): リスコフ置換原則
  4. Interface Segregation Principle (ISP): インターフェース segregation 原則
  5. Dependency Inversion Principle (DIP): 依存性逆転の原則

原則と実践的な応用

  1. Single Responsibility Principle (SRP)

原則: クラスは一つの責任だけを持つべきです。つまり、各クラスは変更する理由を一つだけ持つべきです。

例と実践的な応用: 例えば、従業員管理システムを開発しているとしましょう。初めに、従業員の情報を管理し、給与を計算し、データベースに保存するなど、複数のタスクを実行する Employee クラスがあります。

class Employee
  attr_accessor :name, :id

  def initialize(name, id)
    @name = name
    @id = id
  end

  def calculate_salary
    # 従業員の給与計算
  end

  def save_to_database
    # 従業員情報をデータベースに保存する
  end
end

SRPに則り、これらの機能は別々のクラスに分けるべきである

class Employee
  attr_accessor :name, :id

  def initialize(name, id)
    @name = name
    @id = id
  end
end

class SalaryCalculator
  def calculate_salary(employee)
    # 従業員の給与計算
  end
end

class EmployeeRepository
  def save_to_database(employee)
    # 従業員情報をデータベースに保存する
  end
end

2. Open/Closed Principle (OCP)

原則: モジュールは拡張には開かれているが、修正には閉じているべきです。つまり、モジュールの動作はそのモジュール自体のソースコードを変更することなく拡張可能であるべきです。

例と実践的な応用: 支払いシステムにおいて、最初にクレジットカードでの支払いを処理するPaymentProcessorクラスがあるとします。

class PaymentProcessor
  def process_credit_card_payment
    # クレジットカード決済の処理
  end
end

新しい支払い方法(例えば、PayPayによる支払い)を追加したい場合、OCPの原則に従って、PaymentProcessorを修正するのではなく、インターフェースと継承クラスを使用してシステムを拡張するべきです。

module PaymentMethod
  def process_payment
    # 決済の処理
  end
end

class CreditCardPayment
  include PaymentMethod

  def process_payment
    # クレジットカード決済の処理
  end
end

class PayPayPayment
  include PaymentMethod

  def process_payment
    # Paypay決済の処理
  end
end

class PaymentProcessor
  def initialize(payment_method)
    @payment_method = payment_method
  end

  def process
    @payment_method.process_payment
  end
end

3. Liskov Substitution Principle (LSP)