Τεχνολογίες Υλοποίησης Αλγορίθµων

Σχετικά έγγραφα
Τεχνολογίες Υλοποίησης Αλγορίθµων

2.1 Αντικειµενοστρεφής προγραµµατισµός

Οντοκεντρικός Προγραμματισμός

Προγραμματισμός Ι. Εισαγωγή στην C++ Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Εισαγωγή σε αντικειμενοστραφή concepts. Και λίγη C#

ΚΑΤΑΣΚΕΥΑΣΤΕΣ ΑΝΤΙΓΡΑΦΗΣ

Δομές Δεδομένων & Αλγόριθμοι

14η ιάλεξη. Προχωρημένα θέματα σχεδίασης

Σύνθεση και Κληρονομικότητα

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

Οντοκεντρικός Προγραμματισμός

Σύνθεση και Κληρονομικότητα

Περιεχόµενα. 1 Εισαγωγή στις οµές εδοµένων 3. 2 Στοίβα (Stack) 5

Διαγράμματα Κλάσεων στη Σχεδίαση

Προγραμματισμός Ι. Κλάσεις και Αντικείμενα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Τεχνολογίες Υλοποίησης Αλγορίθµων

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

Αναζήτηση και ταξινόμηση

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

02 Αντικειμενοστρεφής Προγραμματισμός

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Κλάσεις.

Βασικά της γλώσσας JAVA

Προγραμματισμός Υπολογιστών με C++

Οντοκεντρικός Προγραμματισμός

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

Στοίβες - Ουρές. Στοίβα (stack) Γιάννης Θεοδωρίδης, Νίκος Πελέκης, Άγγελος Πικράκης Τµήµα Πληροφορικής

ΑΡΦΕ ΑΝΣΙΚΕΙΜΕΝΟΣΡΕΥΟΤ ΠΡΟΓΡΑΜΜΑΣΙΜΟΤ. Ιωάννης Φατζηλυγερούδης Αναπληρωτής Καθηγητής Τμήμα Μηχ/κών Η/Υ και Πληροφορικής Πανεπιστήμιο Πατρών

public void printstatement() { System.out.println("Employee: " + name + " with salary: " + salary);

Αντικειμενοστρέφεια. Henri Matisse, Harmony in Red, Κωστής Σαγώνας Νίκος Παπασπύρου

Προγραμματισμός Υπολογιστών με C++ Φύλλο Διαγωνίσματος Ακαδημαϊκό εξάμηνο: Χειμερινό

METROPOLIS. Ένα περιβάλλον σχεδιασμού για ετερογενή συστήματα

Οδηγίες Συγγραφής και Αξιολόγησης Εργασιών του μαθήματος

Μεταγλώττιση και σύνδεση πολλαπλών αρχείων κώδικα. Προγραμματισμός II 1

Οντοκεντρικός Προγραμματισμός

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΕΙΡΑΙΩΣ ΣΧΟΛΗ ΤΕΧΝΟΛΟΓΙΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΩΝ ΤΜΗΜΑ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ «ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ»

Εργαστήριο 02: Προγραμματισμός με Γενικούς Τύπους (JAVA Generics) ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι

Εισαγωγή στον Αντικειμενοστρέφή Προγραμματισμό Διάλεξη #13

Ενότητες στην C Τεχνική Υλοποίησης Αφαιρετικών Τύπων Δεδομένων στην C

ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡ/ΣΜΟΣ C++

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου 7 η Διάλεξη: Σύντομη εισαγωγή στην Java

Κλάσεις και Αντικείµενα

Δοµές Δεδοµένων. 6η Διάλεξη Αναδροµικές Εξισώσεις και Αφηρηµένοι Τύποι Δεδοµένων. Ε. Μαρκάκης

Ασκηση 1 [ ] Παράδοση : Τετάρτη , 13:00

ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ Αξιολόγηση των Σχεδιαστικών Προτύπων και της Ποιότητας του Λογισμικού μέσω Μετρικών, στις Περιπτώσεις Προσθήκης Λειτουργικότητας και

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Αντικειµενοστραφής Προγραµµατισµός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

Παύλος Εφραιµίδης. Java. Κληρονοµικότητα

Δομές Δεδομένων Boost C++ Libraries. 23/3/2017 ΜΠΟΜΠΟΤΑΣ ΑΓΟΡΑΚΗΣ

Οντοκεντρικός Προγραμματισμός

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1

ΕΞΕΤΑΣΤΕΑ ΥΛΗ (SYLLABUS) ADVANCED αντικειμενοστραφής προγραμματισμός ΕΚΔΟΣΗ 1.0. Σόλωνος 108,Τηλ Φαξ

Το πρόγραμμα HelloWorld.java. HelloWorld. Κλάσεις και Αντικείμενα (2) Ορισμός μιας Κλάσης (1) Παύλος Εφραιμίδης pefraimi <at> ee.duth.

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

Τεχνολογίες Υλοποίησης Αλγορίθµων

Τεχνολογίες Υλοποίησης Αλγορίθµων

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 17/1/08

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

ΑΦAΙΡΕΤΙΚΟΣ (ή ΑΦΗΡΗΜΕΝΟΣ) ΤΥΠΟΣ ΔΕΔΟΜΕΝΩΝ (ΑΤΔ) (Abstract Data Type-ADT) - σύνολο δεδομένων (data, objects) - σύνολο πράξεων στα δεδομένα

Αρχές Τεχνολογίας Λογισμικού Εργαστήριο

Θέµατα εξετάσεων µε απαντήσεις

Βασικές Έννοιες Δοµών Δεδοµένων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πολυμορφισμός Αφηρημένες κλάσεις Interfaces (διεπαφές)

Υλοποίηση Λιστών. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα:

Μ.Π.Σ. «ΠΡΟΗΓΜΕΝΕΣ ΜΕΘΟΔΟΙ ΚΑΤΑΣΚΕΥΗΣ ΠΡΟΙΟΝΤΩΝ ΑΠΟ ΞΥΛΟ» Μάθημα: Σχεδίαση και Εφαρμογές Διαδραστικών Συστημάτων. Διδάσκοντας: Α.

Τεχνολογίες Υλοποίησης Αλγορίθµων

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 8 & 9 18/10/07

Wrapper Classes, Abstract Classes and Interfaces

ΠΟΛΥΜΟΡΦΙΣΜΟΣ. 4.1 Κληρονομικότητα και Αρχή της Υποκατάστασης

Δομές Δεδομένων & Ανάλυση Αλγορίθμων. 3ο Εξάμηνο. Ουρά (Queue) Υλοποίηση της με τη βοήθεια πίνακα.

Δομές Δεδομένων (Data Structures)

Τεχνολογίες Υλοποίησης Αλγορίθµων

. Μεθοδολογία Προγραμματισμού. Μοτίβα σχεδίασης (Design Patterns) Νικόλαος Πεταλίδης. Εισαγωγή Εαρινό Εξάμηνο 2014

Εργαστήριο Java. Διδάσκουσα: Εργαστηριακοί Συνεργάτες:

Sheet2. - Άσκηση 1 οκ - Άσκηση 2 οκ. Σκέψου πώς θα µπορούσες να την

ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ ΘΕΜΑ: «Σχεδιασμός και ανάπτυξη ιστοσελίδων ηλεκτρονικής εκπαίδευσης (e learning) σε θέματα αντικειμενοστραφή προγραμματισμού.

ΤΥΠΟΣ ΔΕΔΟΜΕΝΩΝ (ΑΤΔ) (Abstract Data Type-ADT)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Αντικειμενοστραφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

Τεχνολογίες Υλοποίησης Αλγορίθµων

Από τη UML στον Κώδικα. Μέρος Β

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα

Κατ οίκον Εργασία 5 Σκελετοί Λύσεων

Ανάπτυξη Plugins για το AgentSheets

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 4 : CLASSES

. Μεθοδολογία Προγραμματισμού. Abstract Κλάσεις και Interfaces. Νικόλαος Πεταλίδης. Εισαγωγή Εαρινό Εξάμηνο 2014

Κληρονομικότητα. Παύλος Εφραιμίδης pefraimi <at> ee.duth.gr. Java Κληρονομικότητα 1

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 6/12/07

Μεταγλωττιστές. Σημασιολογική Ανάλυση. Εργαστήριο 9. Διδάσκοντες: Δρ. Γεώργιος Δημητρίου Δρ. Άχμεντ Μάχντι

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΜΑΘΗΜΑ: Αντικειμενοστρεφής Προγραμματισμός

Διάλεξη 12: Λίστες Υλοποίηση & Εφαρμογές. Διδάσκων: Παναγιώτης Ανδρέου

Θέματα Προγραμματισμού Η/Υ

Τεχνολογίες Υλοποίησης Αλγορίθµων

Boost - Boost Graph Library C++ library

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων

Transcript:

Τεχνολογίες Υλοποίησης Αλγορίθµων Χρήστος Ζαρολιάγκης Καθηγητής Τµήµα Μηχ/κων Η/Υ & Πληροφορικής Πανεπιστήµιο Πατρών email: zaro@ceid.upatras.gr Γρηγόρης Πράσινος Υποψήφιος ιδάκτωρ Τµήµα Μηχ/κων Η/Υ & Πληροφορικής Πανεπιστήµιο Πατρών Σχεδίαση κλάσεων βασισµένη σε πολιτικές (Policy based class design) 1 / 19

Σχεδιασµός κλάσεων: το πρόβληµα Κάθε σχεδιαστικό πρόβληµα αναλύεται σε υποπροβλήµατα. Για κάθε υποπρόβληµα είναι δυνατόν να υπάρχουν πολλές διαφορετικές απαντήσεις (ενδεχοµένως και µε διαφορετική πολυπλοκότητα). Η δυσκολία έγκειται στο σχεδιασµό κλάσεων που να εµπεριέχουν ήδη κάποιες σχεδιαστικές αποφάσεις αλλά και που να είναι αρκετά ευέλικτες ώστε να µπορούν να προσαρµοστούν στις ανάγκες των χρηστών. 2 / 19

Πιθανή λύση 1: Υλοποίηση όλων των επιλογών σε µία κλάση Η προσέγγιση δεν δουλεύει γιατί: Σε πολλές περιπτώσεις απλά δεν είναι δυνατή µια τέτοια υλοποίηση. ηµιουργούνται µεγάλες κλάσεις που είναι δύσκολο να χρησιµοποιηθούν, να τροποποιηθούν και να υλοποιηθούν αποδοτικά. Χάνεται η ασφάλεια τύπων (type safety): δεν είναι δυνατόν να εξασφαλιστεί η χρήση ορισµένων σχεδιαστικών αποφάσεων. 3 / 19

Πιθανή λύση 2: Πολλές µικρές κλάσεις Η προσέγγιση δεν δουλεύει γιατί: Απαιτεί τη δηµιουργία πολλών κλάσεων (για κάθε δυνατό συνδυασµό!) Είναι πολύ δύσκολο να τροποποιηθούν. 4 / 19

Πιθανή λύση 3: Πολλαπλή κληρονοµικότητα Κατασκευάζονται πολλές µικρές κλάσεις οι οποίες συνδυάζονται µε πολλαπλή κληρονοµικότητα για τη δηµιουργία µίας σύνθετης. Η προσέγγιση αυτή είναι πολλές ϕορές ικανοποιητική, αλλά: εν προσφέρει πάντα έναν καθορισµένο τρόπο για την κατασκευή των σύνθετων κλάσεων. Πολλές ϕορές λειτουργεί δύσκολα γιατί οι κλάσεις χρειάζεται να γνωρίζουν πληροφορία που παρέχεται από κάποια κλάση. 5 / 19

Πιθανή λύση 4: Χρήση αρχετύπων Η υπό σχεδιασµό κλάση κατασκευάζεται σαν template class και η προσαρµογή της γίνεται µέσω partial/full specialization των µεθόδων ή της ίδιας της κλάσης. Η προσέγγιση αυτή αποδίδει κάποια πλεονεκτήµατα: Είναι αρκετά ευέλικτη. Προσφέρει τη δυνατότητα ύπαρξης προκαθορισµένων τιµών Εχει όµως και µειονεκτήµατα: εν είναι δυνατόν να γίνει προσαρµογή της δοµής της κλάσης παρά µόνο των µεθόδων της. Υπάρχουν όρια της γλώσσας στην εφαρµογή partial/full template specialization (π.χ. δεν επιτρέπεται η εξειδίκευση µίας µόνο µεθόδου σε µια κλάση µε περισσότερα του ενός template parameters). εν επιτρέπει την ύπαρξη περισσότερων της µίας προκαθορισµένων τιµών. 6 / 19

Λύση: Σχεδιασµός ϐασισµένος σε πολιτικές Η ϐασική ιδέα είναι η ανάλυση της υπό σχεδιασµό κλάσης σε πολιτικές (policies), δηλαδή σε σηµεία στα οποία απαιτείται η λήψη µίας απόφασης. Κάθε πολιτική είναι µία περιγραφή της διασύνδεσης (interface) που απαιτεί η υπό σχεδιασµό κλάση και περιλαµβάνει τον ορισµό µεθόδων, πεδίων και εσωτερικών τύπων. Η περιγραφή της πολιτικής δεν απαιτείται να είναι εντελώς αυστηρή. 7 / 19

Σχεδιασµός ϐασισµένος σε πολιτικές - παράδειγµα Ως παράδειγµα, στην κλάση Array µία πολιτική είναι ο έλεγχος των ορίων του αριθµοδείκτη. Η πολιτική σε αυτήν την περίπτωση µπορεί να ορίζει ότι πρέπει να υπάρχει µία µέθοδος: bool checkindex(int i, int low, int high); Προφανώς κάθε κλάση µπορεί να διαχωριστεί σε πολιτικές µε διαφορετικούς τρόπους. Στο συγκεκριµένο παράδειγµα µια άλλη περιγραφή της πολιτικής ϑα ήταν ότι η κλάση πολιτικής πρέπει να έχει πεδία για τα όρια του αριθµοδείκτη. Ο σχεδιαστής της κλάσης αποφασίζει για το διαχωρισµό και καθορίζει τις πολιτικές. 8 / 19

Κλάσεις πολιτικής Για κάθε πολιτική µπορούν να παρέχονται πολλές διαφορετικές υλοποιήσεις, µε διαφορετικά πλεονεκτήµατα και µειονεκτήµατα. Κάθε υλοποίηση ονοµάζεται κλάση πολιτικής (policy class). Για το παράδειγµα του Array µπορούν να υλοποιηθούν δύο κλάσεις πολιτικής, ανάλογα µε το αν γίνεται έλεγχος των ορίων ή όχι : struct RangeCheck { static bool checkindex(int i, int low, int high) { return i <= high && i >= low; } }; struct NoRangeCheck { static bool checkindex(int i, int low, int high) { return true; } }; 9 / 19

Συνδυασµός των κλάσεων πολιτικής Οι κλάσεις πολιτικής κατασκευάζονται έτσι ώστε να χρησιµοποιούνται για την δηµιουργία πιο σύνθετων κλάσεων. Η υπό σχεδιασµό κλάση ορίζει τον τρόπο µε τον οποίο συνδυάζονται και χρησιµοποιούνται οι κλάσεις πολιτικής. Η κλάση που δηµιουργείται ονοµάζεται host class. Η host class περιέχει κλάσεις πολιτικής ή κληρονοµεί από αυτές: template<typename Element, typename RangeChecker> class Array : public RangeChecker {... }; Ο χρήστης της κλάσης αρκεί να δώσει σαν παράµετρο την κλάση πολιτικής που επιθυµεί: Array<int, NoRangeCheck> myarray(10); myarray[5] = 10;... 10 / 19

Λειτουργία των κλάσεων πολιτικής Η host class αναθέτει στις εκάστοτε κλάσεις πολιτικής κάποιες από τις λειτουργίες της: template<typename Element, typename RangeChecker> class Array : public RangeChecker { public: Element &operator[](int i) { if (checkindex(i, low, high)) return _ia[i]; else throw OutOfRangeEx; } private: int low; int high; }; 11 / 19

Προεπιλεγµένα ορίσµατα Ο σχεδιαστής της κλάσης µπορεί να παρέχει προεπιλεγµένα ορίσµατα για την ευκολία των χρηστών: template<typename Element, typename RangeChecker = NoRangeCheck> class Array : public RangeChecker {... }; Array<int> myarray; // myarray does not have // range checking 12 / 19

Συνδυασµός των κλάσεων πολιτικής Η πραγµατική δύναµη της τεχνικής των κλάσεων πολιτικής γίνεται ϕανερή όταν συνδυάζονται για την κατασκευή πολύπλοκων κλάσεων. Τότε ο χρήστης µπορεί να απαιτήσει συγκεκριµένη συµπεριφορά επιλέγοντας τις κατάλληλες κλάσεις πολιτικής. Εστω π.χ. ότι η κλάση Array έχει µία δεύτερη πολιτική που ορίζει τον τρόπο µε τον οποίο γίνεται η ταξινόµηση των στοιχείων του πίνακα: template<typename Element, typename RangeChecker, typename Sorter> class Array : public RangeChecker, public Sorter {... }; Πιθανές υλοποιήσεις είναι οι κλάσεις NoSort, InsertionSorter, κτλ. Array<int, NoRangeCheck, InsertionSorter> myarray; 13 / 19

Εµπλουτισµένες κλάσεις πολιτικής Οι κλάσεις πολιτικής δεν είναι ανάγκη να ανταποκρίνονται πιστά στην περιγραφή της πολιτικής αλλά µπορούν να παρέχουν και επιπλέον λειτουργίες όπου αυτές χρειάζονται. Καθώς η host class κληρονοµεί από τις κλάσεις πολιτικής οι επιπλέον λειτουργίες είναι διαθέσιµες µέσω αυτής. Αν ο χρήστης προσπαθήσει να χρησιµοποιήσει λειτουργία που δεν παρέχεται από την κλάση πολιτικής που έχει επιλέξει, παίρνει µήνυµα λάθους κατά τη µεταγλώττιση. 14 / 19

Συναρτήσεις κατάργησης και κλάσεις πολιτικής - 1 Καθώς η host class κληρονοµεί από τις κλάσεις πολιτικής είναι συντακτικά σωστό να µετατραπεί ένας δείκτης στην σύνθετη κλάση σε δείκτη σε κλάση πολιτικής. Αν γίνει κατάργηση της σύνθετης κλάσης µέσω αυτού του δείκτη, το αποτέλεσµα είναι απροσδιόριστο. Array<int, RangeCheck> myarray; RangeCheck *prc = &myarray; delete prc; 15 / 19

Συναρτήσεις κατάργησης και κλάσεις πολιτικής - 2 εν είναι σκόπιµο να δηλωθεί η συνάρτηση κατάργησης ως εικονική γιατί κάτι τέτοιο προσθέτει κόστος στην απόδοση. Το πρόβληµα ϑα λυνόταν µε τη χρήση ιδιωτικής κληρονοµικότητας (private inheritance) αντί για δηµόσιας (public) αλλά έτσι δεν ϑα ήταν δυνατή η χρήση εµπλουτισµένων πολιτικών (η ιδιωτική κληρονοµικότητα ϑα απέκρυπτε τις επιπλέον µεθόδους). Η λύση είναι να δηλωθεί η συνάρτηση κατάργησης ως protected: class RangeCheck {... protected: ~RangeCheck() { } } 16 / 19

Χρήση παραµετροποιηµένων αρχετύπων Αν κάποια πολιτική απαιτείται να είναι κι αυτή µία παραµετροποιηµένη κλάση η σύνταξη της δήλωσης της σύνθετης κλάσης γίνεται αρκετά πολύπλοκη. Εστω για παράδειγµα ότι η πολιτική του Array για την ταξινόµηση πρέπει να παραµετροποιείται µε τον τύπο του στοιχείου. Τότε ο χρήστης ϑα πρέπει να δηλώνει: Array<int, NoRangeCheck, InsertionSorter<int> > myarray; Ο χρήστης πρέπει να γράψει δύο ϕορές τον τύπο int. Αυτό µπορεί να αποφευχθεί µε χρήση παραµετροποιηµένων αρχετύπων (template template parameters). template<typename Element, typename RangeCheck, typename <typename Elem> Sorter > class Array: public RangeCheck, public Sorter<Element> {... }; 17 / 19

Χρήση παραµετροποιηµένων αρχετύπων Το όρισµα Element για το Sorter δεν χρησιµοποιείται, οπότε µπορεί να παραληφθεί: template<typename Element, typename RangeCheck, typename <typename> Sorter > class Array: public RangeCheck, public Sorter<Element> {... }; Ο χρήστης αρκεί πλέον να δηλώνει π.χ.: Array<int, NoRangeCheck, InsertionSorter> myarray; 18 / 19

Περισσότερες πληροφορίες Η τεχνική του σχεδιασµού µε πολιτικές έχει τα καλύτερα αποτελέσµατα όταν είναι δυνατός ο διαχωρισµός της λειτουργικότητας µιας κλάσης σε πολιτικές που είναι ανεξάρτητες µεταξύ τους. Ο σωστός τρόπος διαχωρισµού είναι προφανώς δύσκολη υπόθεση και απαιτεί σχετική εµπειρία. Η γλώσσα δεν παρέχει προς το παρόν έναν τρόπο για αυστηρή περιγραφή των κλάσεων πολιτικής. Με την ενσωµάτωση των concepts στο νέο πρότυπο της C++ ϑα υπάρχει δυνατότητα τέτοιας αυστηρής περιγραφής. Υπάρχει συνάφεια του policy-based design µε το strategy design pattern. Η τεχνική αναλύεται στο ϐιβλίο του Andrei Alexandrescu, Modern C++ Design: Generic Programming and Design Patterns Applied (Addison Wesley, 2001). 19 / 19