【问题标题】:Should I Use a Method with Parameters or a Function?我应该使用带参数的方法还是函数?
【发布时间】:2009-02-06 19:24:24
【问题描述】:

我遇到了一个哲学编程问题。假设我有一个名为Employees 的类。员工拥有从数据表中设置的业务成员。为了填补这一点,我使用了一个方法,该方法接受一个员工类的实例,循环一个 dataTable,并设置传递给它的实例的成员。例如:

public void GetEmployees(objEmployee)
{
  //the function I am calling returns a dataTable of all the employees in the db.
  dim dt as DataTable = dbEmployees.GetEmployees(); 

   foreach(DataRow drow in dt.rows) 
     {
        objEmployee.Name = drow["Name"].ToString();
        objEmployee.ID = drow["ID"].ToString();
     }
}

然后我会在我的 UI 逻辑中调用这样的代码:

public void GetEmployees()
{
   Employees employee = new Employees();

   employee.GetEmployees(employee);
}

我的问题是,将我的类实例传递给一个方法并像我正在做的那样更改属性是否可以接受,或者通过这样的函数来实现它是否更面向对象:

 public Employees GetEmployees()
  {
     Employees objEmployee = new Employees();

  //the function I am calling returns a dataTable of all the employees in the db.
  dim dt as DataTable = dbEmployees.GetEmployees(); 

   foreach(DataRow drow in dt.rows) 
     {
        objEmployee.Name = drow["Name"].ToString();
        objEmployee.ID = drow["ID"].ToString();
     }

  return objEmployee


}

然后我会这样称呼它:

private void GetEmployees()
{

Employees employee;

employee = employee.GetEmployees();
}

使用函数比使用方法有什么好处吗?谢谢!

【问题讨论】:

    标签: c# methods


    【解决方案1】:

    在我看来,您应该使 GetEmployees() 成为 Employee 的静态方法。您不必实例化员工来获取他们的列表。

    另外,您的第一个示例只是将您的 objEmployee 设置为数据中最后出现的任何内容。当它遍历所有员工时,它会在到达最后一个员工时停止循环,这是您将获得的数据。

    此外,“Employees”类是指一名员工还是多名员工?相应地命名它。如果“Employees”代表一个“Employee”,那么也许您应该将其重命名为“Employee”并从 GetEmployees 方法返回一个 List,正如我上面所说,它应该是静态的,因此您可以简单地调用类似“Employee.获取雇员()”。

    话虽如此,我从不太喜欢为业务对象提供数据访问功能的架构。它倾向于将数据访问层和业务对象层耦合得太紧。

    您可能需要考虑创建一个数据访问接口,该接口接受用于搜索员工的参数并返回实际的员工对象作为结果。一旦你这样做了,你会想要创建这个数据访问层的实现,然后你将使用它来生成实际的实例。这样做的好处是您可以快速更改数据访问层的实现,而无需更改业务对象。然后,您将在接口之外对业务对象进行编程,并且您可能能够使用动态程序集加载或其他一些方法来动态确定数据访问的实现。

    【讨论】:

    • 啊,你说得对。对不起;这不是实际的代码,只是我搞砸的一个例子 :) 你对数据访问层和业务层的解耦有什么建议?
    • 这完全取决于您的应用程序的架构。我通常建议将 DAL 放在它自己的程序集中,与域对象分开,并从 DAL 引用域对象,而不是相反。业务层应该是相对独立的。
    • 如果你这样做了,难道你还没有同样的问题吗?如果必须从数据层引用域对象,它是如何独立的?
    • 我建议创建一个单独的 DAL 来引用 BO,或者两者之间的第三层,一个“业务逻辑”(BL)层,以弥合 DAL 和 BO 之间的差距.虽然 DAL 可能会返回数据表或其他内容,但 BL 会将其转换为您的 BO。
    • 无论如何,业务对象都将独立于 DAL,但没有法律规定 DAL 必须独立于业务对象。
    【解决方案2】:

    两者都是方法(也称为函数)。区别在于第一个“通过引用返回”,而第二个“返回引用”。

    在 C# 中通过引用返回没有任何优势,因为在更简单、自然的情况下,您只返回一个引用,不会进行复制(与 C++ 不同)。

    因此,总是首选返回引用,因为它是最简单的,并且它允许在调用站点具有很大的语法灵活性(例如嵌套表达式:manager.Fire(GetEmployee()),而无需单独的语句)。

    【讨论】:

    • 你是对的。在第一种情况下使用一系列方法更加灵活。
    【解决方案3】:
    public void GetEmployees(objEmployee)
    {
      //the function I am calling returns a dataTable of all the employees in the db.
      dim dt as DataTable = dbEmployees.GetEmployees(); 
    
       foreach(DataRow drow in dt.rows) 
         {
            objEmployee.Name = drow["Name"].ToString();
            objEmployee.ID = drow["ID"].ToString();
         }
    }
    

    在您的第一种方法中,如果没有员工,您会怎么做?您创建了 Employe 对象并传递了填充它的方法,然后您想检查是否有员工。但是当你想检查时,永远不会有空值,因为你发送了创建的对象。我认为第二个更好,更容易理解。

    Employees employee = new Employees();
    
     employee.GetEmployees(employee);
    
     if(employee==null)//but employee is not null??
         DoSomething();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      相关资源
      最近更新 更多