Démystifier la loi du principe de Déméter

La loi de Demeter (ou le principe de la moindre connaissance) est un guide de conception pour le développement d'applications logicielles. Discuté pour la première fois à la Northeastern University en 1987, ce principe stipule qu'un objet ne doit jamais connaître les détails internes d'autres objets. Il a été conçu pour favoriser un couplage lâche dans les conceptions de logiciels.

Notez que le couplage peut être défini comme le degré d'interdépendance qui existe entre les modules logiciels et la proximité avec laquelle ces modules sont connectés les uns aux autres. Plus le couplage entre les composants d'une application est important, plus il devient difficile de le modifier et de le maintenir dans le temps. Il est toujours recommandé de concevoir des systèmes plus faciles à tester et à entretenir en s'assurant que les composants d'une application sont faiblement couplés. Vous pouvez en apprendre plus sur la cohésion et le couplage dans mon article ici.

Comprendre la loi du principe de Déméter

Le principe de la loi de Demeter stipule qu'un module ne doit pas avoir la connaissance des détails internes des objets qu'il manipule. En d'autres termes, un composant logiciel ou un objet ne doit pas avoir la connaissance du fonctionnement interne d'autres objets ou composants. Comprenons la loi de Déméter avec un exemple.

Considérez trois classes à savoir - A, B et C - et les objets de ces classes - objA, objB et objC respectivement. Supposons maintenant que objA dépende de objB, qui à son tour compose objC. Dans ce scénario, objA peut invoquer des méthodes et des propriétés d'objB mais pas objC.

Le principe de la loi de Demeter tire parti de l'encapsulation pour réaliser cet isolement et réduire le couplage entre les composants de votre application. Cela contribue à améliorer la qualité du code et favorise la flexibilité et la maintenance du code plus facile. L'avantage d'adhérer à la loi de Demeter est que vous pouvez créer un logiciel qui est facilement maintenable et adaptable aux changements futurs.

Considérons une classe C ayant une méthode M. Supposons maintenant que vous ayez créé une instance de la classe C nommée O. La loi de Demeter spécifie que la méthode M peut invoquer les types suivants de .ou une propriété d'une classe doit appeler le type suivant des membres seulement:

  • Le même objet, c'est-à-dire l'objet «O» lui-même
  • Objets passés en argument à la méthode «M»
  • Objets locaux, c'est-à-dire les objets créés à l'intérieur de la méthode «M»
  • Objets globaux accessibles par l'objet «O»
  • Objets composants directs de l'objet "O"

Voici une liste de codes qui illustre une classe et ses membres qui adhèrent au principe de la loi de Déméter. J'ai mentionné des commentaires le cas échéant pour plus de clarté.

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

        }

    }

Voici les deux autres classes dont vous auriez besoin pour compiler le code ci-dessus.

public class AnotherClass

    {

        public int GetResult()

        {

            return -1;

        }

    }

    public class Test

    {

        public object GetData()

        {

            return null;

        }

    }

Maintenant, reportez-vous à la classe LawOfDemeterExample ci-dessus. Le code est explicite. Vous pourriez maintenant vous demander si la loi de Déméter s'applique uniquement aux méthodes. La réponse est non". Le principe de la loi de Demeter s'applique également aux propriétés.

Loi sur les violations du principe de Déméter

Dans le premier exemple de code expliqué précédemment, nous avons commencé notre discussion sur ce sujet en adhérant au principe de la loi de Déméter. Comprenons ce qui se passe lorsque nous ne suivons pas ce principe. Considérez cet exemple de code.

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

Dans cet exemple, le client devra dépendre des classes A, B et C.En d'autres termes, il est couplé à des instances des classes A, B et C.Si à l'avenir ces classes changent, vous rencontrerez des problèmes comme vous vous exposez à des changements qui pourraient survenir dans l'une de ces classes à l'avenir.