Frage

Ich hoffe, dass mir jemand helfen kann, das Gesetz der Demeter zu erklären.Wenn ich eine Klasse habe, von der ich annehme, dass sie ein Aggregatstamm ist, und in der sich eine Sammlung von untergeordneten Klassen befindet, ist es dann illegal, die Eigenschaften dieser untergeordneten Klassen zu aktualisieren, indem ich über den Aggregatstamm auf sie zugreife?

z.B.

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
}

Nehmen wir an, ich habe einen Kunden, der auf die Company-Klasse zugreift. Würde es erstens mit so etwas gegen das Demeter-Gesetz verstoßen?

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

Oder sollte dies immer an das Unternehmen delegiert werden?

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

im Client

aCompany.UpdateEmployeeLastName(1, "Marriedname");

Die zweite Variante scheint besser zu sein, aber ist etwas falsch daran, dass der Client die ID des Mitarbeiters kennen muss, den er aktualisieren möchte?

Es scheint, als könnte es kompliziert werden, wenn Sie mehrere verschachtelte Aggregate haben.

Danke

War es hilfreich?

Lösung

Ihre zweite Option ist das, worauf das Gesetz von Demeter abzielt.

Da es im Demeter-Gesetz grundsätzlich heißt: „Sprechen Sie nur mit dem, worüber Sie Bescheid wissen.“Was auch immer der „Kunde“ im ersten Szenario ist, weiß eigentlich überhaupt nichts über die Mitarbeiter.Es weiß von a Company..aber nicht über die Feinheiten der Company Interna.

Delegieren an die Company gibt Ihnen die Flexibilität, die Art und Weise zu ändern, wie ein Mitarbeiter aktualisiert wird, ohne jede einzelne Instanz dieser Funktionalität vom Client aus ändern zu müssen.Wenn du das eines Tages nur beschließt Active Wenn die Namen von Mitarbeitern geändert werden können, müssten Sie jede Instanz von Option eins wie folgt aktualisieren:

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

Pack es ein Company macht es in Zukunft viel einfacher, damit umzugehen (unabhängig davon, ob man versucht, dem Gesetz von Demeter zu folgen oder nicht).

Die zweite Variante scheint besser zu sein, aber ist etwas falsch daran, dass der Client die ID des Mitarbeiters kennen muss, den er aktualisieren möchte?

Ihre beiden Beispiele kennen die ID des Mitarbeiters.Ich bin mir also nicht sicher, was du damit meinst.Es kommt sehr häufig vor, dass konsumierender Code die ID kennt, wenn er Informationen über ein Aggregat weiterleitet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top