2009-02-06 86 views
0

我有一個哲學編程問題。假設我有一個名爲Employees的類。員工擁有從dataTable中設置的業務成員。爲了填補這一點,我使用了一個方法,該方法需要僱員類的一個實例,通過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(); 
} 

在方法上使用函數有什麼優勢嗎?謝謝!

回答

5

這兩件事都是方法(也稱爲函數)。不同的是,第一個「通過引用返回」,而第二個「返回引用」。

在C#中通過引用返回沒有優勢,因爲在更簡單,自然的情況下,只返回引用,不會執行復制(與C++不同)。

因此,返回引用總是首選,因爲它是最簡單的,並且它允許在調用站點(例如嵌套表達式:manager.Fire(GetEmployee())方面具有很好的語法靈活性,而不需要單獨聲明)。

7

對我來說聽起來像你應該讓GetEmployees()成爲Employee的靜態方法。您不應該實例化員工以獲取他們的列表。

此外,您的第一個示例只是將您的objEmployee設置爲您數據中最後出現的任何內容。當它遍歷所有員工時,它會在到達最後一個時停止循環,這是您將返回的數據。

此外,「員工」類是指一名員工還是多名員工?相應地命名它。如果「員工」代表一個「員工」,那麼也許您應該將其重命名爲「員工」,並從GetEmployees方法返回一個列表,如上所述,該方法應該是靜態的,因此您可以簡單地調用諸如「員工」之類的東西。裝getEmployees()」。這就是說,我永遠不會太喜歡你爲業務對象提供數據訪問功能的架構。它傾向於將數據訪問層和業務對象層耦合得太緊。

您可能需要考慮創建一個Data Access接口,該接口接受用於搜索員工的參數並返回實際的Employee對象作爲結果。一旦你這樣做了,你會想創建一個這個數據訪問層的實現,然後你將使用它來生成實際的實例。這樣做的好處是可以快速更改數據訪問層的實現,而無需更改業務對象。然後,您可以將業務對象編程爲接口,然後您可以使用動態裝配加載或其他方法來動態確定數據訪問的實現。

+0

啊,你是對的。抱歉;這不是實際的代碼,只是我搞砸了一個例子:)你會建議什麼來解耦數據訪問層和業務層? – Austin 2009-02-09 18:07:39

+0

這完全取決於您的應用程序的體系結構。我通常會建議將DAL放入它自己的程序集中,與域對象分開,並從DAL引用域對象,而不是反過來。業務層應該是相對獨立的。 – 2009-02-09 18:16:51

+0

但是,如果你這樣做,你還是有同樣的問題嗎?如果您不得不從數據層引用域對象,它是如何獨立的? – Austin 2009-02-09 19:12:07

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(); 
相關問題