【发布时间】:2011-05-06 12:06:05
【问题描述】:
标题可能不太具有描述性,但我想不出更好的标题。对此我很抱歉。
所以,我在这里遇到的问题是我现在遇到过几次的问题。它实际上与设计模式和原则有关,只要您的语言中有 OO 工具,它就与语言无关。我将带您了解当前遇到的问题,因为如果没有实际示例,很难解释问题所在。
所以,我在这里使用一些类来描述逻辑语句。想想这样的事情:
condition = new And(new Equals("x", 5),
new EqualsOrOver("y", 20));
现在这一切都是花花公子,但是当我想使用这个类系统时问题就来了。现在,我正在制作一个需要将条件转换为 SQL WHERE 子句的系统。
我可以通过多种方式做到这一点,但似乎都没有遵循开放/封闭原则。例如,我可以让Database 类解析条件并将其设为 SQL。问题是,通过这种方式,我无法扩展我的Condition 而无需更改我的Database,因此我们没有遵循打开/关闭。
另一种方法——在这里看起来合乎逻辑——是在我的Conditions 中添加一个toSQL() 函数。但是,在这种情况下,我无法将我的数据库换成一个(只是为了命名)使用 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 的违反。
现在,您可以很好地对数据库进行子类化。您也只需要对您的工厂进行子类化,并且还必须为您的Database 创建一组新的Condition 类。你也可以在 Condition 类上发挥你的魔力。您可以创建一个新的Conditions,但您还必须为每个Database 创建配套类。最后,你必须修改你的工厂。
这是迄今为止我们见过的最小的违规行为,但我们仍然违反了 Open/Closed。但事实上,我宁愿完全不违反它。有没有办法在一直坚持打开/关闭的同时做到这一点?
【问题讨论】:
标签: design-patterns factory-pattern open-closed-principle