Αντικειμενοστρέφεια και Πρότυπα (Patterns)

Posted by Χρίστος Ευαγγέλου Mon, 01 Mar 2004 15:37:29 EET

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

Τα πρότυπα λογισμικού (software patterns) είναι ένας τρόπος με τον οποίο μπορείς να χρησιμοποιήσεις την αντικειμενοστρέφεια αποτελεσματικά, βασισμένος στην πείρα και τις εμπειρίες των τεχνολόγων λογισμικού οι οποίες συσσωρεύονται κατά την πάροδο του χρόνου. Είναι, στην ουσία, κοινές και σφυρηλατημένες πρακτικές τις οποίες οι τεχνολόγοι λογισμικού ακολουθούν, για την επίλυση συχνά επαναλαμβανόμενων προβλημάτων.

Ο Christopher Alexander (διάσημος αλλά όχι και πολύ δημοφιλής αρχιτέκτονας), παρουσίασε για πρώτη φόρα την ιδέα των προτύπων με εφαρμογές στην αρχιτεκτονική. Αναφερόμενος σε αυτά λέει:

"Each pattern describes a problem which occurs over and over again in our environment, and then describes the core of the solution to that problem, in such a way that you can use this solution a million times over, without ever doing it the same way twice."

Η μεγαλύτερη συμβολή στον κόσμο των προτύπων, ήταν η για πρώτη φόρα απόπειρα καταγραφής και ονοματολογίας τους, στο βιβλίο "Design Patterns: Elements of Reusable Object-Oriented Software" (βλ. τέλος δημοσίευσης). Η απόπειρα αυτή κατέστησε δυνατή την ευκολότερη επικοινωνία και ανταλλαγή γνώσης μεταξύ των τεχνολόγων και ομάδων ανάπτυξης λογισμικού. Έχετε, πιθανότατα, χρησιμοποιήσει πρότυπα αρκετές φορές χωρίς να το γνωρίζετε. Για παράδειγμα, ο τρόπος ονοματολογίας μεθόδων στην Java (μικρό αρχικό γράμμα, κεφαλαίο το πρώτο γράμμα συστατικών λέξεων) είναι ένα πρότυπο.

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

_Παράδειγμα 1_

Πρόβλημα: Πώς προσαρτείς επιπρόσθετες υπευθυνότητες σε ένα αντικείμενο δυναμικά, χωρίς να τροποποιήσεις την κλάση του; Π.χ. πως προσθέτεις ένα Scroll Bar σε ένα γραφικό αντικείμενο χωρίς να αλλάξεις την κλάση του;

Λύση/πρότυπο: Περιτυλίγοντας το αντικείμενο σε μια κλάση - Decorator (γνωστή και ως Wrapper). Π.χ. περιτυλίγοντας ένα TextField σε ένα ScrollPane στην Java.

_Παράδειγμα 2_

Πρόβλημα: Πως ονομάζεις μια καινούργια κλάση η οποία κληρονομεί από μια άλλη;

Λύση/πρότυπο (στην SmallTalk): Υπάρχουν δύο περιπτώσεις:

  • Αν υπάρχει μια ευρέως χρησιμοποιούμενη λέξη η οποία περιγράφει ακριβώς τι κάνει η κλάση, χρησιμοποίησε την λέξη αυτή (π.χ. η Set, η οποία κληρονομεί από την Collection. Όλος ο κόσμος ξέρει τι είναι ένα σύνολο και τι ιδιότητες έχει).
  • Αν δεν υπάρχει μια κοινώς χρησιμοποιούμενη περιγραφική λέξη, ονόμασε την κλάση επικολλώντας ένα επίθετο στο όνομα της υπερ-κλάσης. Το επίθετο πρέπει να περιγράφει πως η κλάση διαφοροποιείται από την υπερ-κλάση της (π.χ. η SortedCollection, η οποία κληρονομεί από την Collection).

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

Για περισσότερες πληροφορίες:

1. "Design Patterns: Elements of Reusable Object-Oriented Software", Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides (Addison-Wesley), ISBN 0-201-63361-2

2. Google (ψάξτε για Software Patterns)

3. http://wiki.cs.uiuc.edu/cs497rej

[Τελευταία τροποποίηση 02 Μαρτίου 2004, GMT-6]

1 comments

    Reader's Comments

  1. Χρίστο, δεν θα έλεγα ότι ο Christopher Alexander δεν είναι διάσημος —δημοφιλής σε κάποιους κύκλους μπορεί να μην είναι αλλά διάσημος είναι. Πρόκειται για τον άνθρωπο που τιμήθηκε με το πρώτο μετάλλιο αρχιτεκτονικής. Ωστόσο, το σημαντικότερο έργο του είναι τα βιβλία του στις ούτω καλούμενες Γλώσσες Πρότυπων (τα συνιστώ ανεπιφύλακτα όλα). Αν δεν με απατά η μνήμη μου, για την συγγραφή αυτών των βιβλίων αφιέρωσε κάτι λιγότερο από δέκα χρόνια για το καθένα.

    Ήταν ο πρώτος που μελέτησε επαναλαμβανόμενα πρότυπα σε κοινότητες, πόλεις, κλπ. Μέσα από τα γραπτά του επηρέασε το γνωστό κουαρτέτο (GOF - Gang of Four) που πρότεινε την χρήση των προτύπων σχεδίασης στην τεχνολογία λογισμικού που αναφέρεις πιο πάνω.

    -- Νεόφυτος Δημητρίου ~k2pts, March 01, 2004