Recientemente me di cuenta del Law of Demeter.¿Estoy rompiendo la "Ley de Demeter"?
Como muchas cosas, me di cuenta de que era algo que ya estaba haciendo pero que no tenía nombre. Sin embargo, hay algunos lugares en los que parezco violarlo.
Por ejemplo ...
que podría tener un objeto Dirección:
public class Address : IAddress
{
public string StreetAddress { get; set; }
public string City { get; set; }
public int Zip { get; set; }
}
y un objeto Cliente:
public class Customer : ICustomer
{
private IAddress address;
Customer()
{
Address = null;
}
public string Name { get; set; }
public IAddress
{
get
{
if (address == null)
{
address = new Address();
}
return address;
}
set
{
address = value;
}
}
}
Ok, esto es falso código por lo que probablemente no lo hace Tengo que saltar sobre mí para usar IoC para eliminar el new Address()
o cualquier cosa, pero es más o menos un ejemplo de lo que estoy haciendo. No incluí las interfaces, ya que espero que sean obvias.
Me luego usarlo en mi código para cosas como int zip = customer.Address.Zip;
y customer.Address.City = "Vancouver";
Como yo lo entiendo, estoy violando la Ley de Demeter mediante la manipulación de datos de Dirección del Cliente.
Por otra parte, parece que el marco también lo es. Después de todo, no abordaría.City.Length ser una violación? ¿Debo agregar métodos a la dirección para manejar el acceso a las propiedades de la cadena? Probablemente no. Entonces, ¿por qué desordenar la dirección?
Realmente no puedo agregar métodos a la dirección que se relacionen solo con el cliente. Tengo objetos de Miembro, Empleado, Dependiente, Vendedor, Empleador, etc. que también tienen direcciones.
¿Hay una mejor manera de manejar esto? ¿A qué tipo de problemas me arriesgo si utilizo Address tal como soy ahora?
Para la gente de Java, la clase de dirección podría ser algo más parecido a la siguiente si ayuda:
public class Address extends AddressInterface
{
private String m_city;
public String getCity() { return m_city; }
public void setCity(String city) { m_city = city; }
}
he de reconocer que customer.getAddress().setCity("Vancouver");
anillos más alarmas que customer.Address.City = "Vancouver";
hicieron por mí. Tal vez debería cambiar a Java por un tiempo.
¿Qué pasa con C++ folks minority? ;. ( –
Lo sentimos Kornel que significaba ninguna falta de respeto El puesto estaba poniendo muy larga Hay un millón de lenguas que podría haber utilizadas como ejemplos los tipos de Java parece que aman a sus patrones y aunque pensé que valía la pena añadir un fragmento de si... ayudaría. ¿Alguna idea de mi pregunta? – Justin
Ver http://haacked.com/archive/2009/07/14/law-of-demeter-dot-counting.aspx –