私はオープン/クローズドの原則を理解しようとしています(私の場合、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'キーワードを使用します)。
同じことが基本的に継承に適用されます。私は古いクラスを継承する各クラスを見つけなければならず、新しいクラスと置き換える必要があります。
だから基本的に私の質問は以下のとおりです。
どのように新しいメソッドを持つ新しいクラスに名前を付けるのですか?私はいくつかの新しい機能を追加するだけbecasue、「古い」classsが複数の場所からインスタンス(または継承)されている場合、私は...クラスに
そして、何を全く新しい名前を付けることができ意味するものではありません。そして、私はそれらの場所のすべてを見つけなければならないでしょう...利益はどこですか?あなたは新しいクラスをインスタンス化して、まだ拡張1のすべての機能にアクセスすることができます
function __construct() {
parent::__construct();
}
この方法:
'$ x = new MyObj_version_3.14159265()'? mmmmm。パイ。 –
[Open/closed principle](http://en.wikipedia.org/wiki/Open/closed_principle)を解釈するには2通りの方法があることに注意してください。あなたは主に古いもの(Meyers)を考えているようですが、そのユースケースは最近、代表団によって通常扱われます。 –
もっと現実的な例でこの質問に答える方が簡単でしょう。名前の付け方などはもっと明白だと思います。 – Fuhrmanator