Opis LOD, który widziałem (na przykład Wikipedia, C2 Wiki) mówi o braku wywoływania metod. Cytując Wikipedię:Czy Prawo Demeter stosuje się tylko do metod?
Prawo Demeter dla funkcji wymaga Metoda A M obiektu O może powołać jedynie metody z następujących rodzajów obiektów:
- O sama
- parametry M
- stworzył wszelkie obiekty/instancja ciągu M
- bezpośredni komponent o za obiekty
- zmienną globalną, dostępną przez o, w zakresie M
Ale co z dostępem do właściwości, zmiennych lub wyliczeń? Na przykład, biorąc pod uwagę to:
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";
}
Czy którekolwiek/wszystkie z tych naruszeń LOD? (Zignoruj bezpośredni dostęp do zmiennych teraz, jeśli można ..)
void Violate(FirstClass first) {
SecondClass second = first.GetRelatedClass();
var x = second.Property;
var y = second._variable;
var z = FirstClass.InnerEnum.Violated;
}
nie zrobiłbym dwa pierwsze (czy to „oficjalna” naruszeń lub nie), nie tak pewny o wyliczenia chociaż.
Rzeczywiście. Powodem, dla którego Wiki C2 nie mówi o zmiennych instancji, polach, właściwościach, enumach, atrybutach, slotach itp. Jest po prostu dlatego, że duża część członków tej społeczności to stare Smalltalkery, w których wszystkie są i tak prywatne. Pola, atrybuty, zmienne instancji, sloty lub jakkolwiek się one nazywają, są izomorficzne do pary metod getter/setter, a ponieważ są * izomorficzne, powinno być oczywiste, że przełączanie się między polem a geterem nie powinno się zmieniać właściwości Demeter w jakikolwiek sposób.Pole powinno być po prostu traktowane jako metoda. –