概要
オープン・クローズドの原則の定義は「拡張に対して開かれているべきであり、変更に対しては閉じているべき」と、よくそのように言われます。
しかし、一見すると主語が書いてないので、拡張も変更も同じ主語を持つとした場合、矛盾してしまいます。
これは厳密にいうと、既存のコードの変更に対しては閉じているべき(=変更せずにいられるべき)で、拡張に対して開かれているべき(=新機能の追加をしやすくあるべき)である。つまり、既存のコードを変更せずに、新しい機能を追加できるような設計が望ましいということです。
つまり、どういうことだってばよ?
ダックタイピングで実装した例
オープン・クローズドの原則に違反した実装(変更に閉じていない)
class PaymentProcessor
def process_payment(payment_type, amount)
case payment_type
when :credit_card
# クレジットカードでの支払い処理
when :paypal
# PayPalでの支払い処理
# 他の支払い方法が追加されたら、ここにコードを追加する必要がある
end
end
end
オープン・クローズドの原則を遵守した実装
class PaymentProcessor
def process_payment(payment_processor, amount)
payment_processor.process(amount)
end
end
class CreditCardPayment
def process(amount)
# クレジットカードでの支払い処理
end
end
class PayPalPayment
def process(amount)
# PayPalでの支払い処理
end
end
# 他の支払い方法が追加されたら、新しくクラスを追加すればいい
# 他の支払い方法が追加されても、process_paymentは変更する必要がない