Принцип Open/Closed - Как называть новые версии?

Я пытаюсь уловить принцип Open/Closed (в моем случае для PHP, но это не должно иметь большого значения).

Насколько я понимаю, класс никогда не открыт для модификации. Только для исправления ошибок. Если бы я хотел добавить новый код в класс, мне пришлось бы создать новый и расширить «старый» класс. Только так я могу добавить к нему новый код.

В некотором смысле я вижу преимущества этого. Потому что в основном вы создаете своего рода систему управления версиями, где старый код всегда работает, но вы всегда можете попытаться использовать и новые классы.

Но как это работает на практике? Я имею в виду, предположим, что у меня есть следующий класс:

class MyObject
{
    public function doSomething()
    {
        echo 'Im doing something';
    }
}

Итак, где-то я, вероятно, создаю экземпляр этого класса:

$obj = new MyObject();

Но затем я решаю, что хорошо иметь другой метод в этом объекте. Так что я могу сделать что-то еще. Согласно OCP я не могу изменить класс. Итак, я должен создать новый, который распространяется на старый, верно?

Первая проблема. Как мне назвать новый класс? Потому что это не совсем новый объект. Нравится. объект пользователя является объектом пользователя. Я не могу внезапно дать ему совершенно другое имя только потому, что ему нужен другой метод. В любом случае, я создаю новый класс:

class MyNewObject extends MyObject
{
    public function doSomethingElse()
    {
        echo 'Im doing something else now';
    }
}

Теперь это также означает, что я должен изменить строку кода, в которой я создал экземпляр класса «MyObject», и заменить его классом «MyNewObject», правильно..? И если это делается более чем в одном месте, то мне нужно искать в моем исходном коде... (Подумайте о методе в классе контроллера, который почти всегда использует ключевое слово «новое» для создания экземпляров определенных классов).

То же самое в основном относится к наследованию. Мне нужно найти каждый класс, который наследует старый класс, и заменить его новым классом.


Итак, в основном мои вопросы таковы:

Как вы называете новые классы, у которых есть новые методы? То, что я добавил некоторые новые функции, не означает, что я могу дать классу совершенно новое имя...

А что, если «старые» классы создаются (или унаследованы) из нескольких мест. Тогда мне нужно было бы найти все эти места... В чем выигрыш?

12
задан w00 23 May 2012 в 20:12
поделиться