我有一个哲学编程问题。假设我有一个名为Employees的类。员工拥有从dataTable设置的业务成员。为了填补这一点,我使用一个方法来获取employee类的实例,遍历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();
}
使用函数而不是方法有什么优势吗?谢谢!
答案 0 :(得分:7)
听起来像你应该让GetEmployees()成为Employee的静态方法。您不应该实例化员工以获取他们的列表。
此外,您的第一个示例只是将您的objEmployee设置为数据中最后出现的内容。当它遍历所有员工时,它会在到达最后一个时停止循环,这是您将返回的数据。
此外,“员工”类是指一名员工还是多名员工?相应地命名。如果“Employees”代表一个“Employee”,那么你应该将它重命名为“Employee”并从GetEmployees方法返回一个List,正如我上面所说的那样,它应该是静态的,所以你可以简单地调用类似“Employee”的东西。装getEmployees()”。
话虽这么说,我从不太喜欢为业务对象提供数据访问功能的架构。它往往过于紧密地耦合数据访问层和业务对象层。
您可能需要考虑创建一个数据访问接口,该接口接受用于搜索员工的参数,并返回实际的Employee对象作为结果。完成后,您可能希望创建此数据访问层的实现,然后使用该实现来生成实际实例。这样做的好处是,您可以快速更改数据访问层的实现,而无需更改业务对象。您可以将业务对象编程为接口,然后您可以使用动态程序集加载或其他方法来动态确定数据访问的实现。
答案 1 :(得分:5)
两者都是方法(也称为函数)。区别在于第一个“按引用返回”,而第二个“返回引用”。
在C#中通过引用返回没有任何优势,因为在更简单,自然的情况下,您只返回一个引用,不进行复制(与C ++不同)。
因此,返回引用始终是首选,因为它是最简单的,并且它允许在调用站点具有很好的语法灵活性(例如嵌套表达式:manager.Fire(GetEmployee())而无需单独的语句)。
答案 2 :(得分:0)
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();