Я пытаюсь применить 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 приходит кто реализация магазина отсутствует я получить ошибку в выполнения за счет исключения в методе магазина в классе модели, он также чувствует себя как код запах.
Это потому, что код вызова будет в виде
IEnumerable<SomeObject> sequence;
Я не знаю конкретных типов объектов последовательности.
Я не могу понять концепцию OCP. У кого-нибудь есть конкретные примеры или ссылки, которые немного больше, чем некоторые примеры Car/Fruit?
Будет намного лучше, если вы сможете показать, что методы Store делают по-другому. – tafa
Неужели было бы так плохо иметь виртуальную функцию 'Store' в' SomeObject'? (http://www.martinfowler.com/bliki/AnemicDomainModel.html) –
Возможно, вы захотите реализовать стратегический паттерн, так как ваш не столь вонючий код нарушает принцип единой ответственности. – Kane