Я пытаюсь применить OCP к фрагменту кода. У меня есть то, что в его текущем состоянии действительно вонючий, но я чувствую, что не до конца до конца.
Текущий код:
public abstract class SomeObject
{}
public class SpecificObject1 : SomeObject
{}
public class SpecificObject2 : SomeObject
{}
// Smelly code
public class Model
{
public void Store(SomeObject someObject)
{
if (someObject is SpecificObject1)
{}
else if (someObject is SpecificObject2)
{}
}
}
Это действительно ужасно, мой новый подход выглядит так:
// No so smelly code
public class Model
{
public void Store(SomeObject someObject)
{
throw new Expception("Not allowed!");
}
public void Store(SpecificObject1 someObject)
{}
public void Store(SpecificObject2 someObject)
{}
}
Когда появляется новый тип SomeObject, я должен реализовать, как этот конкретный объект
хранится, это нарушит OCP, потому что мне нужно изменить класс модели.
Чтобы переместить логику хранилища в SomeObject, он также чувствует себя неправильно, тогда я нарушу SRP (?), Потому что в этом случае SomeObject почти как DTO, его ответственность - это не то, как знать, как хранить себя.
Если появляется новая реализация SomeObject, чья реализация магазина отсутствует
Я получу ошибку runtime из-за исключительной ситуации в методе Store в классе Model, он также напоминает запах кода.
Это потому, что вызывающий код будет иметь вид
IEnumerable<SomeObject> sequence;
Я не буду знать конкретные типы объектов последовательности.
Не могу понять концепцию OCP. У кого-нибудь есть конкретные примеры или ссылки, которые немного больше, чем просто пример Car / Fruit?