私は、オープンクローズド原則の意図を理解しています。変更せずに拡張しようとするように指示することで、変更中に既に機能しているものを壊すリスクを減らすことを目的としています。
しかし、この原則が実際にどのように適用されるかを理解するのに苦労しました。私の理解では、それを適用するには2つの方法があります。変更前と変更後:
前:できるだけ抽象化して「未来を予測する」プログラムを作成します。たとえば、将来システムにsが追加された
drive(Car car)
場合、メソッドは変更する必要Motorcycle
があるため、おそらくOCPに違反します。ただし、この方法drive(MotorVehicle vehicle)
は将来変更する必要性が低いため、OCPに準拠しています。ただし、将来を予測し、システムにどのような変更が加えられるかを事前に知ることは非常に困難です。
変更後:変更が必要な場合、現在のコードを変更する代わりにクラスを拡張します。
練習#1を理解するのは難しくありません。しかし、適用方法を理解するのに苦労しているのは実践#2です。
例(YouTubeのビデオから取得しました):CreditCard
オブジェクトを受け入れるクラスにメソッドがあるとします:makePayment(CraditCard card)
。1日Voucher
がシステムに追加されます。このメソッドはそれらをサポートしていないため、変更する必要があります。
そもそもメソッドを実装するとき、未来とプログラムをより抽象的な用語で予測することに失敗しました(たとえばmakePayment(Payment pay)
、今、既存のコードを変更する必要があります)。
練習#2では、変更するのではなく拡張することで機能を追加する必要があります。どういう意味ですか?既存のコードを単に変更するのではなく、既存のクラスをサブクラス化する必要がありますか?コードの書き換えを避けるために、何らかのラッパーを作成する必要がありますか?
または、原則は「機能を正しく変更/追加する方法」に言及するのではなく、「最初に変更を加える必要がないようにする方法」(つまり、プログラムを抽象化する方法)に言及していますか?