C# 如何避免重复代码?
我还是一个编程新手,我注意到我在重复代码:C# 如何避免重复代码?,c#,asp.net,code-reuse,C#,Asp.net,Code Reuse,我还是一个编程新手,我注意到我在重复代码: protected void FillTradeSetups() { DBUtil DB = new DBUtil(); DataTable dtTradeSetups; dtTradeSetups = DB.GetTradeSetups(); ddlSetups.DataValueField = "tradeSetupId"; ddlSetups.DataSource = dtTradeSetups;
protected void FillTradeSetups()
{
DBUtil DB = new DBUtil();
DataTable dtTradeSetups;
dtTradeSetups = DB.GetTradeSetups();
ddlSetups.DataValueField = "tradeSetupId";
ddlSetups.DataSource = dtTradeSetups;
ddlSetups.DataBind();
}
protected void FillTimeFrames()
{
DBUtil DB = new DBUtil();
DataTable dtTimeFrames;
dtTimeFrames = DB.GetTimeFrames();
ddlTimeFrames.DataValueField = "tfCode";
ddlTimeFrames.DataSource = dtTimeFrames;
ddlTimeFrames.DataBind();
}
protected void FillTradeGrades()
{
DBUtil DB = new DBUtil();
DataTable dtTradeGrades;
dtTradeGrades = DB.GetTradeGrades();
ddlTradeGrades.DataValueField = "tradeGrade";
ddlTradeGrades.DataTextField = "descr";
ddlTradeGrades.DataSource = dtTradeGrades;
ddlTradeGrades.DataBind();
}
protected void FillExecutionGrades()
{
DBUtil DB = new DBUtil();
DataTable dtExecutionGrades;
dtExecutionGrades = DB.GetExecutionGrades();
ddlExecutionGrades.DataValueField = "executionGrade";
ddlExecutionGrades.DataTextField = "descr";
ddlExecutionGrades.DataSource = dtExecutionGrades;
ddlExecutionGrades.DataBind();
}
我怎么能更聪明一点呢?你能帮我重新编写代码,这样就不会重复太多了吗
更新
哇,谢谢你的回复,我想我应该把我想实现的东西发布出来。我还为自己创建了另一个小工作人员来删除一些其他丑陋的重复代码。你觉得这个怎么样
void FillDropDownList(DropDownList ddl, DataTable dt, string dataValueField, string dataTextField, string defValue)
{
ddl.DataValueField = dataValueField;
ddl.DataSource = dt;
if (!string.IsNullOrEmpty(dataTextField))
{
ddl.DataTextField = dataTextField;
}
ddl.DataBind();
ddl.SelectedValue = defValue;
}
private string GetTradeItem(DataTable tradeDetails, string attribute)
{
return tradeDetails.Rows[0][attribute].ToString();
}
然后用这样的话来称呼它:
int tradeId = int.Parse(Request.QueryString["tradeId"]);
DBUtil DB = new DBUtil();
DataTable tradeDetails = DB.GetTrade(tradeId);
FillDropDownList(ddlTradeGrades, DB.GetTradeGrades(), "tradeGrade", "descr", GetTradeItem(tradeDetails, "tradeGrade"));
void BindControl(DropDownList ddl, string valueField, string textField, DataTable data) {
ddl.DataValueField = valueField;
ddl.DataTextField = textField ?? valueField; // textField can be null
ddl.DataSource = data;
ddl.DataBind();
}
DBUtil DB = new DBUtil();
BindControl(ddlTradeGrades, "tradeGrade", "descr", DB.GetTradeGrades());
...
当丑陋的东西变成更优雅的东西时,编码感觉很棒 大概是这样吧
void SetupDataSource(DropDownList ddl, DataTable dt, string dataValueFieldm, string dataTextField)
{
if (ddl != null)
{
ddl.DataValueField = dataValueField;
ddl.DataSource = dt;
if (!string.IsNullOrEmpty(dataTextField))
{
ddl.DataTextField = dataTextField;
}
ddl.DataBind();
}
else
{
throw new ArgumentNullException("ddl");
}
}
您可以这样做:
private void BindMyLists()
{
DBUtil DB = new DBUtil();
BindDropDownList(this.ddlExecutionGrades, DB.GetExecutionGrades(), "executionGrade", "descr");
BindDropDownList(this.ddlTradeGrades, DB.GetTradeGrades(), "tradeGrade", "descr");
//etc
}
protected void BindDropDownList(DropDownList dropDownList, DataTable dataTable, string dataValueField, string dataTextField)
{
dropDownList.DataValueField = dataValueField;
dropDownList.DataTextField = dataTextField;
dropDownList.DataSource = dataTable;
dropDownList.DataBind();
}
FWIW,可能类似于:
int tradeId = int.Parse(Request.QueryString["tradeId"]);
DBUtil DB = new DBUtil();
DataTable tradeDetails = DB.GetTrade(tradeId);
FillDropDownList(ddlTradeGrades, DB.GetTradeGrades(), "tradeGrade", "descr", GetTradeItem(tradeDetails, "tradeGrade"));
void BindControl(DropDownList ddl, string valueField, string textField, DataTable data) {
ddl.DataValueField = valueField;
ddl.DataTextField = textField ?? valueField; // textField can be null
ddl.DataSource = data;
ddl.DataBind();
}
DBUtil DB = new DBUtil();
BindControl(ddlTradeGrades, "tradeGrade", "descr", DB.GetTradeGrades());
...
然而,管道本身并没有太大的重复性,应该考虑到未来修改/维护的方便性
快乐编码。创建一种方法,设置您想要的内容:
void SetValues(DropDownList ddl, string datavalue, string text, object ds)
{
ddl.DataValueField = dataValue;
ddl.DataTextField = text;
ddl.DataSource = ds;
ddl.DataBind();
}
然后,您可以使用以下命令调用它:
SetValues(ddlTradeGrades, "tradeGrade", "descr", dtTradeGrades);
比如说:
void FillData(DataTable dataSource, DropDownList ddl, string dataValueField, string dataTextField)
{
ddl.DataSource = dt;
ddl.DataValueField = dataValueField;
ddl.DataTextField = dataTextField;
ddl.DataBind();
}
然后你可以这样称呼它:
FillData(DB.GetTradeSetups(), ddlSetups, "tradeSetupId", string.Empty)
看可能是这样的
protected void FillDdl(DropDownList ddl, string dataValueField, Func<DataTable> dataTableMethod)
{
FillDdl(ddl, dataValueField, null, dataTableMethod);
}
protected void FillDdl(DropDownList ddl, string dataValueField, string dataTextField, Func<DataTable> dataTableMethod)
{
DataTable dt = dataTableMethod();
ddl.DataSource = dt;
ddl.DataValueField = dataValueField;
ddl.DataTextField = dataTextField ?? dataValueField;
ddl.DataBind();
}
或者你仍然可以有一些简单的个人方法
protected void FillTradeSetups()
{
DBUtil DB = new DBUtil();
FillDdl(ddlSetups, "tradeSetupId", DB.GetTradeSetups);
}
protected void FillTimeFrames()
{
DBUtil DB = new DBUtil();
FillDdl(ddlTimeFrames, "tfCode", DB.GetTimeFrames);
}
protected void FillTradeGrades()
{
DBUtil DB = new DBUtil();
FillDdl(ddlTradeGrades, "tradeGrade", "descr", DB.GetTradeGrades);
}
protected void FillExecutionGrades()
{
DBUtil DB = new DBUtil();
FillDdl(ddlExecutionGrades, "executionGrade", "descr", DB.GetExecutionGrades);
}
在你职业生涯的早期问一个好问题。避免“代码片段”和“复制粘贴编程”的能力是需要掌握的一项重要技能。您需要阅读。投票的可能重复项将作为重复项关闭,但伟大的答案应该与原始项合并。这不是关于如何避免重复代码的问题,而不是关于此特定示例的问题吗?我不得不说,我对答案有点失望,因为答案太具体了。
ddlTradeGrades
->dropDownList
中的BindDropDownList
是的。。。我点击提交的方式太快,有大量的错误。反对票:)。已修复,以供将来参考。我很抱歉。@John为了避免NullReferenceException,但我想检查的要求是情境性的,有时最好不要检查。@mellamokb我刚刚添加了DataTextField
@Bala:我的观点是原始代码没有检查,我认为空检查是不好的做法,因为它隐藏了一个编程错误(通过一个隐含的契约,传入的值是“有效的”)。如果(ddl==null)抛出新的ArgumentNullException(“ddl”)代码>@John:A类型。不幸的是,不是框架中定义的类型。更改为Object
以匹配DropDownList
使用的内容。+1但仅供参考,使用委托可能会触发一些与调试和单元测试相关的模糊CLR错误。在本例中,调用的方法非常简单,因此实际上并不需要委托,因此我将在不使用委托的情况下执行此操作。如果它们是具有不同签名的方法,或者如果需要的不仅仅是方法调用,那么委托就是最好的选择。谢谢。因此,在方法中传递字符串methodName,然后使用反射(速度慢,可能过快)或case语句调用DBUtil上的适当方法是否更好?不,最好只使用DataTable
类型的参数,并使用DB.GetTradeSetups()
,DB.GetTradeGrades()
,对,正如@mellam:所说,您不需要委托或使用方法名提供的全部通用性。