Демистифициране на принципа на закона на Деметра

Законът на Деметра (или Принципът на най-малкото знание) е насока за проектиране за разработване на софтуерни приложения. За първи път обсъден в Североизточния университет през 1987 г., този принцип гласи, че обектът никога не трябва да знае вътрешните детайли на други обекти. Той е проектиран да насърчава свободно свързване в софтуерните дизайни.

Имайте предвид, че свързването може да бъде определено като степента на взаимозависимост, която съществува между софтуерните модули и колко тясно са свързани тези модули един с друг. Колкото повече е свързването между компонентите в дадено приложение, толкова по-трудно става да го модифицирате и поддържате във времето. Винаги е добра практика да се проектират системи, които са по-лесни за тестване и поддръжка, като се гарантира, че компонентите в дадено приложение са свободно свързани. Можете да научите повече за сближаването и свързването от моята статия тук.

Разбиране на принципа на закона на Деметра

Принципът на закона на Деметра гласи, че модулът не трябва да притежава знанията за вътрешните детайли на обектите, които манипулира. С други думи, софтуерен компонент или обект не трябва да има знания за вътрешната работа на други обекти или компоненти. Нека разберем Закона на Деметра с пример.

Помислете за три класа, а именно - A, B и C - и обекти от тези класове - objA, objB и objC съответно. Сега да предположим, че objA зависи от objB, което от своя страна съставя objC. В този сценарий objA може да извиква методи и свойства на objB, но не и objC.

Принципът на закона на Деметра се възползва от капсулирането, за да постигне тази изолация и да намали свързването между компонентите на вашето приложение. Това помага за подобряване на качеството на кода и насърчава гъвкавостта и по-лесното поддържане на кода. Ползата от спазването на Закона на Деметра е, че можете да създадете софтуер, който е лесно поддържаем и приспособим към бъдещи промени.

Помислете за клас C, който има метод M. Сега да предположим, че сте създали екземпляр на клас C с име O. Законът на Деметра уточнява, че методът M може да извиква следните типове .или свойство на клас трябва да извиква следния тип само за членове:

  • Същият обект, т.е. самият обект "O"
  • Обекти, които са предадени като аргумент на метода “M”
  • Локални обекти, т.е. обекти, които са създадени в метода “M”
  • Глобални обекти, които са достъпни от обекта „O“
  • Директни компонентни обекти на обекта „O“

Ето списък с кодове, който илюстрира клас и неговите членове, които се придържат към принципа на Закона на Деметра. Споменах коментари навсякъде, където е приложимо за по-голяма яснота.

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

        }

    }

Ето и другите два класа, които ще ви трябват, за да компилирате горния код.

public class AnotherClass

    {

        public int GetResult()

        {

            return -1;

        }

    }

    public class Test

    {

        public object GetData()

        {

            return null;

        }

    }

Сега се обърнете към класа LawOfDemeterExample, показан по-горе. Кодът е обяснителен. Сега може да се чудите дали законът на Деметра се прилага само за методи. Отговорът е „Не“. Принципът на закона на Деметра се прилага и за имотите.

Нарушения на Принципа на Деметра

В първия пример на кода, обяснен по-рано, започнахме дискусията си по тази тема, като се придържахме към принципа на Закона на Деметра. Нека разберем какво се случва, когато не следваме този принцип. Помислете за този пример с код.

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

В този пример клиентът ще трябва да зависи от класове A, B и C. С други думи, той е свързан с екземпляри от класове A, B и C. Ако в бъдеще тези класове се променят, ще имате проблеми излагате се на промени, които могат да се появят в някой от тези класове в бъдеще.