Προγραμματισμός

Απομυθοποίηση της αρχής του Νόμου της Δήμητρας

Ο Νόμος της Δήμητρας (ή η Αρχή της Λιγότερης Γνώσης) είναι μια κατευθυντήρια γραμμή σχεδιασμού για την ανάπτυξη εφαρμογών λογισμικού. Για πρώτη φορά που συζητήθηκε στο Βορειοανατολικό Πανεπιστήμιο το 1987, αυτή η αρχή αναφέρει ότι ένα αντικείμενο δεν πρέπει ποτέ να γνωρίζει τις εσωτερικές λεπτομέρειες άλλων αντικειμένων. Σχεδιάστηκε για την προώθηση χαλαρής σύζευξης σε σχέδια λογισμικού.

Σημειώστε ότι η σύζευξη μπορεί να οριστεί ως ο βαθμός αλληλεξάρτησης που υπάρχει μεταξύ των μονάδων λογισμικού και του πόσο στενά συνδέονται αυτές οι ενότητες μεταξύ τους. Όσο περισσότερο συνδέεται μεταξύ των εξαρτημάτων σε μια εφαρμογή, τόσο πιο δύσκολο γίνεται να το τροποποιήσετε και να το διατηρήσετε με την πάροδο του χρόνου. Είναι πάντα μια καλή πρακτική να σχεδιάζουμε συστήματα που είναι ευκολότερα στη δοκιμή και τη συντήρησή τους, διασφαλίζοντας ότι τα εξαρτήματα σε μια εφαρμογή είναι χαλαρά συνδεδεμένα. Μπορείτε να μάθετε περισσότερα σχετικά με τη συνοχή και τη σύνδεση από το άρθρο μου εδώ.

Κατανόηση της αρχής του Νόμου της Δήμητρας

Η αρχή του Νόμου της Δήμητρας δηλώνει ότι μια ενότητα δεν πρέπει να έχει τις γνώσεις σχετικά με τις εσωτερικές λεπτομέρειες των αντικειμένων που χειρίζεται. Με άλλα λόγια, ένα στοιχείο λογισμικού ή ένα αντικείμενο δεν πρέπει να έχει τη γνώση της εσωτερικής λειτουργίας άλλων αντικειμένων ή στοιχείων. Ας κατανοήσουμε το νόμο της Δήμητρας με ένα παράδειγμα.

Εξετάστε τρεις κατηγορίες - A, B και C - και αντικείμενα αυτών των τάξεων - objA, objB και objC αντίστοιχα. Ας υποθέσουμε τώρα ότι το objA εξαρτάται από το objB, το οποίο με τη σειρά του συνθέτει objC. Σε αυτό το σκηνικό, το objA μπορεί να επικαλεστεί μεθόδους και ιδιότητες του objB αλλά όχι objC.

Η αρχή του Νόμου της Δήμητρας εκμεταλλεύεται την ενθυλάκωση για να επιτύχει αυτήν την απομόνωση και να μειώσει τη σύνδεση μεταξύ των στοιχείων της εφαρμογής σας. Αυτό βοηθά στη βελτίωση της ποιότητας του κώδικα και προωθεί την ευελιξία και την ευκολότερη συντήρηση κώδικα. Το πλεονέκτημα της τήρησης του νόμου της Δήμητρας είναι ότι μπορείτε να δημιουργήσετε λογισμικό που είναι εύκολα συντηρούμενο και προσαρμόσιμο στις μελλοντικές αλλαγές.

Εξετάστε μια τάξη C με μια μέθοδο M. Τώρα ας υποθέσουμε ότι έχετε δημιουργήσει μια παρουσία της κλάσης C με το όνομα O. Ο νόμος της Δήμητρας καθορίζει ότι η μέθοδος M μπορεί να επικαλεστεί τους ακόλουθους τύπους. Ή μια ιδιότητα μιας κλάσης θα πρέπει να επικαλεστεί τον ακόλουθο τύπο μόνο μελών:

  • Το ίδιο αντικείμενο, δηλαδή το ίδιο το αντικείμενο "O"
  • Αντικείμενα που έχουν περάσει ως επιχείρημα στη μέθοδο "M"
  • Τοπικά αντικείμενα, δηλαδή αντικείμενα που έχουν δημιουργηθεί με τη μέθοδο "M"
  • Καθολικά αντικείμενα που είναι προσβάσιμα από το αντικείμενο "O"
  • Άμεσα αντικείμενα του αντικειμένου "O"

Ακολουθεί μια λίστα κωδικών που απεικονίζει μια τάξη και τα μέλη της που συμμορφώνονται με την αρχή του Νόμου της Δήμητρας. Έχω αναφέρει σχόλια όπου ισχύει για λόγους σαφήνειας.

δημόσια τάξη LawOfDemeterExample

    {

// Αυτή είναι μια παρουσία στο πεδίο της τάξης

// και ως εκ τούτου αυτή η παρουσία μπορεί να προσεγγιστεί από οποιοδήποτε μέλος αυτής της τάξης

Instance AnotherClass = νέο AnotherClass ();

public void SampleMethodFollowingLoD (Δοκιμή obj)

        {         

Μην κάνεις τίποτα(); // Αυτή είναι μια έγκυρη κλήση καθώς καλείτε μια μέθοδο της ίδιας τάξης

δεδομένα αντικειμένου = obj.GetData (); // Αυτό ισχύει επίσης επειδή καλείτε μια μέθοδο

// σε μια παρουσία που έχει περάσει ως παράμετρος

int αποτέλεσμα = instance.GetResult (); // Αυτή είναι επίσης μια έγκυρη κλήση καθώς καλείτε

// μια μέθοδο σε μια παρουσία που δημιουργήθηκε τοπικά

        }

ιδιωτικό κενό DoNothing ()

        {

// Γράψτε έναν κωδικό εδώ

        }

    }

Εδώ είναι οι δύο άλλες τάξεις που θα χρειαζόταν να συντάξετε τον παραπάνω κώδικα.

δημόσια τάξη AnotherClass

    {

δημόσια int GetResult ()

        {

επιστροφή -1;

        }

    }

δοκιμή δημόσιας τάξης

    {

δημόσιο αντικείμενο GetData ()

        {

επιστροφή μηδέν;

        }

    }

Τώρα, ανατρέξτε στην κλάση LawOfDemeterExample που φαίνεται παραπάνω. Ο κωδικός είναι αυτονόητος. Ίσως αναρωτιέστε εάν ο Νόμος της Δήμητρας ισχύει μόνο για μεθόδους. Η απάντηση είναι όχι". Η αρχή του Νόμου της Δήμητρας ισχύει και για τις ιδιότητες.

Παραβιάσεις της αρχής του νόμου της Δήμητρας

Στο πρώτο παράδειγμα κώδικα που εξηγήθηκε νωρίτερα, ξεκινήσαμε τη συζήτησή μας για αυτό το θέμα ακολουθώντας την αρχή του Νόμου της Δήμητρας. Ας καταλάβουμε τι συμβαίνει όταν δεν ακολουθούμε αυτήν την αρχή. Εξετάστε αυτό το παράδειγμα κώδικα.

var data = νέο A (). GetObjectB (). GetObjectC (). GetData ();

Σε αυτό το παράδειγμα, ο πελάτης θα πρέπει να εξαρτάται από τις κατηγορίες Α, Β και Γ. Με άλλα λόγια, συνδέεται με τις περιπτώσεις των τάξεων Α, Β και Γ. Εάν στο μέλλον αλλάξουν αυτές οι τάξεις, θα αντιμετωπίσετε προβλήματα όπως εκθέτετε τον εαυτό σας σε αλλαγές που ενδέχεται να προκύψουν σε οποιαδήποτε από αυτές τις τάξεις στο μέλλον.