Я пытаюсь понять принцип Open/Closed (в моем случае для PHP, но это не имеет особого значения).
Я понимаю, что класс никогда открыт для модификации. Только для исправления ошибок. Если бы я хотел добавить новый класс в класс, тогда мне нужно было бы создать новый и расширить "старый" класс. Это единственный способ добавить к нему новый код.
В какой-то мере я вижу преимущества этого. Потому что в основном вы создаете какую-то систему управления версиями, где всегда работает старый код, но вы всегда можете попробовать использовать и новые классы.
Но как это работает на практике? Я имею в виду, предположим, что у меня есть следующий класс:
class MyObject
{
public function doSomething()
{
echo 'Im doing something';
}
}
Итак, где-то я, вероятно, создаю экземпляр этого класса:
$obj = new MyObject();
Но потом я решил, что хорошо иметь другой метод в этом объекте. Поэтому я тоже могу сделать что-то еще. Согласно OCP, я не могу изменить класс. Так что я должен создать новый, который простирается до старого один?
Первая проблема. Как я могу назвать новый класс? Потому что это не совсем новый объект. Подобно. Пользовательский объект является объектом User. Я не могу внезапно дать ему совершенно разное имя только потому, что ему нужен другой метод. Во всяком случае, я создаю новый класс:
class MyNewObject extends MyObject
{
public function doSomethingElse()
{
echo 'Im doing something else now';
}
}
Теперь это также означает, что мне нужно изменить строку кода, где я создал экземпляр класса "MyObject" и заменил его классом "MyNewObject", правильно...? И если это сделано в более чем одном месте, тогда мне нужно выполнить поиск по моему исходному коду... (Подумайте о методе в классе контроллера, который почти всегда использует ключевое слово "новое" для создания экземпляров определенных классов).
То же самое относится и к наследованию. Я должен найти каждый класс, наследующий старый класс, и должен заменить его новым классом.
Итак, в основном мои вопросы:
Как вы называете новые классы, которые имеют новые методы? Просто потому, что я добавил некоторые новые функции, не означает, что я могу дать классу совершенно новое имя...
И что, если "старые" классы создаются (или унаследованы) из нескольких мест. Тогда мне нужно будет найти все эти места... Где выигрыш?