实现方法调用的最佳/最佳方法是什么。
例如:从下面通常被认为是最佳实践。如果两者都不好,那么这被认为是最佳实践。
选项1:
private void BtnPostUpdate_Click(object sender, EventArgs e)
{
getValue();
}
private void getValue()
{
String FileName = TbxFileName.Text;
int PageNo = Convert.ToInt32(TbxPageNo.Text);
// get value from Business Layer
DataTable l_dtbl = m_BLL.getValue(FileName, PageNo);
if (l_dtbl.Rows.Count == 1)
{
TbxValue.Text = Convert.ToInt32(l_dtbl.Rows[0]["Value"]);
}
else
{
TbxValue.Text = 0;
}
}
选项2:
private void BtnPostUpdate_Click(object sender, EventArgs e)
{
String FileName = TbxFileName.Text;
int PageNo = Convert.ToInt32(TbxPageNo.Text);
int Value = getValue(FileName, PageNo);
TbxValue.Text = Value.ToString();
}
private int getValue(string FileName, int PageNo)
{
// get value from Business Layer
DataTable l_dtbl = m_BLL.getValue(FileName, PageNo);
if (l_dtbl.Rows.Count == 1)
{
return Convert.ToInt32(l_dtbl.Rows[0]["Value"]);
}
return 0;
}
我知道我们可以直接传递参数而无需分配局部变量......我的问题更多的是关于方法定义及其处理方式。
答案 0 :(得分:6)
如果您自动订阅该事件,我认为使用具有事件处理程序签名的方法并不特别糟糕,该方法只委托给具有您需要的“真实”签名的方法(在这种情况下,没有参数)。
如果您手动订阅,则可以改为使用lambda表达式:
postUpdateButton.Click += (sender, args) => PostUpdate();
然后在PostUpdate
中完成工作。然后,您是否将PostUpdate
拆分为两个方法,一个用于处理UI交互,另一个用于处理BLL交互由您决定。在这种情况下,我认为这不重要。
如何构建UI逻辑以使其可测试是一个完全不同的问题。我最近成为MVVM模式的粉丝,但我不知道对你的特定场景有多适用(它真的是围绕Silverlight和WPF设计的)。
其他几条评论:
l_
为局部变量加前缀可以获益吗?他们在当地不是很明显吗?就个人而言,我并不热衷于此处显示的大多数变量名称 - 考虑在含义而不是类型之后命名变量。DataTable
返回信息是一种有点容易出错的做事方式。为什么BLL不能返回int?
来表示值(或缺少值)?答案 1 :(得分:1)
如果我没有实现mvc,这就是我喜欢的内容。我在这里假设网络。
我先做选项2,但不是设置按钮代码,而是创建一个属性来设置文本框的值。
我这样做是因为如果其他东西设置了文本框值,那么你将要复制代码。如果更改名称或控件类型,则会很糟糕。
答案 2 :(得分:0)
根据您的示例,选项2是要走的路。选项1了解您的表单以及如何在表单上显示数据,这违反了SRP。