2013-06-27 37 views
3

我想知道什么是最好的做法,或者至少是什么是超负荷的标准。我使用c#3.5,所以我没有可选参数。让说,我有以下方法:有关超负荷的最佳做法是什么

Foo(string param1, string param2) 
{ 
    SqlConnection connection = SM.Program.GetConnection(); 
    SqlCommand command = connection.CreateCommand(); 

    command.CommandText = "UPDATE Table" + 
          "SET Pla = @pla " + 
          "WHERE Foo = @foo"; 

    try 
    { 
     command.Parameters.AddWithValue("@pla", param1); 
     command.Parameters.AddWithValue("@foo", param2); 
     connection.Open(); 
     command.ExecuteNonQuery(); 
    } 
    finally 
    { 
     connection.Dispose(); 
     command.Dispose(); 
    } 
} 

而且,我需要与其他参数的重载,让说,一个的SqlTransaction

Foo(string param1, string param2, SqlTransaction trans) 

第二种方法将基本上是相同的,但它会做的工作在交易

现在我想知道我该怎么办?只有一种方法可以接受空结构作为事务,并且在这种情况下不使用任何或2种方法,但可以复制/粘贴除交易以外的代码?

什么被认为是这种事情的最佳做法?

编辑:我认为一般的想法似乎做重载之间的链接。但是我仍然怀疑在这种情况下不接受空方法的方法是一种坏事?

+0

你想解决什么问题?“最佳实践”非常主观;这一切都取决于你的问题的上下文(提示:我们需要看到的不仅仅是方法签名)。更不用说任何好的答案真的需要看你的代码,所以它可以重构。语境很重要,对这个问题的任何好的回答都需要比你提供的更多的语境。你能帮助我们吗? –

回答

12

通过DRY principle,你不应该复制粘贴代码。

因此,有两种这样的方法,你应该总是有某种链接。关于默认参数

供应默认的参数与一个单一的方法来代替超载

public void Foo(string param1, param2) { 
     Foo(param1, param2, null); 
} 

public void Foo(string param1, string param2, SqlTransaction trans) { 
     //do stuff, handle null value for trans 
} 

更新可被视为不好的做法,在某些情况下,特别是当写库:

//assembly1.dll 
public void Foo(int a, int b, int c = 3) { ... } 

//assembly2.dll 
void Bar() { 
    Foo(1,2); 
} 

什么恰巧是编译器用Foo(1,2,3)替换了呼叫Foo(1,2)

现在,假设我们要将c的默认值更改为4并更新assembly1.dll而不更改assembly2.dll。

我们期望拨打Foo(1,2,4),但实际上,Foo(1,2,3)仍然被调用,因为默认值存储在来电者的位置!

通过使用重载,默认值3存储在它所属的assembly1.dll中。

+0

DRY仅解决实现重载方法的最佳方法。它对于超载是否比默认参数更好或更差说得很少。 (实际上,它略微偏向默认参数。) –

+0

关于默认参数,与传统过载相比,它们有其自己的优点/缺点。国际海事组织,使用默认参数与重载应该基于这些怪癖。 –

+0

@MarceloCantos更新了我的答案,反对使用默认参数。 – Bas

1

我认为超载比传递null更清晰一些参数。我会这样实现:

Foo(string param1, string param2) 
{ 
    Foo("param", "param", null); 
} 

Foo(string param1, string param2, SqlTransaction trans) 
{ 
    //Do stuff... 
} 

这样你就不必复制和粘贴代码。

0

让我们假设你的函数带有x个参数。只需要一个函数,你需要xif else来检查如果特定的参数值为null或不需要做什么。

方法重载是更清洁和可读。

相关问题