La descrizione LOD che ho visto (ad esempio, Wikipedia, C2 Wiki) parla di non chiamare metodi. Per citare Wikipedia:La legge di Demeter si applica solo ai metodi?
La Legge di Demetra per le funzioni richiede che un metodo M di un oggetto O può solo richiamare i metodi dei seguenti tipi di oggetti:
- O si
- parametri
di M - eventuali oggetti creati/istanziati all'interno M
- objects componente continua di O
- una variabile globale, accessibile da O, nell'ambito di M
Ma per quanto riguarda l'accesso a proprietà, variabili o enumerazioni? Ad esempio, dato questo:
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";
}
Sono alcune/tutte queste violazioni di LOD? (Ignorare l'accesso variabili diretta, per ora, se è possibile ..)
void Violate(FirstClass first) {
SecondClass second = first.GetRelatedClass();
var x = second.Property;
var y = second._variable;
var z = FirstClass.InnerEnum.Violated;
}
che non farei i primi due (se le violazioni 'ufficiali' o meno), non così sicuro circa l'enum però.
Infatti. Il motivo per cui il Wiki di C2 non parla di variabili di istanza, campi, proprietà, enumerazioni, attributi, slot, ecc. È semplicemente perché una gran parte dei membri di quella comunità sono vecchi Smalltalker in cui comunque tutti sono privati. Campi, attributi, variabili di istanza, slot o qualunque cosa essi siano chiamati sono comunque isomorfi a una coppia di metodi getter/setter, e poiché essi * sono * isomorfi dovrebbe essere ovvio che il passaggio da un campo a un getter non dovrebbe cambiare le proprietà Demeter in alcun modo.Un campo dovrebbe essere semplicemente trattato come un metodo. –