方法设计 - 清晰度或多功能

时间:2011-03-30 17:59:22

标签: c# java sql oop

我在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语句确定通过参数传入的对象类型。

从面向对象/最佳代码实践的角度来看,哪种方法最佳?

感谢您提供的信息!

2 个答案:

答案 0 :(得分:5)

都不是。

您必须使用参数化查询。

但是,你是对的;你应该用一种方法保留它 在C#中,使这些方法通用是有用的。

答案 1 :(得分:2)

撇开这个架构是否是一个好主意的未被问及的问题......

通常,通过尽可能地删除显式类型检查来使面向对象的代码更好。这将意味着到它的问题,其类型作为参数 - 的版本的代码与特定类型的过载被提供可能更好的程度。这仅仅是一种改进,但是,如果该参数的类型在编译时已知的,当然,由于当过载分辨率完成即!

此外,在C#版本中,方法重载将避免装箱值类型。

另一个(在这种情况下)可能相互矛盾的规则是应尽可能删除重复的代码。这意味着执行此操作的最佳方法可能是使用单个方法。在这种情况下,我建议耕出特定类型的代码,以其它的方法(string DelimitValueIfNecessary(object)),因为这样的事情都不是构建删除语句的方法的核心能力。

我认为第二条规则比第一条规则更重要,所以我会选择一种方法。

现在去与这个architecuture中没有提出的问题:这是有很多原因一个可怕的想法,不限于:SQL注入攻击,对象模型和数据模型的数据类型,innefficiency,漏抽象的紧耦合,等