Χρήση χαρακτηριστικών με τον κώδικα Ruby

click fraud protection

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

Χαρακτηριστικά είναι σαν instance μεταβλητές μπορείτε να έχετε πρόσβαση μέσω της σημείωσης σημείων αντικειμένου. Για παράδειγμα, Όνομα χρήστη θα έχει πρόσβαση στο όνομα ενός ατόμου. Ομοίως, μπορείτε συχνά να εκχωρήσετε σε χαρακτηριστικά όπως person.name = "Alice". Αυτό είναι ένα παρόμοιο χαρακτηριστικό για τις μεταβλητές μέλους (όπως στην C ++), αλλά όχι το ίδιο. Δεν υπάρχει τίποτα το ιδιαίτερο συμβαίνει εδώ, οι ιδιότητες εφαρμόζονται στις περισσότερες γλώσσες χρησιμοποιώντας "getters" και "setters", ή μεθόδους που ανακτούν και ορίζουν τις ιδιότητες από τις μεταβλητές στιγμιότυπων.

instagram viewer

Ο Ruby δεν κάνει διάκριση ανάμεσα στους getters και τους ρυθμιστές και στις κανονικές μεθόδους. Λόγω της ευέλικτης μεθόδου του Ruby που ονομάζει σύνταξη, δεν χρειάζεται να γίνει καμία διάκριση. Για παράδειγμα, Όνομα χρήστη και όνομα_αντικειμένου () είναι το ίδιο πράγμα, καλείτε το όνομα με μηδενικές παραμέτρους. Κάποιος μοιάζει με μια κλήση μεθόδου και η άλλη μοιάζει με ένα χαρακτηριστικό, αλλά είναι και τα δύο ίδια. Και οι δύο καλούν απλά το όνομα μέθοδος. Παρομοίως, οποιοδήποτε όνομα μεθόδου που τελειώνει σε ένα σύμβολο ίσων (=) μπορεί να χρησιμοποιηθεί σε μια ανάθεση. Η ΔΗΛΩΣΗ person.name = "Alice" είναι πραγματικά το ίδιο πράγμα person.name = (αλίκη), παρόλο που υπάρχει ένα κενό μεταξύ του ονόματος χαρακτηριστικού και του σημείου ισότητας, είναι ακόμα απλά να καλέσετε το όνομα = μέθοδος.

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

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

Υπάρχουν τρεις μέθοδοι στο Μονάδα μέτρησης που μπορείτε να χρησιμοποιήσετε μέσα στις δηλώσεις κλάσης σας. Θυμηθείτε ότι ο Ruby δεν κάνει καμία διάκριση μεταξύ του χρόνου εκτέλεσης και του "χρόνου μεταγλώττισης", και οποιοσδήποτε κώδικας μέσα στις δηλώσεις τάξης μπορεί όχι μόνο να ορίσει μεθόδους αλλά και να καλέσει μεθόδους. Τηλεφωνώντας στο attr_reader, attr_writer και attr_accessor οι μέθοδοι θα καθορίσουν με τη σειρά τους τους ρυθμιστές και τους getters που ορίσαμε στον προηγούμενο τομέα.

ο attr_reader η μέθοδος κάνει ακριβώς αυτό που ακούγεται σαν να το κάνει. Παίρνει οποιονδήποτε αριθμό παραμέτρων συμβόλων και, για κάθε παράμετρο, ορίζει μια μέθοδο "getter" που επιστρέφει την μεταβλητή της παρουσίας με το ίδιο όνομα. Έτσι, μπορούμε να αντικαταστήσουμε μας όνομα μέθοδος στο προηγούμενο παράδειγμα με attr_reader: όνομα.

Ομοίως, το attr_writer μέθοδος ορίζει μια μέθοδο "setter" για κάθε σύμβολο που διαβιβάζεται σε αυτήν. Σημειώστε ότι το σύμβολο ίσων δεν χρειάζεται να είναι μέρος του συμβόλου, μόνο το όνομα του χαρακτηριστικού. Μπορούμε να αντικαταστήσουμε το όνομα = από το προηγούμενο παράδειγμα με μια κλήση προς attr_writier: όνομα.

Και, όπως αναμενόταν, attr_accessor κάνει τη δουλειά και των δύο attr_writer και attr_reader. Αν χρειάζεστε τόσο έναν ρυθμιστή όσο και έναν getter για ένα χαρακτηριστικό, είναι κοινή πρακτική να μην καλέσετε τις δύο μεθόδους χωριστά και να καλέσετε attr_accessor. Θα μπορούσαμε να αντικαταστήσουμε και τα δυο ο όνομα και όνομα = μεθόδους από το προηγούμενο παράδειγμα με μία μόνο κλήση προς attr_accessor: όνομα.

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

Ένα πράγμα που θα δείτε συχνά είναι αυτό attr_reader θα χρησιμοποιηθεί για τον γρήγορο ορισμό ενός getter, αλλά θα οριστεί ένας custom setter αφού η εσωτερική κατάσταση του αντικειμένου επιθυμεί συχνά να είναι ανάγνωση απευθείας από την εσωτερική κατάσταση. Ο ρυθμιστής καθορίζεται στη συνέχεια χειροκίνητα και ελέγχει για να βεβαιωθεί ότι η τιμή που έχει οριστεί έχει νόημα. Ή, ίσως πιο συχνά, δεν ορίζεται καθόλου ρυθμιστής. Οι άλλες μέθοδοι στη συνάρτηση κλάσης ρύθμισαν τη μεταβλητή του δείγματος πίσω από τον getter με κάποιο άλλο τρόπο.

Τώρα μπορούμε να προσθέσουμε ένα ηλικία και να εφαρμόσει σωστά ένα όνομα Χαρακτηριστικό. ο ηλικία attribute μπορεί να οριστεί στη μέθοδο του κατασκευαστή, να διαβάσει χρησιμοποιώντας το ηλικία getter αλλά χειρίζεται μόνο με τη χρήση του have_birthday μέθοδο, η οποία θα αυξήσει την ηλικία. ο όνομα το χαρακτηριστικό έχει ένα κανονικό getter, αλλά ο setter βεβαιώνεται ότι το όνομα κεφαλαιοποιείται και έχει τη μορφή Ονομα επίθετο.

instagram story viewer