10 Αρχές Αντικειμενοστρεφούς Προγραμματισμού που πρέπει να γνωρίζει κάθε προγραμματιστής

10 Αρχές Αντικειμενοστρεφούς Προγραμματισμού που πρέπει να γνωρίζει κάθε προγραμματιστής

Αρκετά συχνά συναντώ προγραμματιστές που δεν έχουν ακούσει για τις αρχές SOLID (εμείς μίλησε για αυτά αναλυτικά εδώ. — Μετάφραση) ή αντικειμενοστραφή προγραμματισμό (OOP), ή έχετε ακούσει γι' αυτά, αλλά μην τα χρησιμοποιείτε στην πράξη. Αυτό το άρθρο περιγράφει τα οφέλη των αρχών OOP που βοηθούν τον προγραμματιστή στην καθημερινή του εργασία. Μερικά από αυτά είναι γνωστά, άλλα όχι τόσο πολύ, οπότε το άρθρο θα είναι χρήσιμο τόσο για αρχάριους όσο και για έμπειρους προγραμματιστές.

Υπενθύμιση: για όλους τους αναγνώστες Habr - έκπτωση 10 ρούβλια όταν εγγραφείτε σε οποιοδήποτε μάθημα Skillbox χρησιμοποιώντας τον κωδικό προσφοράς Habr.

Το Skillbox προτείνει: Εκπαιδευτικό διαδικτυακό μάθημα "Προγραμματιστής Java".

DRY (Μην επαναλαμβάνεστε)

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

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

Αυτό είναι απαραίτητο προκειμένου να απλοποιηθεί ο κώδικας και να διευκολυνθεί η διατήρησή του, κάτι που είναι ο κύριος στόχος του OOP. Επίσης, δεν πρέπει να κάνετε υπερβολική χρήση της ένωσης, καθώς ο ίδιος κωδικός δεν θα περάσει επαλήθευση τόσο με το OrderId όσο και με το SSN.

Ενθυλακωτικές Αλλαγές

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

Αν γράφεις σε Java, τότε εκχωρήστε ιδιωτικές μεθόδους και μεταβλητές από προεπιλογή.

Αρχή ανοιχτού/κλειστού

Αυτή η αρχή μπορεί να απομνημονευθεί εύκολα διαβάζοντας την ακόλουθη δήλωση: «Οι οντότητες λογισμικού (κλάσεις, λειτουργικές μονάδες, συναρτήσεις, κ.λπ.) πρέπει να είναι ανοιχτές για επέκταση, αλλά κλειστές για τροποποίηση». Στην πράξη, αυτό σημαίνει ότι μπορούν να επιτρέψουν την αλλαγή της συμπεριφοράς τους χωρίς να αλλάξουν τον πηγαίο κώδικα.

Η αρχή είναι σημαντική όταν οι αλλαγές στον πηγαίο κώδικα απαιτούν αναθεώρηση κώδικα, δοκιμή μονάδας και άλλες διαδικασίες. Ο κώδικας που ακολουθεί την αρχή ανοιχτού/κλειστού δεν αλλάζει όταν επεκτείνεται, επομένως υπάρχουν πολύ λιγότερα προβλήματα με αυτόν.

Ακολουθεί ένα παράδειγμα κώδικα που παραβιάζει αυτήν την αρχή.

10 Αρχές Αντικειμενοστρεφούς Προγραμματισμού που πρέπει να γνωρίζει κάθε προγραμματιστής

Εάν πρέπει να αλλάξετε κάτι σε αυτό, θα χρειαστεί πολύς χρόνος, καθώς όλα τα τμήματα του κώδικα που έχουν σύνδεση με το επιθυμητό τμήμα θα πρέπει να αλλάξουν.

Παρεμπιπτόντως, το άνοιγμα-κλειστό είναι μια από τις αρχές του SOLID.

Αρχή Ενιαίας Ευθύνης (SRP)

Μια άλλη αρχή από το σετ SOLID. Δηλώνει ότι «υπάρχει μόνο μία αιτία που προκαλεί αλλαγή στην τάξη». Η τάξη λύνει μόνο ένα πρόβλημα. Μπορεί να έχει πολλές μεθόδους, αλλά καθεμία από αυτές χρησιμοποιείται μόνο για την επίλυση ενός κοινού προβλήματος. Όλες οι μέθοδοι και οι ιδιότητες πρέπει να εξυπηρετούν μόνο αυτό.

10 Αρχές Αντικειμενοστρεφούς Προγραμματισμού που πρέπει να γνωρίζει κάθε προγραμματιστής

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

Αρχή αντιστροφής εξάρτησης (DIP)

10 Αρχές Αντικειμενοστρεφούς Προγραμματισμού που πρέπει να γνωρίζει κάθε προγραμματιστής

Παραπάνω είναι ένα παράδειγμα κώδικα όπου το AppManager εξαρτάται από το EventLogWriter, το οποίο με τη σειρά του είναι στενά συνδεδεμένο με το AppManager. Εάν χρειάζεστε διαφορετικό τρόπο εμφάνισης μιας ειδοποίησης, είτε πρόκειται για push, SMS ή email, πρέπει να αλλάξετε την κλάση AppManager.

Το πρόβλημα μπορεί να λυθεί χρησιμοποιώντας DIP. Έτσι, αντί για AppManager, ζητάμε ένα EventLogWriter, το οποίο θα εισαχθεί χρησιμοποιώντας το πλαίσιο.

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

Σύνθεση αντί κληρονομικότητας

10 Αρχές Αντικειμενοστρεφούς Προγραμματισμού που πρέπει να γνωρίζει κάθε προγραμματιστήςΥπάρχουν δύο κύριοι τρόποι για να επαναχρησιμοποιηθεί ο κώδικας: η κληρονομικότητα και η σύνθεση, και οι δύο έχουν τα δικά τους πλεονεκτήματα και μειονεκτήματα. Συνήθως προτιμάται το δεύτερο γιατί είναι πιο ευέλικτο.

Η σύνθεση σάς δίνει τη δυνατότητα να αλλάξετε τη συμπεριφορά μιας κλάσης κατά το χρόνο εκτέλεσης ορίζοντας τις ιδιότητες της. Κατά την υλοποίηση διεπαφών, χρησιμοποιείται πολυμορφισμός, ο οποίος δίνει μια πιο ευέλικτη υλοποίηση.

Ακόμη και η Effective Java του Joshua Bloch συμβουλεύει να επιλέγετε τη σύνθεση αντί της κληρονομικότητας.

Αρχή αντικατάστασης Barbara Liskov (LSP)

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

Το LSP συνδέεται τόσο με την αρχή της ενιαίας ευθύνης όσο και με την αρχή της κοινής ευθύνης. Εάν μια κλάση παρέχει περισσότερη λειτουργικότητα από μια υποκλάση, τότε η τελευταία δεν θα υποστηρίξει ορισμένες από τις λειτουργίες, παραβιάζοντας αυτήν την αρχή.

Εδώ είναι ένα κομμάτι κώδικα που έρχεται σε αντίθεση με το LSP.

10 Αρχές Αντικειμενοστρεφούς Προγραμματισμού που πρέπει να γνωρίζει κάθε προγραμματιστής

Η μέθοδος area (Rectangle r) υπολογίζει το εμβαδόν ενός ορθογωνίου. Το πρόγραμμα θα διακοπεί μετά την εκτέλεση του Square, επειδή το Square δεν είναι ορθογώνιο εδώ. Σύμφωνα με την αρχή LSP, οι συναρτήσεις που χρησιμοποιούν αναφορές σε βασικές κλάσεις θα πρέπει να μπορούν να χρησιμοποιούν αντικείμενα παράγωγων κλάσεων χωρίς πρόσθετες οδηγίες.

Αυτή η αρχή, η οποία είναι ένας συγκεκριμένος ορισμός ενός υποτύπου, προτάθηκε από την Barbara Liskov σε μια κεντρική ομιλία του συνεδρίου το 1987 με τίτλο «Δεδομένη Αφαίρεση και Ιεραρχία», εξ ου και το όνομά της.

Αρχή διαχωρισμού διεπαφής (ISP)

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

Τις περισσότερες φορές, αυτή η κατάσταση συμβαίνει όταν η διεπαφή περιέχει πολλές λειτουργίες ταυτόχρονα και ο πελάτης χρειάζεται μόνο μία από αυτές.

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

Το πλεονέκτημα της αρχής του ISP στην Java είναι ότι όλες οι μέθοδοι πρέπει να υλοποιηθούν πρώτα και μόνο τότε μπορούν να χρησιμοποιηθούν από κλάσεις. Επομένως, η αρχή καθιστά δυνατή τη μείωση του αριθμού των μεθόδων.

10 Αρχές Αντικειμενοστρεφούς Προγραμματισμού που πρέπει να γνωρίζει κάθε προγραμματιστής

Προγραμματισμός για τη διεπαφή, όχι για την υλοποίηση

Όλα εδώ είναι ξεκάθαρα από τον τίτλο. Η εφαρμογή αυτής της αρχής οδηγεί στη δημιουργία ευέλικτου κώδικα που μπορεί να λειτουργήσει με οποιαδήποτε νέα υλοποίηση της διεπαφής.

Θα πρέπει να χρησιμοποιήσετε τον τύπο διεπαφής για μεταβλητές, τύπους επιστροφής ή τον τύπο ορίσματος μεθόδου. Ένα παράδειγμα είναι η χρήση SuperClass και όχι SubClass.

Αυτό είναι:

Αριθμοί λίστας= getNumbers();

Αλλά όχι:

Αριθμοί ArrayList = getNumbers();

Ακολουθεί μια πρακτική εφαρμογή όσων συζητήθηκαν παραπάνω.

10 Αρχές Αντικειμενοστρεφούς Προγραμματισμού που πρέπει να γνωρίζει κάθε προγραμματιστής

Αρχή της αντιπροσωπείας

Ένα κοινό παράδειγμα είναι οι μέθοδοι equals() και hashCode() στην Java. Όταν είναι απαραίτητο να συγκριθούν δύο αντικείμενα, αυτή η ενέργεια εκχωρείται στην αντίστοιχη κλάση αντί για τον πελάτη.

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

10 Αρχές Αντικειμενοστρεφούς Προγραμματισμού που πρέπει να γνωρίζει κάθε προγραμματιστής

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

Το Skillbox προτείνει:

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο