2009-02-06 2 views
0

저는 철학적 프로그래밍 문제가 있습니다. Employees라는 클래스가 있다고 가정 해 보겠습니다. 직원들은 dataTable에서 설정 한 비즈니스 구성원이 있습니다. 이를 채우기 위해 employee 클래스의 인스턴스를 가져 와서 dataTable을 통해 반복하고 전달 된 인스턴스의 멤버를 설정하는 메서드를 사용합니다. 예를 들어 : 방법으로 내 클래스 인스턴스를 전달하는 것이 허용,매개 변수 또는 함수가있는 메서드를 사용해야합니까?

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

    employee.GetEmployees(employee); 
} 

내 질문이고 속성을 변경 :

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 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()). 성명서).

+0

네 말이 맞아. 첫 번째 경우에 일련의 메소드를 사용하면보다 유연 해집니다. – Austin

7

GetEmployees()를 Employee의 정적 메서드로 설정해야하는 것처럼 들리 네요. 직원 목록을 얻기 위해 직원을 인스턴스화 할 필요는 없습니다.

또한 첫 번째 예에서는 objEmployee를 데이터의 마지막 부분까지만 설정합니다. 모든 직원을 반복하면서 마지막 단계에 도달하면 루핑을 중단합니다. 반환되는 데이터가 반복됩니다.

또한 "Employees"클래스는 한 명의 직원 또는 많은 직원을 나타 냅니까? 적절하게 이름을 지정하십시오. "Employees"가 "Employee"중 하나를 나타내는 경우 "Employee"로 이름을 바꾸고 GetEmployees 메서드에서 List를 반환해야합니다. 위에서 언급했듯이이 메서드는 정적이어야하므로 "Employee"와 같은 메서드를 호출하면됩니다. GetEmployees() ".

저는 비즈니스 개체에 데이터 액세스 기능을 제공하는 아키텍처가 결코 좋아지지 않는다고 말합니다. 데이터 액세스 계층과 비즈니스 개체 계층을 너무 긴밀하게 연결하는 경향이 있습니다.

직원 검색을위한 매개 변수를 허용하고 실제 Employee 개체를 결과로 반환하는 데이터 액세스 인터페이스를 만드는 것이 좋습니다. 일단 그렇게하면 실제 인스턴스를 생성하는 데 사용할 데이터 액세스 계층의 구현을 만드는 것이 좋습니다. 이점은 비즈니스 개체를 변경하지 않고도 데이터 액세스 계층의 구현을 신속하게 변경할 수 있다는 것입니다. 그런 다음 인터페이스에서 비즈니스 개체를 프로그래밍하고 동적 어셈블리로드 또는 일부 다른 메서드를 사용하여 데이터 액세스 구현을 동적으로 결정할 수 있습니다.

+0

아, 맞아. 죄송합니다; 그것은 실제 코드가 아니며, 나는 단지 엉망이되었습니다. :) 그리고 데이터 액세스 레이어와 비즈니스 레이어를 분리하는 것에 대해 당신은 무엇을 제안하겠습니까? – Austin

+0

완전히 응용 프로그램의 아키텍처에 따라 다릅니다. 일반적으로 DAL을 도메인 객체와 별도로 자체 어셈블리에 배치하고 DAL에서 도메인 객체를 참조하는 것이 좋으며 다른 방법은 사용하지 않는 것이 좋습니다. 비즈니스 계층은 상대적으로 독립적이어야합니다. –

+0

그래도 동일한 문제가 발생하지 않습니까? 데이터 영역에서 도메인 객체를 참조해야하는 경우 어떻게 독립적입니까? – Austin

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(); 
    } 
} 

첫 번째 접근 방식에서는 직원이없는 경우 무엇을 할 것입니까? Employee 객체를 생성하고 그것을 채우기 위해 메서드를 전달한 다음 직원이 있는지 확인하려고합니다. 그러나 당신이 생성 된 객체를 전송했기 때문에 null 값이 존재하지 않을 것인지 확인하고 싶을 때가 있습니다. 두 번째 것이 더 좋고 더 견딜 수 없다고 생각합니다.

Employees employee = new Employees(); 

employee.GetEmployees(employee); 

if(employee==null)//but employee is not null?? 
    DoSomething(); 
+0

감사합니다. 그것은 내가 생각하지 않은 위대한 점입니다. :) – Austin