Я пытаюсь уловить принцип 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», правильно..? И если это делается более чем в одном месте, то мне нужно искать в моем исходном коде... (Подумайте о методе в классе контроллера, который почти всегда использует ключевое слово «новое» для создания экземпляров определенных классов).
То же самое в основном относится к наследованию. Мне нужно найти каждый класс, который наследует старый класс, и заменить его новым классом.
Итак, в основном мои вопросы таковы:
Как вы называете новые классы, у которых есть новые методы? То, что я добавил некоторые новые функции, не означает, что я могу дать классу совершенно новое имя...
А что, если «старые» классы создаются (или унаследованы) из нескольких мест. Тогда мне нужно было бы найти все эти места... В чем выигрыш?