Demistificare il principio della Legge di Demetra

La legge di Demetra (o il principio della minima conoscenza) è una linea guida di progettazione per lo sviluppo di applicazioni software. Discusso per la prima volta alla Northeastern University nel 1987, questo principio afferma che un oggetto non dovrebbe mai conoscere i dettagli interni di altri oggetti. È stato progettato per promuovere l'accoppiamento libero nei progetti di software.

Si noti che l'accoppiamento può essere definito come il grado di interdipendenza che esiste tra i moduli software e quanto strettamente tali moduli sono collegati tra loro. Maggiore è l'accoppiamento tra i componenti in un'applicazione, più difficile diventa modificarlo e mantenerlo nel tempo. È sempre una buona pratica progettare sistemi più facili da testare e mantenere assicurando che i componenti in un'applicazione siano accoppiati in modo lasco. Puoi saperne di più sulla coesione e sull'accoppiamento dal mio articolo qui.

Comprendere il principio della Legge di Demetra

Il principio della Legge di Demetra afferma che un modulo non dovrebbe avere la conoscenza dei dettagli interni degli oggetti che manipola. In altre parole, un componente software o un oggetto non dovrebbe avere la conoscenza del funzionamento interno di altri oggetti o componenti. Comprendiamo la Legge di Demetra con un esempio.

Considera tre classi, vale a dire - A, B e C - e gli oggetti di queste classi - objA, objB e objC rispettivamente. Supponiamo ora che objA dipenda da objB, che a sua volta compone objC. In questo scenario, objA può invocare metodi e proprietà di objB ma non objC.

Il principio della Legge di Demetra sfrutta l'incapsulamento per ottenere questo isolamento e ridurre l'accoppiamento tra i componenti della vostra applicazione. Ciò aiuta a migliorare la qualità del codice e promuove la flessibilità e la manutenzione del codice più semplice. Il vantaggio di aderire alla Legge di Demetra è che puoi creare software facilmente manutenibile e adattabile a cambiamenti futuri.

Considera una classe C con un metodo M. Supponiamo ora di aver creato un'istanza della classe C denominata O. La legge di Demetra specifica che il metodo M può invocare i seguenti tipi di. Oppure una proprietà di una classe dovrebbe invocare il seguente tipo solo dei membri:

  • Lo stesso oggetto, cioè lo stesso oggetto “O”
  • Oggetti che sono stati passati come argomento al metodo "M"
  • Oggetti locali, ovvero oggetti che sono stati creati all'interno del metodo "M"
  • Oggetti globali accessibili dall'oggetto "O"
  • Oggetti componenti diretti dell'oggetto "O"

Ecco un elenco di codice che illustra una classe e i suoi membri che aderiscono al principio della Legge di Demetra. Ho menzionato commenti ovunque applicabili per chiarezza.

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

        }

    }

Ecco le altre due classi necessarie per compilare il codice sopra.

public class AnotherClass

    {

        public int GetResult()

        {

            return -1;

        }

    }

    public class Test

    {

        public object GetData()

        {

            return null;

        }

    }

Ora, fai riferimento alla classe LawOfDemeterExample mostrata sopra. Il codice è autoesplicativo. Potresti ora chiederti se la Legge di Demetra si applica solo ai metodi. La risposta è no". Il principio della Legge di Demetra si applica anche alle proprietà.

Violazioni del principio della Legge di Demetra

Nel primo esempio di codice spiegato in precedenza, abbiamo iniziato la nostra discussione su questo argomento aderendo al principio della Legge di Demetra. Capiamo cosa succede quando non seguiamo questo principio. Considera questo esempio di codice.

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

In questo esempio, il cliente dovrà dipendere dalle classi A, B e C.In altre parole, è accoppiato alle istanze delle classi A, B e C.Se in futuro queste classi cambiassero, potresti incorrere in problemi ti stai esponendo a cambiamenti che potrebbero verificarsi in una qualsiasi di queste classi in futuro.