SOLIDとは、Robert C. Martin(通称アンクル・ボブ)が提唱したソフトウェア設計のための5つの原則の集合です。これらの原則は、柔軟で保守性の高いソフトウェアシステムを構築するのに役立ちます。SOLID は以下の5つの頭文字から成ります:
原則と実践的な応用
原則: クラスは一つの責任だけを持つべきです。つまり、各クラスは変更する理由を一つだけ持つべきです。
例と実践的な応用: 例えば、従業員管理システムを開発しているとしましょう。初めに、従業員の情報を管理し、給与を計算し、データベースに保存するなど、複数のタスクを実行する 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)