0
0

オープン・クローズドの原則

Posted at

概要

オープン・クローズドの原則の定義は「拡張に対して開かれているべきであり、変更に対しては閉じているべき」と、よくそのように言われます。

しかし、一見すると主語が書いてないので、拡張も変更も同じ主語を持つとした場合、矛盾してしまいます。

これは厳密にいうと、既存のコードの変更に対しては閉じているべき(=変更せずにいられるべき)で、拡張に対して開かれているべき(=新機能の追加をしやすくあるべき)である。つまり、既存のコードを変更せずに、新しい機能を追加できるような設計が望ましいということです。

つまり、どういうことだってばよ?

ダックタイピングで実装した例

オープン・クローズドの原則に違反した実装(変更に閉じていない)
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は変更する必要がない
0
0
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
0
0