2011-03-30 46 views
2

我已经在Java和C#中做了一个类,允许我执行SQL查询,例如我有一个名为Delete的方法,它接受几个参数;方法设计 - 清晰或多功能

public static int Delete(String table, String column, String operand, Object value) 

我有作为对象类型作为我可能想要删除基于字符串,整数或布尔值的行,这意味着该方法是足够的灵活性来支持不同的类型。

:然后我取决于它是否是通过使用(在C#或.GetType)的 的instanceof测试用Java

粗例子的字符串或不追加额外的“”字符到查询

if (value instanceof String) { System.out.println("It's a String"); } else { System.out.println("It's not a String"); } 

在实现类的其他部分时,我开始思考前面提到的方法是一种理想的方法,还是我应该为特定的数据类型实现其他方法,一个容纳String,另一个容纳Integer等。

如果我着手实现这个,那么这意味着会有其他逻辑上有最小差异的方法,但是每种方法只有一个目的,使得它们易于遵循和记录。另一方面,如果我保持它的方式,那么生成和维护的代码就会少得多,它可以管理任何类型的Delete语句(就数据类型而言),并且只需要几条语句以确定通过参数传入的对象的类型。

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

感谢您的信息!

+0

不要在'.GetType'上使用比较,使用'is'运算符。 'is'编译成IL指令,而'GetType'是一个非常昂贵的调用。 – Femaref 2011-03-30 18:02:17

+0

另外,它们不是等价的; 'is'允许派生类型。 – SLaks 2011-03-30 18:04:13

回答

5

都没有。

您必须使用参数化查询。

虽然,你是对的;你应该保持在一个单一的方法。
在C#中,使这种方法通用有时很有用。

+1

是是千次是的 - 避免使用参数化查询进行SQL注入! – n8wrl 2011-03-30 18:09:36

+0

感谢您的建议,看一些文档似乎提到它也提供了更好的性能。 – 2011-03-30 18:12:41

+0

使用参数化查询有没有好的资源?我最初用Java和C#(System.Data.SQLite)搜索参数化查询时,几乎没有返回任何对新手有用的东西。 – 2011-03-30 18:32:12

2

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

一般来说,面向对象的代码是通过去掉,尽可能的,明确的类型检查好。这意味着 - 在某种程度上它作为一个参数提供的重要性 - 具有特定类型重载的代码版本可能会更好。然而,如果参数的类型在编译时已知,那么这只是一种改进,当然,因为那是重载解析完成的时候!

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

另一个(在这种情况下)可能是矛盾的规则是重复代码应该尽可能地去除。这意味着做到这一点的最佳方法可能是采用单一方法。在这种情况下,我建议将类型特定的代码用于其他方法(string DelimitValueIfNecessary(object)),因为这些事情不是构造删除语句的方法的核心能力。

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

现在来谈谈关于这种架构的未知问题:由于多种原因,这是一个可怕的想法,不仅限于:SQL注入攻击,对象模型和数据模型数据类型的紧耦合,效率低下,泄漏抽象等等。