Ještě plynulá rozhraní porušovat zákon Demeter?

hlasů
52

Wikipedia článek o právu Demeter říká:

Zákon lze konstatovat, jednoduše jako „používat pouze jeden bod“.

Nicméně jednoduchý příklad z plynulé rozhraní může vypadat například takto:

static void Main(string[] args)
{
   new ZRLabs.Yael.Pipeline(cat.jpg)
        .Rotate(90)
        .Watermark(Monkey)
        .RoundCorners(100, Color.Bisque)
        .Save(test.png);
}

Stejně tak to jde dohromady?

Položena 15/09/2008 v 21:16
uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
8

Ano, i když budete muset použít nějaký pragmatismus situaci. Vždycky jsem si vzít zákon Demeter jako vodítko v protikladu k pravidlu.

Jistě, můžete také chtít, aby se zabránilo následující:

CurrentCustomer.Orders[0].Manufacturer.Address.Email(text);

snad nahradit:

CurrentCustomer.Orders[0].EmailManufacturer(text);

Jak více z nás používá ORM který obecně představuje celou doménu jako objekt grafu může být myšlenka vymezit přijatelný „prostor“ pro určitý objekt. Možná bychom se měli vzít zákon deméter o tom, že byste neměli mapovat celý graf jako dosažitelný.

Odpovězeno 15/09/2008 v 21:23
zdroj uživatelem

hlasů
71

No, krátká definice zákona zkracuje příliš mnoho. Skutečnou „zákon“ (ve skutečnosti doporučení na dobrý design API) v podstatě říká: Pouze objekty přístupové jste vytvořili sami, nebo byly předány na vás jako argument. Nemají přístup k objektům nepřímo prostřednictvím jiných objektů. Metody plynulé rozhraní často vracejí samotný objekt, takže neporušují zákon, pokud se znovu použít objekt. Jiné metody vytváření objektů pro vás, takže není porušení jeden.

Také si všimněte, že „zákon“ je jen nejlepší praxe doporučení pro „klasické“ API. Plynulá rozhraní jsou zcela odlišný přístup k designu API a nemohou být hodnoceny s právem Demeter.

Odpovězeno 15/09/2008 v 21:26
zdroj uživatelem

hlasů
23

Ne nutně. „Používejte pouze jednu tečku“ je nepřesné shrnutí zákona Demeter.

Zákon Demeter odrazuje od používání více teček, kdy každý bod představuje výsledek jiného objektu, např:

  • První bod je metoda volána z ObjectA, vrací objekt typu ObjectB
  • Vedle tečka je metoda k dispozici pouze v ObjectB, vrací objekt typu ObjectC
  • Vedle bodů je vlastnost k dispozici pouze v ObjectC
  • ad infinitum

Nicméně, alespoň podle mého názoru, zákon Demeter není porušena, pokud je návrat předmětem každého bodu je stále stejný typ jako původní volajícího:

var List<SomeObj> list = new List<SomeObj>();
//initialize data here
return list.FindAll( i => i == someValue ).Sort( i1, i2 => i2 > i1).ToArray();

Ve výše uvedeném příkladu, a to jak findall () a Druh () vrátí stejný typ objektu, jako původní seznamu. Zákon Demeter není porušena: seznam hovořil pouze svým bezprostředním přáteli.

Jak již bylo řečeno ne všichni plynně rozhraní porušují zákon Demeter, tak dlouho, jak oni se vrátí stejný typ jako jejich volajícího.

Odpovězeno 15/09/2008 v 21:28
zdroj uživatelem

hlasů
6

The spirit of Demeter zákona je, že vzhledem k tomu, odkaz na objekt nebo třída, měli byste se vyhnout přístupu k vlastnosti třídy, která je více než jednu sub-vlastnost nebo metoda daleko od té doby, která bude pevně pár dvou tříd, které by mohly mít nezamýšlené a může způsobit problémy udržovatelnost.

Plynule rozhraní jsou přijatelnou výjimku ze zákona, protože jsou to znamená , že je alespoň o něco pevně spojeny jako všechny vlastnosti a metody jsou podmínky mini-jazyk, které se skládají dohromady, aby vytvořily funkční věty.

Odpovězeno 15/09/2008 v 21:31
zdroj uživatelem

hlasů
1

Není problém se svým příkladem. Po tom všem, že jste rotující, vodoznaky, atd ... vždy stejný obraz. Věřím, že mluvíte k potrubí objekt po celou dobu, takže pokud váš kód závisí jen na třídě Pipeline, nejste porušuje Lod.

Odpovězeno 20/03/2010 v 08:57
zdroj uživatelem

hlasů
6

1) Není to v rozporu vůbec.

Kód je ekvivalentní

var a = new ZRLabs.Yael.Pipeline("cat.jpg");
a = a.Rotate(90);
a = a.Watermark("Monkey");
a = a.RoundCorners(100, Color.Bisque);
a = a.Save("test.png");

2) tak dobrý Ol‘Phil Haack říká: Zákon Demeter není Dot Počítání Cvičení

Odpovězeno 24/11/2010 v 15:52
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more