Πώς να εξηγήσετε αντικειμενοστραφείς έννοιες προγραμματισμού σε έναν 6χρονο

Έχετε παρατηρήσει πώς οι ίδιες ερωτήσεις cliche γίνονται πάντα στις συνεντεύξεις εργασίας - ξανά και ξανά;

Είμαι σίγουρος ότι ξέρετε τι εννοώ.

Για παράδειγμα:

Πού βλέπεις τον εαυτό σου σε πέντε χρόνια;

ή, ακόμη χειρότερα:

Ποια θεωρείτε τη μεγαλύτερη αδυναμία σας;

Αχ ... δώσε μου ένα διάλειμμα. Θεωρώ ότι η απάντηση σε αυτήν την ερώτηση είναι μεγάλη αδυναμία! Εν πάση περιπτώσει, δεν είναι το θέμα μου.

Όσο ασήμαντες και αν είναι αυτές οι ερωτήσεις, είναι σημαντικές επειδή δίνουν ενδείξεις για εσάς. Η τρέχουσα κατάσταση του νου σας, η στάση σας, η προοπτική σας.

Κατά την απάντηση, θα πρέπει να είστε προσεκτικοί, καθώς μπορεί να αποκαλύψετε κάτι που μετανιώνετε αργότερα.

Σήμερα θέλω να μιλήσω για έναν παρόμοιο τύπο ερώτησης στον κόσμο του προγραμματισμού:

Ποιες είναι οι κύριες αρχές του αντικειμενοστρεφούς προγραμματισμού;

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

Οι προγραμματιστές Junior και entry-level συνήθως πρέπει να το απαντήσουν. Επειδή είναι ένας εύκολος τρόπος για τον ερευνητή να πει τρία πράγματα:

  1. Προετοιμάστηκε ο υποψήφιος για αυτήν τη συνέντευξη;

    Μπόνους πόντους αν ακούσετε μια απάντηση αμέσως - δείχνει μια σοβαρή προσέγγιση.

  2. Ο υποψήφιος έχει περάσει από τη φάση του μαθήματος;

    Η κατανόηση των αρχών του Object-Oriented Programming (OOP) δείχνει ότι έχετε ξεπεράσει την αντιγραφή και την επικόλληση από σεμινάρια - βλέπετε ήδη πράγματα από υψηλότερη προοπτική.

  3. Είναι η κατανόηση του υποψηφίου βαθιά ή ρηχή;

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

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

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

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

Ενθυλάκωση

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

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

Έτσι, το αντικείμενο διαχειρίζεται τη δική του κατάσταση μέσω μεθόδων - και καμία άλλη τάξη δεν μπορεί να το αγγίξει, εκτός αν επιτρέπεται ρητά. Εάν θέλετε να επικοινωνήσετε με το αντικείμενο, πρέπει να χρησιμοποιήσετε τις παρεχόμενες μεθόδους. Αλλά (από προεπιλογή), δεν μπορείτε να αλλάξετε την κατάσταση.

Ας πούμε ότι χτίζουμε ένα μικρό παιχνίδι Sims. Υπάρχουν άνθρωποι και υπάρχει μια γάτα. Επικοινωνούν μεταξύ τους. Θέλουμε να εφαρμόσουμε ενθυλάκωση, έτσι ενσωματώνουμε όλη τη λογική «γάτας» σε έναCatτάξη. Μπορεί να μοιάζει με αυτό:

Εδώ η «κατάσταση» της γάτας είναι οι ιδιωτικές μεταβλητέςmood , hungryκαι energy. Έχει επίσης μια ιδιωτική μέθοδο meow(). Μπορεί να το καλέσει όποτε θέλει, τα άλλα μαθήματα δεν μπορούν να πουν στη γάτα πότε να νυχτούν.

Τι μπορούν να κάνουν ορίζεται στις δημόσιες μεθόδουςsleep() , play()και feed(). Καθένα από αυτά τροποποιεί κατά κάποιο τρόπο την εσωτερική κατάσταση και μπορεί να επικαλεστεί meow(). Έτσι, γίνεται η σύνδεση μεταξύ του ιδιωτικού κράτους και των δημόσιων μεθόδων.

Αυτό είναι ενθυλάκωση.

Αφαίρεση

Η αφαίρεση μπορεί να θεωρηθεί ως μια φυσική προέκταση της ενθυλάκωσης.

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

Η αφαίρεση είναι μια ιδέα που αποσκοπεί στην ανακούφιση αυτού του προβλήματος.

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

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

Σκεφτείτε - μια καφετιέρα. Κάνει πολλά πράγματα και κάνει περίεργους θορύβους κάτω από την κουκούλα. Αλλά το μόνο που έχετε να κάνετε είναι να βάλετε καφέ και να πατήσετε ένα κουμπί.

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

Ένα άλλο πραγματικό παράδειγμα αφαίρεσης;

Σκεφτείτε πώς χρησιμοποιείτε το τηλέφωνό σας:

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

Οι αλλαγές εφαρμογής - για παράδειγμα, μια ενημέρωση λογισμικού - σπάνια επηρεάζουν την αφαίρεση που χρησιμοποιείτε.

Κληρονομία

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

Αλλά γνωρίζετε ποιο είναι ένα άλλο κοινό πρόβλημα στη σχεδίαση OOP;

Τα αντικείμενα είναι συχνά πολύ παρόμοια. Μοιράζονται κοινή λογική. Αλλά δεν είναι εντελώς τα ίδια. Αχ…

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

Αυτό σημαίνει ότι δημιουργείτε μια (θυγατρική) τάξη προερχόμενη από μια άλλη (γονική) τάξη. Με αυτόν τον τρόπο, σχηματίζουμε μια ιεραρχία.

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

Για παράδειγμα:

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

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

Πολυμορφισμός

Είμαστε στην πιο περίπλοκη λέξη! Ο πολυμορφισμός σημαίνει "πολλά σχήματα" στα ελληνικά.

Γνωρίζουμε λοιπόν ήδη τη δύναμη της κληρονομιάς και την χρησιμοποιούμε ευτυχώς. Αλλά έρχεται αυτό το πρόβλημα.

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

Αυτό μπορεί να επιλυθεί χρησιμοποιώντας πολυμορφισμό.

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

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

Κάθε φορά που μια συλλογή (όπως μια λίστα) ή μια μέθοδος αναμένει μια παρουσία του γονέα (όπου περιγράφονται οι κοινές μέθοδοι), η γλώσσα φροντίζει για την αξιολόγηση της σωστής εφαρμογής της κοινής μεθόδου - ανεξάρτητα από το παιδί που περνά.

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

Έχοντας αυτά τα τρία στοιχεία που κληρονομεί τη μητρική Figure Interfaceσας επιτρέπει να δημιουργήσετε μια λίστα των μικτών triangles, circlesκαι rectangles. Και μεταχειριστείτε τους σαν τον ίδιο τύπο αντικειμένου.

Στη συνέχεια, εάν αυτή η λίστα προσπαθεί να υπολογίσει την επιφάνεια για ένα στοιχείο, η σωστή μέθοδος βρίσκεται και εκτελείται. Εάν το στοιχείο είναι τρίγωνο, τρίγωνοCalculateSurface()λέγεται. Αν είναι ένας κύκλος - τότε κυκλικόςCalculateSurface()λέγεται. Και ούτω καθεξής.

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

Μπορείτε να το ορίσετε μία φορά και να αποδεχτείτε ένα Figureως επιχείρημα. Είτε περνάτε ένα τρίγωνο, έναν κύκλο είτε ένα ορθογώνιο - όσο εφαρμόζονται CalculateParamter(), ο τύπος τους δεν έχει σημασία.

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

Εάν βρείτε κάτι ακόμα δύσκολο να καταλάβετε - μην διστάσετε να ρωτήσετε στα παρακάτω σχόλια.

Τι έπεται?

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

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

Μείνετε συντονισμένοι.