Закон Деметры применим только к методам? - PullRequest
5 голосов
/ 21 октября 2010

В описании LOD, которое я видел (например, Wikipedia , C2 Wiki ), говорится о том, что не нужно вызывать методы. Цитировать Википедию:

Закон Деметры для функций требует, чтобы метод M объекта O мог вызывать только методы следующих типов объектов:
- О себе
- параметры М
- любые объекты, созданные / созданные в M
- Объекты прямого компонента O
- глобальная переменная, доступная O, в объеме M

Но как насчет доступа к свойствам, переменным или перечислениям? Например, учитывая это:

class FirstClass {
    public SecondClass GetRelatedClass() {
        return new SecondClass();
    }

    public enum InnerEnum {
        Violated,
        NotViolated
    }
}

class SecondClass {
    public int Property {get; set;}
    public string _variable = "Danny Demeter";
}

Есть ли какие-либо / все эти нарушения LOD? (Пока не обращайте внимания на прямой доступ к переменной, если вы можете ..)

void Violate(FirstClass first) {
    SecondClass second = first.GetRelatedClass();
    var x = second.Property;
    var y = second._variable;
    var z = FirstClass.InnerEnum.Violated;
}

Я бы не стал делать первые два (будь то «официальные» нарушения или нет), хотя не совсем уверен насчет перечисления.

Ответы [ 2 ]

6 голосов
/ 21 октября 2010

Я не могу ответить на вопрос перечисления - мне кажется, я напоминаю, что стандартная рекомендация не состоит в том, чтобы определять перечисления внутри класса.

Для свойств вы действительно можете рассматривать свойства как ярлыки дляметоды (getProperty() и setProperty(value)).В этом случае ваш ответ заключается в том, что доступ к свойствам является нарушением.

Для полей (переменных), опять же, обычной практикой является не предоставление их, а использование свойств, в действительности предоставление полей является нарушением инкапсуляции.

В конечном счете, цель закона Деметры состоит в том, чтобы ограничить знание реализации между классами.Для меня это означает, что все ваши примеры являются нарушениями.

1 голос
/ 21 октября 2010

FWIW ...

Нарушение # 1 (x) выглядит как грубый шаблон расположения службы, поэтому я подозреваю, что пример не является нарушением.

Нарушение # 2 (y) похоже на запах классного дизайна, но в целом ничего не демонстрирует выше того, что демонстрирует нарушение # 1.

Я не думаю, что публичные перечисления (z), какими бы они ни были ограничены, будут учитываться здесь в LOD.

У вас есть лучший пример из реальной жизни, чтобы продемонстрировать свои опасения? Без надлежащего контекста простые примеры кода могут быть нормальными, или они могут нарушать принципы проектирования.

...