2013-11-28 89 views
-1

在这个问题中,我将询问基本的实践。今天我面临的情况是,我需要用这段代码更新数据库表值。更好的清洁功能代码或大块代码

public void updateUsrProfileName(string usrId, string name) 
    { 
     query = "update [db_user].[dbo].[usr_profiles] set [Name][email protected] where [usrid][email protected] "; 
     try 
     { 
      com = new SqlCommand(query,con); 
      com.Parameters.AddWithValue("@name",name); 
      com.Parameters.AddWithValue("@usrid",usrId); 
      con.Open(); 
      com.ExecuteNonQuery(); 
      con.Close(); 
     } 
     catch (Exception e) 
     { 
      con.Close(); 
      throw e; 
     } 
    } 

我需要重复上面的表中的每一列函数,所以我想出了一个共同的功能,以减少代码

public void Commonfunction(SqlCommand com, string var) 
    { 
     try 
     { 
      com.Parameters.AddWithValue("@usrid", var); 
      con.Open(); 
      com.ExecuteNonQuery(); 
      con.Close(); 
     } 
     catch (Exception e) 
     { 
      con.Close(); 
      throw e; 
     } 
    } 

,并调用上面的函数类似这样的

 public void updateUsrProfileName(string usrId, string name) 
    { 
     query = "update [db_user].[dbo].[usr_profiles] set [Name][email protected] where [usrid][email protected] "; 
     try 
     { 
      com = new SqlCommand(query,con); 
      com.Parameters.AddWithValue("@name",name); 
      Commonfunction(SqlCommand com, string name); 
     } 
      catch (Exception e) 
      { 
       con.Close(); 
       throw e; 
      } 
     } 

优点: - 干净的代码没有冗余。 更少的代码长度,其在差

缺点非常少: - 由于没有函数调用提高性能下降,因为它需要匹配参数,映射函数调用等

在这种情况下非常较小的代码是多余的移动是否具有共同的功能,以及在哪些条件下我们应该考虑功能划分还是不划算。

+1

更新整个记录。只写一个'updateUserProfile(UserProfile配置文件)'函数。 – sbenitezb

+0

我认为这会浪费资源,好像只需要更新名称为什么我应该向上移动整行就会影响性能 –

+0

您每秒更新一次用户配置文件多少次?不是一次,我猜想。 – sbenitezb

回答

0

总是“移动它”(共享方法而不是重复代码)。直到概要分析显示您在该区域遇到问题为止。

+0

性能问题比.. –

+0

什么性能问题?你是否认为它存在一些性能问题?你的数据有多大?多少次更新?我会开始让代码尽可能简单,衡量性能,然后调整是否真的有必要。否则,你会无缘无故地重复代码。 – sbenitezb

+1

重复您的代码,而不是第一次正确写入它几乎从来没有解决性能问题... – John3136

0

将一些通用逻辑放在单独的方法中是一个好主意。我已通过删除过多的try/catch块来简化代码,并添加了finally子句。

public void Commonfunction(SqlCommand com, string var) 
{ 
    try 
    { 
     com.Parameters.AddWithValue("@usrid", var); 
     con.Open(); 
     com.ExecuteNonQuery(); 
    } 
    finally 
    { 
     if (con != null) 
     { 
      con.Dispose(); 
     } 
    } 
} 

public void updateUsrProfileName(string usrId, string name) 
{ 
    query = "update [db_user].[dbo].[usr_profiles] set [Name][email protected] where [usrid][email protected] "; 

    com = new SqlCommand(query, con); 
    com.Parameters.AddWithValue("@name", name); 
    Commonfunction(com, name); 
} 
+0

kirill我怀疑如果我从updateUsrProfileName(字符串usrId,字符串名称)删除尝试捕获将它抛出异常业务逻辑调用方。 –

+1

如果你不抓住它们,异常会传播调用堆栈。 – sbenitezb

+0

@HotCoolStud,在你的源代码中,你在'catch'块中重新抛出异常...... –