定义方法的好方法

时间:2010-09-16 05:56:24

标签: c# methods code-structure

实现方法调用的最佳/最佳方法是什么。

例如:从下面通常被认为是最佳实践。如果两者都不好,那么这被认为是最佳实践。

选项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;
    }

我知道我们可以直接传递参数而无需分配局部变量......我的问题更多的是关于方法定义及其处理方式。

3 个答案:

答案 0 :(得分:6)

如果您自动订阅该事件,我认为使用具有事件处理程序签名的方法并不特别糟糕,该方法只委托给具有您需要的“真实”签名的方法(在这种情况下,没有参数)。

如果您手动订阅,则可以改为使用lambda表达式:

postUpdateButton.Click += (sender, args) => PostUpdate();

然后在PostUpdate中完成工作。然后,您是否将PostUpdate拆分为两个方法,一个用于处理UI交互,另一个用于处理BLL交互由您决定。在这种情况下,我认为这不重要。

如何构建UI逻辑以使其可测试是一个完全不同的问题。我最近成为MVVM模式的粉丝,但我不知道对你的特定场景有多适用(它真的是围绕Silverlight和WPF设计的)。

其他几条评论:

  • 传统上,参数应该是camelCased,而不是PascalCased
  • 您真的相信通过使用l_为局部变量加前缀可以获益吗?他们在当地不是很明显吗?就个人而言,我并不热衷于此处显示的大多数变量名称 - 考虑在含义而不是类型之后命名变量。
  • 使用DataTable返回信息是一种有点容易出错的做事方式。为什么BLL不能返回int?来表示值(或缺少值)?

答案 1 :(得分:1)

如果我没有实现mvc,这就是我喜欢的内容。我在这里假设网络。

我先做选项2,但不是设置按钮代码,而是创建一个属性来设置文本框的值。

我这样做是因为如果其他东西设置了文本框值,那么你将要复制代码。如果更改名称或控件类型,则会很糟糕。

答案 2 :(得分:0)

根据您的示例,选项2是要走的路。选项1了解您的表单以及如何在表单上显示数据,这违反了SRP