Πώς θα αποκτήσετε πρόσβαση σε ιδιότητες αντικειμένου μέσα από μια μέθοδο αντικειμένου;

ψήφοι
81

Τι είναι η «καθαρεύουσα» ή «σωστό» τρόπο για να αποκτήσετε πρόσβαση σε ιδιότητες ενός αντικειμένου μέσα από μια μέθοδο αντικείμενο που δεν είναι μια μέθοδος κτήτορας / setter;

Ξέρω ότι εκτός του αντικειμένου θα πρέπει να χρησιμοποιήσετε ένα συλλέκτη / setter, αλλά από μέσα θα κάνετε ακριβώς:

Ιάβα:

String property = this.property;

PHP:

$property = $this->property;

ή θα το κάνετε:

Ιάβα:

String property = this.getProperty();

PHP:

$property = $this->getProperty();

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

ΕΠΕΞΕΡΓΑΣΙΑ:

Φαίνεται ότι οι άνθρωποι αναλαμβάνουν μιλάω για ιδιωτική ή προστατευόμενη μεταβλητές / μόνο ιδιότητες. Όταν έμαθα OO διδάχτηκα να χρησιμοποιήσετε κτήτορες / setters για κάθε ακίνητο, ακόμη και αν ήταν δημόσια (και μάλιστα μου είπαν να μην κάνει καμία μεταβλητή / δημόσια περιουσία). Έτσι, μπορεί να ξεκινάμε από μια εσφαλμένη υπόθεση από το να πάει. Φαίνεται ότι οι άνθρωποι απάντηση στο ερώτημα αυτό είναι ίσως λέγοντας ότι θα πρέπει να έχετε δημοσίων ακινήτων και ότι εκείνες δεν χρειάζονται getters και setters, η οποία έρχεται σε αντίθεση με αυτό που δίδαξε, και τι μιλούσα για, αν και ίσως αυτό θα πρέπει να συζητηθεί ως Καλά. Αυτό είναι πιθανώς ένα καλό θέμα για ένα άλλο ζήτημα αν ...

Δημοσιεύθηκε 01/08/2008 στις 17:10
πηγή χρήστη
Σε άλλες γλώσσες...                            


18 απαντήσεις

ψήφοι
58

Αυτό έχει θρησκευτικό πόλεμο δυναμικό, αλλά μου φαίνεται ότι αν χρησιμοποιείτε μια κτήτορας / setter, θα πρέπει να το χρησιμοποιήσετε στο εσωτερικό, καθώς και - χρησιμοποιώντας τόσο θα οδηγήσει σε προβλήματα συντήρησης κάτω από το δρόμο (π.χ. κάποιος προσθέτει κώδικα σε ένα setter που χρειάζεται να εκτελείται κάθε φορά που ιδιότητα έχει οριστεί, και η ιδιότητα, η οποία προβλέπεται εσωτερικώς w / o εν λόγω setter που καλείται).

Απαντήθηκε 01/08/2008 στις 17:13
πηγή χρήστη

ψήφοι
18

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

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

Απαντήθηκε 01/08/2008 στις 17:19
πηγή χρήστη

ψήφοι
12

Είμαι ακριβώς πρόκειται θάλασσα εδώ;

Ισως ;)

Μια άλλη προσέγγιση θα ήταν να χρησιμοποιήσει ένα ιδιωτικό / προστατευμένη μέθοδος για να γίνει πραγματικότητα το πάρει (caching / db / κλπ), και ένα δημόσιο περιτύλιγμα για αυτό που αυξάνει την καταμέτρηση:

PHP:

public function getName() {
    $this->incrementNameCalled();
    return $this->_getName();
}

protected function _getName() {
    return $this->name;
}

και στη συνέχεια μέσα από το ίδιο το αντικείμενο:

PHP:

$name = $this->_getName();

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

Απαντήθηκε 01/08/2008 στις 17:43
πηγή χρήστη

ψήφοι
5

Λοιπόν, φαίνεται ότι με την προεπιλεγμένη εφαρμογή C # 3.0 ιδιότητες, η απόφαση λαμβάνεται για σας? Θα πρέπει να ορίσετε την ιδιότητα χρησιμοποιώντας την (ενδεχομένως ιδιωτικών) setter ιδιοκτησίας.

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

Απαντήθηκε 01/08/2008 στις 17:56
πηγή χρήστη

ψήφοι
4

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

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

Απαντήθηκε 01/08/2008 στις 18:01
πηγή χρήστη

ψήφοι
41

Προσωπικά, νιώθω σαν να είναι σημαντικό να διατηρηθεί η συνοχή. Αν έχετε getters και setters, τα χρησιμοποιούν. Η μόνη φορά που θα έχετε άμεση πρόσβαση σ