我在Java和C#中创建了一个允许我执行SQL查询的类,例如我有一个名为Delete的方法,它接受几个参数;
public static int Delete(String table, String column, String operand, Object value)
我将值作为Object类型,因为我可能想要删除基于String,Integers或booleans的行,这意味着该方法足够灵活,可以支持不同的类型。然后,我通过在Java中使用 instanceof 测试(或C#中的.GetType),将其他“'”字符添加到查询中,具体取决于它是否为字符串
原始示例:
if (value instanceof String)
{
System.out.println("It's a String");
}
else
{
System.out.println("It's not a String");
}
当实现类的其余部分时,我开始自己思考前面提到的方法是否是理想的方法,或者是否应该为特定数据类型实现其他方法,一个用于容纳String,另一个用于Integer等等。 / p>
如果我开始实现这一点,那么就意味着会有其他方法在逻辑上具有最小的差异,但是每个方法只有一个目的,使它们易于遵循和记录。另一方面,如果我保持原样,那么生成和维护的代码就会少得多,它可以管理任何类型的Delete语句(就数据类型而言),只需要几个if语句确定通过参数传入的对象类型。
从面向对象/最佳代码实践的角度来看,哪种方法最佳?
感谢您提供的信息!
答案 0 :(得分:5)
都不是。
答案 1 :(得分:2)
撇开这个架构是否是一个好主意的未被问及的问题......
通常,通过尽可能地删除显式类型检查来使面向对象的代码更好。这将意味着到它的问题,其类型作为参数 - 的版本的代码与特定类型的过载被提供可能更好的程度。这仅仅是一种改进,但是,如果该参数的类型在编译时已知的,当然,由于当过载分辨率完成即!
此外,在C#版本中,方法重载将避免装箱值类型。
另一个(在这种情况下)可能相互矛盾的规则是应尽可能删除重复的代码。这意味着执行此操作的最佳方法可能是使用单个方法。在这种情况下,我建议耕出特定类型的代码,以其它的方法(string DelimitValueIfNecessary(object)
),因为这样的事情都不是构建删除语句的方法的核心能力。
我认为第二条规则比第一条规则更重要,所以我会选择一种方法。
现在去与这个architecuture中没有提出的问题:这是有很多原因一个可怕的想法,不限于:SQL注入攻击,对象模型和数据模型的数据类型,innefficiency,漏抽象的紧耦合,等