문제

누군가 나에게 데미터의 법칙을 설명하는 데 도움을 줄 수 있기를 바랍니다.집계 루트라고 가정하는 클래스가 있고 그 안에 하위 클래스 컬렉션이 있는 경우 집계 루트를 통해 해당 하위 클래스에 액세스하여 해당 하위 클래스의 속성을 업데이트하는 것이 불법입니까?

예를 들어

public class Company
{
    // company has a number of employees
    public List<Employee> Employees {get; set;}
}

public class Employee
{
    // each employee has a lastname
    public int Id {get; set;}
    public string LastName {get; set;}
    // other properties of employee
}

먼저 Company 클래스에 액세스하는 클라이언트가 있다고 가정해 보겠습니다. 이는 다음과 같은 방식으로 데미터 법칙을 위반하는 것입니다.

Employee e = aCompany.Employees.Where(e => e.Id == 1).Single();
e.LastName = "MarriedName";

아니면 항상 회사에 위임해야 합니까?

public class Company
{
    public UpdateEmployeeLastName(int employeeId, string newName)
    {
        Employee e = Employees.Where(e => e.Id == employeeId).Single();
        e.LastName = newName;
    }
}

클라이언트에서

aCompany.UpdateEmployeeLastName(1, "Marriedname");

두 번째는 더 좋아 보이지만 클라이언트가 업데이트하려는 직원의 ID를 알아야 하는 데 문제가 있습니까?

여러 개의 중첩된 집계가 있는 경우 복잡해지기 시작할 수 있는 것 같습니다.

감사해요

도움이 되었습니까?

해결책

두 번째 옵션은 디미터 법칙이 목표로 하는 것입니다.

디미터의 법칙은 기본적으로 "당신이 알고 있는 것만 이야기하라"고 명시하고 있기 때문입니다.첫 번째 시나리오에서 "클라이언트"가 무엇이든 실제로 직원에 대해 전혀 알지 못합니다.그것은 a에 대해 알고 있습니다 Company..하지만 복잡한 내용에 대해서는 그렇지 않습니다. Company 내부.

에 위임하다 Company 클라이언트에서 이 기능의 특정 인스턴스를 각각 변경할 필요 없이 직원 업데이트 방법을 변경할 수 있는 유연성을 제공합니다.어느 날 당신이 그것만 결정한다면 Active 직원의 이름을 변경할 수 있는 경우 옵션 1의 모든 인스턴스를 다음과 같이 업데이트해야 합니다.

Employee e = aCompany.Employees.Where(e => e.Id == 1 && e.IsActive).Single();
//                                                        ^^^^ active flag
e.LastName = "MarriedName";

그것을 마무리 Company (데메테르의 법칙을 따르려는 시도 여부에 관계없이) 미래에 이것을 처리하기가 훨씬 더 쉬워집니다.

두 번째는 더 좋아 보이지만 클라이언트가 업데이트하려는 직원의 ID를 알아야 하는 데 문제가 있습니까?

두 예제 모두 직원의 ID를 알고 있습니다.그래서 이것이 무슨 뜻인지 잘 모르겠습니다.집계를 통해 정보를 전달할 때 코드를 사용하여 ID를 인식하는 것은 매우 일반적입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top