私はオープン/クローズドの原則を理解しようとしています(私の場合はPHPの場合ですが、それは実際には違いはありません)。
私が理解しているのは、クラスが変更のために開かれることは決してないということです。バグ修正のみ。クラスに新しいコードを追加したい場合は、新しいコードを作成して「古い」クラスを拡張する必要があります。それが私がそれに新しいコードを追加できる唯一の方法です。
ある意味で、私はこれの利点を見ることができます。基本的に、古いコードが常に機能するある種のバージョン管理システムを作成しますが、新しいクラスの使用もいつでも試みることができるためです。
しかし、これは実際にはどのように機能しますか?つまり、次のクラスがあるとします。
class MyObject
{
public function doSomething()
{
echo 'Im doing something';
}
}
だからどこかで私はおそらくこのクラスをインスタンス化しています:
$obj = new MyObject();
しかし、そのオブジェクトに別のメソッドを含めるのは良いことだと思います。だから私も何か他のことができます。OCPによると、クラスを変更することはできません。だから私は古いものに拡張する新しいものを作成する必要がありますか?
最初の問題。新しいクラスを呼び出すにはどうすればよいですか?それは実際には完全に新しいオブジェクトではないからです。好き。UserオブジェクトはUserオブジェクトです。別の方法が必要だからといって、いきなり完全に違う名前を付けることはできません。とにかく、私は新しいクラスを作成します:
class MyNewObject extends MyObject
{
public function doSomethingElse()
{
echo 'Im doing something else now';
}
}
これは、「MyObject」クラスをインスタンス化したコード行を変更して、「MyNewObject」クラスに置き換える必要があることも意味します。そして、それが複数の場所で行われている場合は、ソースコードを検索する必要があります...(ほとんどの場合、特定のクラスをインスタンス化するために「new」キーワードを使用するコントローラークラスのメソッドについて考えてみてください)。
同じことが基本的に継承にも当てはまります。古いクラスを継承する各クラスを見つけて、それを新しいクラスに置き換える必要があります。
つまり、基本的に私の質問は次のとおりです。
新しいメソッドを持つ新しいクラスにどのように名前を付けますか?いくつかの新しい機能を追加したからといって、クラスにまったく新しい名前を付けることができるわけではありません...
そして、「古い」クラスが複数の場所からインスタンス化(または継承)された場合はどうなりますか。それなら私はそれらすべての場所を見つけなければならないでしょう...利益はどこにありますか?