PHP objects and public/private methods

Theodore Lytras thlytras at gmail.com
Tue Sep 4 18:42:06 EEST 2007


Στις Τρίτη 04 Σεπτέμβριος 2007 16:59, ο/η Giorgos Keramidas έγραψε:
>     * object interface
>
>     * public/protected methods/data
>
> Δύο unrelated objects μπορούν άνετα να στέλνουν "messages" το ένα στο
> άλλο, μέσω ενός καλά ορισμένου "interface".

Έψαξα λίγο την έννοια του interface ανατρέχοντας στη wikipedia και στην 
τεκμηρίωση της PHP (http://de.php.net/manual/en/language.oop5.interfaces.php) 
αλλά να πω την αλήθεια δεν μπόρεσα να πολυκαταλάβω ποιά η πρακτική 
χρησιμότητα του πράγματος αυτού. Δηλαδή ουσιαστικά δεσμεύεις τις κλάσεις σου 
να έχουν συγκεκριμένες μεθόδους. Ποιός ο λόγος να το κάνεις αυτό? Απλώς για 
να δείχνει όμορφος ο κώδικας? (Συγνώμη αν ακούγονται αφελή αυτά, αλλά όπως 
είπα πριν είμαι ερασιτέχνης στον προγραμματισμό).

Επίσης δε καταλαβαίνω ποιά η διαφορά ενός object interface από μια abstract 
class (http://www.php.net/manual/en/language.oop5.abstract.php), εκτός του 
οτι η abstract class αφορά μόνο απογόνους της και όχι άσχετες κλάσεις, και 
οτι μια κλάση δεν μπορεί να κληρονομεί από 2 abstract classes (απ'όσο θυμάμαι 
δεν έχουμε πολλαπλή κληρονομικότητα στην PHP). Υπάρχει κάτι άλλο?

Κάποια καλή παραπομπή που να τα εξηγεί αυτά? (Γιατί φοβούμαι οτι οι ερωτήσεις 
μου αρχίζουν να θυμίζουν απορίες φοιτητή προς τον καθηγητή του...)

> > Αυτό περιγράφει και το δικό μου πρόβλημα. Ας επεκταθώ λίγο
> > περισσότερο: έχω μια κλάση που ας την ονομάσουμε MyGroup, και μια άλλη
> > που θα την πούμε MyElement.  Κάθε αντικείμενο MyGroup έχει ως
> > properties του είτε αντικείμενα MyElement, είτε άλλα αντικείμενα
> > MyGroup, κατά τρόπο ώστε να προκύπτει μια δενδροειδής δομή.
> >
> > Η μέθοδος που θέλω να φτιάξω ανήκει στην κλάση MyGroup και στόχος της
> > είναι να διατρέξει ένα αρχείο xml και να φτιάξει την αντίστοιχη
> > δενδροειδή δομή αντικειμένων.  Αυτή με τη σειρά της καλεί μια δεύτερη
> > μέθοδο στην κλάση MyElement η οποία δέχεται έναν κόμβο του XML αρχείου
> > και φτιάχνει το αντίστοιχο αντικείμενο.  Σωστά δεν ακούγεται ως εδώ?
> >
> > Το θέμα όμως είναι οτι η δεύτερη μέθοδος (στην κλάση MyElement) δεν
> > έχει νόημα να κληθεί παρά μόνο από την πρώτη μέθοδο (της κλάσης
> > MyGroup).  Οι δύο κλάσεις δεν έχουν συγγενική σχέση.
>
> Το MyElement class μπορεί άνετα να έχει μια function με όνομα:
>
>     MyElement->cloneXMLNode();
>
> Αυτή η μέθοδος μπορεί να θεωρηθεί "μέρος του XML interface ενός
> MyElement object".  Το γεγονός ότι σήμερα δε μπορείς να σκεφτείς κάποια
> άλλη χρήση της MyElement::cloneXMLNode() πέρα από την κλήση που
> προέρχεται από το MyGroup class, δεν σημαίνει κάτι.  Το "XML interface
> των MyElement objects" θα εξακολουθήσει να είναι "XML interface των
> MyElement objects" ακόμα κι αν αργότερα φτιάξεις ένα διαφορετικό
> "container class" από το MyGroup.

Νομίζω παρέλειψα την πιο κρίσιμη λεπτομέρεια του προβλήματος: ο χρήστης δεν 
θέλω να απασχολείται με το interface των MyElement objects, ούτε των 
ενδιάμεσων container objects, παρά μόνο του αρχικού container object. Για να 
το πω σωστά, το "κυρίως" πρόγραμμα θα πρέπει να καλεί τις μεθόδους μόνο της 
ρίζας της δενδροειδούς δομής. Ούτε των διακλαδώσεων, ούτε των φύλλων. Ο 
χρήστης βλέπει μόνο το δέντρο, όχι τα κλαδιά και τα φύλλα του.

Υποθέτω όμως οτι δεν υπάρχει τρόπος να βάλω τέτοιους περιορισμούς, άρα οι 
μέθοδοι αυτές (των κλαδιών και των φύλλων) θα παραμείνουν public...

> http://en.wikipedia.org/wiki/Composite_pattern
> http://en.wikipedia.org/wiki/Aggregate_pattern
> http://en.wikipedia.org/wiki/Collection_%28computing%29
> http://en.wikipedia.org/wiki/Collection_class

Πολύ ενδιαφέροντα links! Ευχαριστώ!

Θοδωρής

-- 
"Beauty is transitory"
"Beauty survives"
        - Mr. Spock & Capt. Kirk, "That which survives", stardate unknown
by Theodore Lytras <aspirin at myrealbox.com>




More information about the Linux-greek-users mailing list