Название может быть не слишком описательным, но я не мог придумать лучшего.Я прошу прощения за это.
Итак, проблема, с которой я здесь сталкиваюсь, - одна, с которой я столкнулся пару раз.На самом деле речь идет о шаблонах и принципах проектирования и не зависит от языка, если у вас есть возможности OO на вашем языке.Я расскажу вам о текущей проблеме, с которой я сталкиваюсь, поскольку без реального примера трудно объяснить, в чем проблема.
Итак, я использую некоторые классы для описания логических операторов.Подумайте о чем-то вроде этого:
condition = new And(new Equals("x", 5),
new EqualsOrOver("y", 20));
Теперь все это прекрасно, но проблема возникает, когда я хочу использовать эту систему классов.Сейчас я создаю систему, в которой условие должно быть переведено в предложение SQL WHERE.
Я мог бы сделать это несколькими способами, но, похоже, ни один из них не придерживается принципа Open / Closed.Например, я мог бы Database
класс разобрать условие и сделать его SQL.Проблема в том, что таким образом я не могу расширить свой Condition
без необходимости менять свой Database
, поэтому мы не следуем за Open / Closed.
Другой способ - который кажется логичнымздесь - это добавить функцию toSQL()
к моим Condition
с.Однако в этом случае я не могу поменять базу данных на ту, в которой (только для имени) используется XML, для которого не требуется условие в формате SQL.
Один из способов решения этой проблемыВ прошлом было использовать фабрику.Заводской метод в этом случае будет выглядеть примерно так:
turnIntoSQLCondtion(Condition c)
{
if (c instanceof Equals)
{
return new SQLEquals(c);
}
else if (c instanceof EqualsOrOver)
{
return new SQLEqualsOrOver(c);
}
else if (c instanceof And)
{
return SQLAnd(c);
}
}
Это не так уж и приятно, но это уменьшит нарушение Open / Closed.
Теперь вы можетеподкласс вашей базы данных просто отлично.Вам просто нужно будет создать подкласс для вашей фабрики, и вам нужно будет создать новую группу Condition
классов, специфичных для вашего Database
.Вы также можете использовать свою магию на классах Условий.Вы можете создавать новые Condition
s, но вам также придется создавать классы-компаньоны для каждого Database
.Наконец, вам придется изменить ваши фабрики.
Это самое маленькое нарушение, которое мы видели до сих пор, но мы все еще нарушаем Open / Closed.Но на самом деле, я бы предпочел не нарушать это вообще.Есть ли способ сделать это, полностью придерживаясь Open / Closed?