Demeter törvénye egy szoftverfejlesztési irányelv, melyet elsősorban objektumorientált programoknál alkalmaznak. Az irányelvet az Északkeleti Egyetemen, Bostonban fogalmazták meg 1987 őszén. A lényege: „csak a közvetlen barátaiddal beszélgess”. Egy adott objektum más dolgok felépítését vagy tulajdonságait a lehető legkevésbé ismerje.
Az A objektum igénybe veheti a B objektum egy szolgáltatását (meghívja egy metódusát), de A objektum nem érheti el a B objektumon keresztül egy C objektum szolgáltatásait. Ez azt jelentené, hogy az A objektumnak implicit módon a szükségesnél jobban kell ismernie a B objektum belső felépítését. A megoldás B objektum felépítésének módosítása oly módon, hogy az A objektum közvetlenül hívja B objektumot, és a B objektum intézi a szükséges hívásokat a megfelelő alkomponensekhez. Ha a törvényt követjük, kizárólag B objektum ismeri saját belső felépítését.
Kissé formálisabban O objektum M metódusa a következőket hívhatja:
Általánosságban egy objektumnak el kell kerülnie egy meghívott objektum által visszaadott objektum metódusainak hívását, például A.x().y().
Demeter törvényét alkalmazva a szoftver sokkal karbantarthatóbb és adaptálható lesz. Mivel az objektumok kevésbé függnek más objektumok belső felépítésétől, az objektumok felépítése sokkal könnyebben módosítható, akár a hívó szerkezetének módosítása nélkül is.
A törvény alkalmazásának egyik hátránya, hogy szükségessé teszi kis burkoló metódusok használatát, melyek továbbítják a kéréseket a megfelelő komponensekhez. Ez növelheti a belső fejlesztési időt, a tárigényt, és csökkentheti a teljesítményt.
Emellett a burkoló metódusok inverz függőségeket hozhatnak létre. Ha egy kliensnek ellenjavalljuk, hogy egy harmadik féllel kommunikáljon, és ehelyett inkább kliens-specifikus metódusokat építünk be (pl. getAsUsualPleaseForBobby()
), akkor a módosított objektum fokozatosan elveszíti önálló, független jellegét. Így az elv szolgai alkalmazása egyes esetekben csak fordítottá és implicitté teszi azokat a függőségeket, amelyeket meg akart szüntetni.
Nehéz lehet eldönteni azt is, hogy egyáltalán milyen dolgokat tekintsünk az elv hatáskörébe tartozó „szolgáltatásnak”. Adat- és segédobjektumok (például egy matcher) esetében például nem beszélhetünk önálló szolgáltatásról.