Demistifikacija načela zakona Demetre

Zakon Demetre (ili Princip najmanjeg znanja) je smjernica za dizajn za razvoj softverskih aplikacija. Prvo načelo o kojem se raspravljalo na Sveučilištu Northeastern 1987. godine, ovo načelo kaže da objekt nikada ne bi trebao znati unutarnje detalje drugih predmeta. Dizajniran je za promicanje labavog spajanja u dizajnu softvera.

Imajte na umu da se povezivanje može definirati kao stupanj međusobne ovisnosti koji postoji između softverskih modula i koliko su usko povezani takvi moduli. Što je više sprega između komponenata u aplikaciji, to je teže mijenjati je i održavati s vremenom. Uvijek je dobra praksa dizajnirati sustave koje je lakše testirati i održavati osiguravajući da su komponente u aplikaciji labavo povezane. Više o koheziji i spajanju možete saznati iz mog članka ovdje.

Razumijevanje načela zakona Demetre

Načelo zakona Demetre kaže da modul ne bi trebao imati znanje o unutarnjim detaljima predmeta kojima manipulira. Drugim riječima, softverska komponenta ili objekt ne bi trebali znati o unutarnjem radu drugih objekata ili komponenata. Razumijemo Demetrov zakon na primjeru.

Razmotrimo tri klase, naime - A, B i C - i objekte tih klasa - objA, objB i objC. Sada pretpostavimo da je objA ovisan o objB, koji zauzvrat čini objC. U ovom scenariju, objA se može pozivati ​​na metode i svojstva objB, ali ne i na objC.

Načelo zakona Demetra koristi enkapsulaciju kako bi se postigla ova izolacija i smanjilo spajanje komponenata vaše aplikacije. To pomaže u poboljšanju kvalitete koda i promiče fleksibilnost i lakše održavanje koda. Prednost pridržavanja Demetrinog zakona je u tome što možete izraditi softver koji je lako održiv i prilagodljiv budućim promjenama.

Razmotrimo klasu C koja ima metodu M. Pretpostavimo sada da ste stvorili instancu klase C koja se zove O. Demetrov zakon navodi da metoda M može pozivati ​​sljedeće tipove .ili bi svojstvo klase trebalo pozvati sljedeći tip samo članova:

  • Isti objekt, tj. Sam objekt "O"
  • Objekti koji su proslijeđeni kao argument metodi "M"
  • Lokalni objekti, tj. Objekti koji su stvoreni unutar metode „M“
  • Globalni objekti kojima je dostupan objekt "O"
  • Izravni komponentni objekti objekta "O"

Evo popisa kodova koji ilustrira razred i njegove članove koji se pridržavaju načela zakona Demetre. Zbog jasnoće sam spomenuo komentare gdje god je to primjenjivo.

public class LawOfDemeterExample

    {

        //This is an instance in the class scope

        //and hence this instance can be accessed by any members of this class

        AnotherClass instance = new AnotherClass();

       public void SampleMethodFollowingLoD(Test obj)

        {         

            DoNothing(); //This is a valid call as you are calling a method of the same class

             object data = obj.GetData(); //This is also valid since you are calling a method

            //on an instance that has been passed as a parameter           

             int result = instance.GetResult();  //This is also a valid call as you are calling

            //a method on an instance locally created

        }

        private void DoNothing()

        {

            // Write some code here

        }

    }

Evo još dvije klase koje bi vam trebale za sastavljanje gornjeg koda.

public class AnotherClass

    {

        public int GetResult()

        {

            return -1;

        }

    }

    public class Test

    {

        public object GetData()

        {

            return null;

        }

    }

Sada se obratite gore prikazanoj klasi LawOfDemeterExample. Kôd je samorazumljiv. Sada biste se mogli zapitati odnosi li se Demetrov zakon samo na metode. Odgovor je "Ne". Načelo zakona Demetre odnosi se i na svojstva.

Kršenje načela zakona Demetra

U prvom ranije objašnjenom primjeru koda započeli smo raspravu o ovoj temi pridržavajući se zakona Demetra. Shvatimo što se događa kad ne slijedimo ovaj princip. Razmotrite ovaj primjer koda.

var data = new A().GetObjectB().GetObjectC().GetData();

U ovom primjeru klijent će morati ovisiti o razredima A, B i C. Drugim riječima, povezan je s primjerima klasa A, B i C. Ako se u budućnosti ove klase promijene, mogli biste naići na probleme jer izlažete se promjenama koje bi se mogle dogoditi u bilo kojoj od ovih klasa u budućnosti.