Σημερινή παρουσίαση

107
2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 1 ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ Λεπτομερής Σχεδίαση (2/2) Μανόλης Γιακουμάκης αναπληρωτής καθηγητής ΟΠΑ

description

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ Λεπτομερής Σχεδίαση (2/2) Μανόλης Γιακουμάκης αναπληρωτής καθηγητής ΟΠΑ. Σημερινή παρουσίαση. Από το σχέδιο στον κώδικα Κλάσεις Απλοί τύποι Συσχετίσεις Κληρονομικότητα και διεπαφές Διαγράμματα ακολουθίας - PowerPoint PPT Presentation

Transcript of Σημερινή παρουσίαση

Page 1: Σημερινή παρουσίαση

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 1

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ

Λεπτομερής Σχεδίαση(2/2)

Μανόλης Γιακουμάκηςαναπληρωτής καθηγητής ΟΠΑ

Page 2: Σημερινή παρουσίαση

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 2

Σημερινή παρουσίαση• Από το σχέδιο στον κώδικα

– Κλάσεις– Απλοί τύποι– Συσχετίσεις– Κληρονομικότητα και διεπαφές– Διαγράμματα ακολουθίας

• Συστάσεις αντικειμενοστρεφούς σχεδίασης– Σχεδίαση κλάσεων– Μεταβίβαση, κληρονομικότητα και πολυμορφισμός– Συνεργασία αντικειμένων– Σχεδίαση πακέτων

Page 3: Σημερινή παρουσίαση

Από το σχέδιο στον κώδικα• Όταν ο σχεδιαστής του λογισμικού προσεγγίζει τη σχεδίαση των

βασικών δομικών μονάδων του λογισμικού, επικοινωνεί τις σχεδιαστικές του επιλογές στον προγραμματιστή.

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

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

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 3

Page 4: Σημερινή παρουσίαση

Κλάσειςpublic class Employee {

private static int lastEmpId ;protected int Id;private String firstName;private String lastName;public final int maxNumberOfPhones = 2;private String[] phoneNumbers = new String[maxNumberOfPhones];public String getFirstName() {}public void setFistName(String firstName) {}public String getLastName() {}public void setLastName(String lastName){}public void paySalary(Month month){}protected void calculateSalary(Month month) {}public static int nextEmployeeId(){}

}

2009 4ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης

Page 5: Σημερινή παρουσίαση

Κλάσεις

• Η υλοποίηση των κλάσεων, των ιδιοτήτων και των λειτουργιών της UML είναι σχεδόν αυτόματη διαδικασία. Οι κλάσεις της UML μετατρέπονται σε κλάσεις της Java, οι ιδιότητες γίνονται πεδία και οι λειτουργίες μέθοδοι.

• Ένα σημείο που χρήζει κάποιας προσοχής είναι οι ορατότητες της UML. Οι ορατότητες, όπως ορίζονται στη UML, έχουν όμοια αντιστοιχία με τις ορατότητες της Java με κάποιες λεπτές διαφορές. Για παράδειγμα η προστατευμένη (protected) ορατότητα της Java είναι ταυτόχρονα και ορατότητα πακέτου (package).

2009 5ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης

Page 6: Σημερινή παρουσίαση

Η έννοια της ισότητας των αντικειμένων τιμών στη Java

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 6

University a = new University();a.setName("AUEB");University b = a;

Page 7: Σημερινή παρουσίαση

Η έννοια της ισότητας των αντικειμένων τιμών στη Java

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 7

University a = new University();a.setName("AUEB");University b = new University();b.setName("AUEB”);

Page 8: Σημερινή παρουσίαση

Η έννοια της ισότητας των αντικειμένων τιμών στη Java

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 8

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

Page 9: Σημερινή παρουσίαση

Συσχετίσεις

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

2009 9ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης

Page 10: Σημερινή παρουσίαση

Μονόδρομες συσχετίσεις με πολλαπλότητα ένα

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 10

Ο κώδικας που αντιστοιχεί στο διάγραμμα είναι:public class Book {

private Publisher publisher;

public void setPublisher(Publisher publisher) {this.publisher = publisher;

}

public Publisher getPublisher() { return publisher; }}

Page 11: Σημερινή παρουσίαση

Μονόδρομες συσχετίσεις με πολλαπλότητα ένα

• Για να υλοποιήσουμε την απλή συσχέτιση όπου κάθε αντικείμενο της κλάσης Book γνωρίζει ένα αντικείμενο της κλάσης Publisher, δημιουργούμε ένα πεδίο publisher με τύπο Publisher εντός της κλάσης Book . Την ονομασία του πεδίου την πήραμε από το όνομα του άκρου της συσχέτισης του σχήματος 8-33.

• Η μέθοδος setPublisher ενημερώνει το πεδίο και η μέθοδος getPublisher το επιστρέφει

2009 11ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης

Page 12: Σημερινή παρουσίαση

Μονόδρομες συσχετίσεις με πολλαπλότητα πολλά

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 12

public class Book { private Set<Item> items = new HashSet<Item>(); public Set<Item> getItems(){ return items; }}

Page 13: Σημερινή παρουσίαση

Μονόδρομες συσχετίσεις με πολλαπλότητα πολλά

• Θα πρέπει επομένως να χρησιμοποιήσουμε μία συλλογή στην κλάση Book που θα περιέχει αναφορές προς τα συσχετιζόμενα αντικείμενα της κλάσης Item.

• Μία συλλογή που μπορεί να χρησιμοποιηθεί είναι τα σύνολα της Java. Για τα σύνολα η Java παρέχει τη διεπαφή Set και ορισμένες κλάσεις που την υλοποιούν, όπως οι κλάσεις HashSet και TreeSet.

2009 13ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης

Page 14: Σημερινή παρουσίαση

Η χρήση συλλογών για την υλοποίηση της πολλαπλότητας

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 14

Το σχήμα παρουσιάζει διαγραμματικά τη χρήση των συλλογών. Ένα αντικείμενο της κλάσης Book έχει την αναφορά items προς μία συλλογή. Αν και πολλέςφορές λέμε ότι μία συλλογή περιέχει αντικείμενα, στην πραγματικότητα περιέχειαναφορές προς αντικείμενα.

Page 15: Σημερινή παρουσίαση

Η χρήση συλλογών για την υλοποίηση της πολλαπλότητας

• Εφόσον η συλλογή items αρχικοποιείται σε συλλογή HashSet, θα ήταν λογικό να επιστρέφουμε HashSet και από την getItems(). Προτιμούμε όμως να επιστρέφουμε τη συλλογή ως τη διεπαφή Set και όχι την υλοποίηση που είναι η κλάση HashSet.

2009 15ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης

Page 16: Σημερινή παρουσίαση

Η χρήση συλλογών για την υλοποίηση της πολλαπλότητας

• Οι πελάτες της κλάσης Book δε γνωρίζουν την υλοποίηση της συλλογής των αντικειμένων, γνωρίζουν μόνο ότι η συλλογή είναι σύνολο.

• Η καλή πρακτική για το χειρισμό των συλλογών είναι να δημοσιεύονται στους πελάτες οι διεπαφές (π.χ. Set) και όχι οι κλάσεις που τις υλοποιούν (π.χ. HashSet). Αυτό γιατί οι υλοποιήσεις των συλλογών μπορεί να αλλάζουν, αλλά δε θέλουμε οι αλλαγές αυτές να επηρεάζουν τους πελάτες.

• Η υλοποίηση αυτή διευκολύνει ακόμα περισσότερο την αλλαγή της υλοποίησης της συλλογής items. Η αλλαγή στην αρχικοποίηση της συλλογής σε items = new TreeSet() δεν επηρεάζει τους πελάτες της κλάσης Book.

2009 16ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης

Page 17: Σημερινή παρουσίαση

Η χρήση συλλογών για την υλοποίηση της πολλαπλότητας

• Έτσι, όταν θέλουμε να χρησιμοποιήσουμε τη συλλογή items, θα έχουμε κάποιο κώδικα όπως:Book oneBook = new Book();Item oneItem = new Item();oneBook.getItems().add(oneItem);oneBook.getItems().remove(oneItem);

• Με το τμήμα του κώδικα παραπάνω, δημιουργούνται δύο αντικείμενα oneBook και oneItem. Εισάγουμε το αντικείμενο oneItem στη συλλογή items και αμέσως μετά το απομακρύνουμε από τη συλλογή.

2009 17ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης

Page 18: Σημερινή παρουσίαση

Η χρήση συλλογών για την υλοποίηση της πολλαπλότητας

• Σε αυτό το σημείο πρέπει να σημειώσουμε ότι δεν υπάρχει κάποια μέθοδος setItems στην κλάση Book, γιατί δε θέλουμε οι πελάτες να τροποποιούν απευθείας τη συλλογή, αλλά μόνο μέσω των μεθόδων εισαγωγής και διαγραφής αντικειμένων. Εάν υπήρχε, θα μπορούσε να υπάρξει ο κώδικας: oneBook.setItems(null);

• κώδικας που διαγράφει όλη τη συλλογή, κάτι που προφανώς δεν είναι επιθυμητό.

2009 18ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης

Page 19: Σημερινή παρουσίαση

Η χρήση συλλογών για την υλοποίηση της πολλαπλότητας

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

• Έτσι, στην κλάση Book προσθέτουμε τις δύο βοηθητικές μεθόδους παρακάτω:

public class Book {//…public void addItem(Item item) {if (item != null ) {items.add(item); } }public void removeItem(Item item) {if (item != null) {items.remove(item); } } }

2009 19ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης

Page 20: Σημερινή παρουσίαση

Η χρήση συλλογών για την υλοποίηση της πολλαπλότητας

• Οι βοηθητικές μέθοδοι μας βοηθούν, αλλά ο πελάτης εξακολουθεί να έχει πρόσβαση στη συλλογή μέσω του παρακάτω κώδικα:

Set<Item> myItems = oneBook.getItems()myItems.add(aSecondItem)

• Μπορεί επομένως ο πελάτης να προσθέσει απευθείας αντικείμενα στη συλλογή, χωρίς να χρησιμοποιήσει τις βοηθητικές μεθόδους. Θα επιθυμούσαμε επομένως να ενθυλακώσουμε πλήρως τη συλλογή και να εξαναγκάσουμε τους πελάτες της κλάσης Book να χρησιμοποιήσουν τις βοηθητικές μεθόδους addItem και removeItem.

• Η ενθυλάκωση αυτή γίνεται με την επιστροφή αντιγράφου της συλλογής και όχι την ίδια τη συλλογή. Αυτό επιτυγχάνεται με την τροποποίηση της μεθόδου getItems παρακάτω:

public Set<Item> getItems(){ return new HashSet<Item>(items); }

2009 20ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης

Page 21: Σημερινή παρουσίαση

Η χρήση συλλογών για την υλοποίηση της πολλαπλότητας

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

2009 21ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης

Page 22: Σημερινή παρουσίαση

Η χρήση συλλογών για την υλοποίηση της πολλαπλότητας

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 22

Page 23: Σημερινή παρουσίαση

Η χρήση συλλογών για την υλοποίηση της πολλαπλότητας

• Το σχήμα 8-36 παρουσιάζει την εικόνα ενός αντιγράφου της συλλογής. Εάν υποθέσουμε ότι έχουμε τον κώδικα:

Set<Item> myItems = oneBook.getItems();

τότε η συλλογή myItems είναι το αντίγραφο της συλλογής του αντικειμένου oneBook.

• Μέσω της συλλογής myItems έχουμε πρόσβαση σε όλα τα αντικείμενα και μπορούμε να αλλάξουμε την κατάστασή τους. Η πρόσθεση και η απομάκρυνση αντικειμένων γίνεται πλέον στο αντίγραφο της συλλογής και όχι στην αρχική. Για να γίνει πρόσθεση ή απομάκρυνση αντικειμένων στην αρχική συλλογή θα πρέπει να χρησιμοποιηθούν οι βοηθητικές μέθοδοι addItem και removeItem.

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 23

Page 24: Σημερινή παρουσίαση

Η χρήση συλλογών για την υλοποίηση της πολλαπλότητας

• Έστω για παράδειγμα ο κώδικας:

oneBook.addItem(oneItem);oneBook.getItems().add(secondItem);

• Η πρώτη γραμμή του κώδικα θα εισαγάγει το αντικείμενο oneItem στην (ενθυλακωμένη) συλλογή items. Η δεύτερη γραμμή όμως θα εισαγάγει το αντικείμενο secondItem σε αντίγραφο της συλλογής items. Η συλλογή items δε θα αλλάξει.

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 24

Page 25: Σημερινή παρουσίαση

Η χρήση συλλογών για την υλοποίηση της πολλαπλότητας

• Η τελική εικόνα της υλοποίησης γίνεται:public class Book {private Set<Item> items = new HashSet<Item>();

public Set<Item> getItems() {return new HashSet<Item>(items); }

public void addItem(Item item) {if (item != null ) {items.add(item); } }

public void removeItem(Item item) {if (item != null) {items.remove(item); } } }

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 25

Page 26: Σημερινή παρουσίαση

Αμφίδρομες Συσχετίσεις• Μία αμφίδρομη συσχέτιση υλοποιείται με δύο

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

• Μία αμφίδρομη συσχέτιση μεταξύ δύο κλάσεων σημαίνει αυτόματα ότι οι δύο κλάσεις είναι αμοιβαία εξαρτώμενες.

• Η σύζευξη των κλάσεων με αμφίδρομη συσχέτιση είναι υψηλότερη της σύζευξης με μονόδρομη. Οι αμφίδρομες συσχετίσεις δυσχεραίνουν και τη συντήρηση του λογισμικού.

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 26

Page 27: Σημερινή παρουσίαση

Αμφίδρομες Συσχετίσεις

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 27

public class Item {private Book book;public Book getBook() {return book; } }

public class Book {private Set<Item> items = new HashSet<Item>();public void addItem(Item item) {//…}public void removeItem(Item item) {//…}}

Page 28: Σημερινή παρουσίαση

Αμφίδρομες Συσχετίσεις

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 28

Page 29: Σημερινή παρουσίαση

Συσσωμάτωση• Η διαφορά μεταξύ της απλής συσχέτισης και της

συσσωμάτωσης είναι περισσότερο εννοιολογική. • Η Java δεν προσφέρει κάποια διάκριση μεταξύ της

απλής συσχέτισης και της συσσωμάτωσης. • Αν ο σχεδιαστής χρησιμοποιήσει τη συσσωμάτωση στη

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

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

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 29

Page 30: Σημερινή παρουσίαση

Συσσωμάτωση

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 30

public class Car {Engine engine;public void drive() throws CarException {if (engine == null ) {throw new CarException(); }// ο κώδικας της οδήγησης} }

Ο κώδικας υλοποίησης της συσσωμάτωσης δεν αλλάζει σε σχέση με τη συσχέτιση. Η συσσωμάτωση υλοποιείται ως ένα πεδίο τύπου Engine στην κλάση Car. Η διαφορά είναι στην υλοποίηση της μεθόδου drive. Δεν μπορούμε να οδηγήσουμε ένα αυτοκίνητο χωρίς τον κινητήρα του, οπότε η κλήση της μεθόδου drive, χωρίς να υπάρχει κινητήρας, δίδει (ρίχνει) εξαίρεση.

Page 31: Σημερινή παρουσίαση

Σύνθεση• Η σύνθεση είναι μία ιδιαίτερη περίπτωση της συσχέτισης

όλου / τμήματος, μόνο που συνοδεύεται με κάποιους περιορισμούς. Οι περιορισμοί είναι ότι το αντικείμενο τμήμα ανήκει αποκλειστικά σε ένα αντικείμενο όλο και ότι το αντικείμενο όλο διαχειρίζεται πλήρως τον κύκλο ζωής του αντικειμένου τμήμα.

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 31

Page 32: Σημερινή παρουσίαση

Σύνθεση

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 32

public class Borrower {private Address address = new Address();public void setStreet(String street) {address.setStreet(street);} public String getStreet() {return address.getStreet(); }public void setNumber(String number) {address.setNumber(number); }public String getNumber() {return address.getNumber(); }//Όλες οι μέθοδοι πρόσβασης της Address }

Page 33: Σημερινή παρουσίαση

Κληρονομικότητα και διεπαφές

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

• Η μεταφορά της κληρονομικότητας και της υλοποίησης των διεπαφών από τη UML στη Java είναι και πάλι σχεδόν αυτόματη. Η μεγαλύτερη ίσως ασυνέπεια μεταξύ της UML και της Java είναι ότι η Java δεν υποστηρίζει την πολλαπλή κληρονομικότητα.

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 33

Page 34: Σημερινή παρουσίαση

Κληρονομικότητα και διεπαφές

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 34

Page 35: Σημερινή παρουσίαση

Κληρονομικότητα και διεπαφές

• public interface Transport {public void move(); }

public interface Vehicle extends Transport { public void drive(); }

public abstract class AutoMobile implements Vehicle{public void drive() {// Η αφηρημένη κλάση AutoMobile υλοποιεί τη μέθοδο drive }public void move() {// Η αφηρημένη κλάση AutoMobile υλοποιεί τη μέθοδο move } }

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 35

Page 36: Σημερινή παρουσίαση

Κληρονομικότητα και διεπαφές

• public class Car extends AutoMobile{// Η κλάση Car κληρονομεί την υλοποίηση της μεθόδου drive.// Η μέθοδος drive μπορεί να επαναοριστεί }

public class Truck extends AutoMobile{// Η κλάση Truck κληρονομεί την υλοποίηση της μεθόδου drive.// Η μέθοδος drive μπορεί να επαναοριστεί }

public class Boat implements Transport{public void move() {// Η κλάση Boat υλοποιεί τη μέθοδο move } }

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 36

Page 37: Σημερινή παρουσίαση

Διαγράμματα ακολουθίας

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 37

Page 38: Σημερινή παρουσίαση

Διαγράμματα ακολουθίας• public class Order {

private Set<OrderLine> orderLines = new HashSet<OrderLine>();public int getTotal() {int total = 0;for(OrderLine orderLine : orderLines) {total += orderLine.getSubTotal(); }return total; }}public class OrderLine {private int quantity;private Product product;public int getSubTotal() {return product.getPrice(quantity);} }public class Product {private int price;public int getPrice(int quantity) {return price * quantity; } }

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 38

Page 39: Σημερινή παρουσίαση

Συστάσεις αντικειμενοστρεφούςσχεδίασης

• συστάσεις για τη σχεδίαση μεμονωμένων κλάσεων,

• συστάσεις για την κληρονομικότητα και τον πολυμορφισμό, και

• συστάσεις για τη συνεργασία αντικειμένων

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 39

Page 40: Σημερινή παρουσίαση

Σχεδίαση κλάσεων• Μία κλάση θα πρέπει να απεικονίζει μία αφαίρεση. • Η δημόσια διεπαφή μίας κλάσης θα πρέπει να είναι

σταθερή και συνεπής με το επίπεδο αφαίρεσης της κλάσης.

• Μία κλάση θα πρέπει να έχει υψηλή συνεκτικότητα, εξυπηρετώντας ένα συγκεκριμένο και καλά ορισμένο σκοπό.

• Οι πράξεις (μέθοδοι) που επιδρούν σε κάποια δεδομένα θα πρέπει να βρίσκονται στην κλάση που είναι τα δεδομένα αυτά.

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 40

Page 41: Σημερινή παρουσίαση

Σχεδίαση κλάσεων• Όλα τα δεδομένα μίας κλάσης θα πρέπει να έχουν

ιδιωτική ορατότητα. • Η δημόσια διεπαφή θα πρέπει να κρύβει λεπτομέρειες

της υλοποίησής της.• Η συνεκτικότητα θα πρέπει να αξιολογείται όχι μόνο στο

επίπεδο της κλάσης ως ολότητας, αλλά και σε καθεμία από τις λειτουργίες της.

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 41

Page 42: Σημερινή παρουσίαση

Μεταβίβαση και κληρονομικότητα

• Η κληρονομικότητα είναι ένα από τα βασικότερα μέσα για την επαναχρησιμοποίηση λογισμικού.

• Το άλλο μέσο επαναχρησιμοποίησης του λογισμικού είναι η μεταβίβαση (delegation) που σε ένα αντικειμενοστρεφές σύστημα λογισμικού είναι εξίσου σημαντική με την κληρονομικότητα.

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

• Όποτε μπορούμε, προτιμούμε τη μεταβίβαση έναντι της κληρονομικότητας (λόγω καλύτερης σύζευξης)

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 42

Page 43: Σημερινή παρουσίαση

Μεταβίβαση και κληρονομικότητα

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 43

Page 44: Σημερινή παρουσίαση

Κανόνες για τη χρήση μεταβίβασης και κληρονομικότητας

• Εάν πολλές κλάσεις έχουν κοινά δεδομένα αλλά όχι κοινή συμπεριφορά, τότε δημιουργείται μία νέα κλάση που ομαδοποιεί τα δεδομένα και οι κλάσεις συσχετίζονται με τη νέα κλάση με χρήση της μεταβίβασης.

• Εάν πολλές κλάσεις έχουν κοινή συμπεριφορά αλλά όχι δεδομένα, τότε δημιουργούμε είτε αφηρημένη κλάση την οποία κληρονομούν οι κλάσεις που μας ενδιαφέρουν ή μία διεπαφή την οποία υλοποιούν.

• Εάν πολλές κλάσεις έχουν κοινά δεδομένα και συμπεριφορά, τότε ορίζουμε μία νέα αφηρημένη ή συγκεκριμένη κλάση την οποία κληρονομούν οι κλάσεις που μας ενδιαφέρουν και η οποία ορίζει τα κοινά δεδομένα και την κοινή συμπεριφορά.

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

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 44

Page 45: Σημερινή παρουσίαση

Η μεταβίβαση αντί της κληρονομικότητας στο σύστημα δανεισμού

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 45

Page 46: Σημερινή παρουσίαση

Η μεταβίβαση αντί της κληρονομικότητας στο σύστημα δανεισμού

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 46

Αρχική εκδοχή

Page 47: Σημερινή παρουσίαση

Η μεταβίβαση αντί της κληρονομικότητας στο σύστημα δανεισμού

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 47

Μεταβίβαση

Page 48: Σημερινή παρουσίαση

Κληρονομικότητα• Η κληρονομικότητα είναι από τα ισχυρότερα εργαλεία

που παρέχονται στο σχεδιαστή και τον προγραμματιστή του λογισμικού.

• Όμως η χρήση της ενέχει κάποιους κινδύνους. • Εάν τελικά αποφασίσουμε να χρησιμοποιήσουμε την

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

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 48

Page 49: Σημερινή παρουσίαση

Κληρονομικότητα - ο κανόνας«είναι-ένα»

• Με την εφαρμογή του κανόνα «είναι-ένα» κάθε υποκλάση θα πρέπει να είναι μία λογική εξειδίκευση της υπερκλάσης της.

• Για παράδειγμα, εκφράσεις «ο κύκλος είναι ένα σχήμα», βοηθούν στον ορισμό της κλάσης Κύκλος ως υποκλάση της κλάσης Σχήμα.

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

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 49

Page 50: Σημερινή παρουσίαση

Η αρχή της υποκατάστασης• Η αρχή της υποκατάστασης μας λέει ότι κάθε υποκλάση θα πρέπει

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

• Με την εφαρμογή της αρχής της υποκατάστασης εξετάζουμε εάν μία υποκλάση είναι πράγματι εξειδίκευση της υπερκλάσης της.

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

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 50

Page 51: Σημερινή παρουσίαση

Η αρχή της υποκατάστασης

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 51

Bird bird = new Penguin();bird.fly();

Page 52: Σημερινή παρουσίαση

Η αρχή της υποκατάστασης• Στη σχεδίαση του σχήματος 8-46 ικανοποιείται ο κανόνας «είναι-

ένα» αλλά παραβιάζεται η αρχή της υποκατάστασης. Η κλάση Bird έχει τη λειτουργία fly. Την κλάση την κληρονομεί η κλάση Penguin η οποία όμως δεν έχει κάποια υλοποίηση της μεθόδου fly. Μία πιθανή λύση είναι να έχουμε επίσης τη λειτουργία fly στη κλάση Penguin παρέχοντας μία κενή υλοποίηση. Έτσι όμως δε λύνουμε το πρόβλημα. Το πρόβλημα βρίσκεται στη σχεδίαση που επιλέξαμε. Εάν όντως η κλάση Penguin είναι υποκλάση της κλάσης Bird, τότε η λειτουργία fly δε θα έπρεπε να δηλωθεί στην κλάση Bird, γιατί υπάρχει τουλάχιστο μία υποκλάση της που παραβιάζει την υποκατάσταση.

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 52

Page 53: Σημερινή παρουσίαση

Η αρχή της υποκατάστασης

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 53

Η κληρονομικότητα τηςκλάσης Square ως προς την κλάση Rectangle είναι σε συμφωνία με τον κανόνα«είναι-ένα» και σύμφωνο με τη διαίσθησή μας για τη σχέση γενίκευσης και εξειδίκευσης, μιας και το τετράγωνο είναι πράγματι μία ειδική περίπτωση του ορθογωνίου παραλληλογράμμου.

Page 54: Σημερινή παρουσίαση

Η αρχή της υποκατάστασης• public class Rectangle {

private int width;private int length;

public void setWidth(int width) {this.width = width; }

public int getWidth() {return width; }

public void setLength(int length) {this.length = length; }

public int getLength() {return length; } }

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 54

Page 55: Σημερινή παρουσίαση

Η αρχή της υποκατάστασης• public class Square extends Rectangle {

public void setWidth(int width) { super.setWidth(width);super.setLength(width); }

public void setLength(int length) { super.setWidth(length);super.setLength(length); } }

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

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 55

Page 56: Σημερινή παρουσίαση

Η αρχή της υποκατάστασης

• Έστω για παράδειγμα ο παρακάτω κώδικας:Rectangle myRectangle = new Rectangle();myRectangle.setLength(5);myRectangle.setWidth(10);System.out.println("Length = " + myRectangle.getLength());System.out.println("Width = "+ myRectangle.getWidth());Square mySquare= new Square();mySquare.setLength(5);mySquare.setWidth(10);System.out.println("Length = " + mySquare.getLength());System.out.println("Width = "+ mySquare.getWidth());

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 56

Page 57: Σημερινή παρουσίαση

Η αρχή της υποκατάστασης

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

• Ένα παραλληλόγραμμο συμπεριφέρεται ως παραλληλόγραμμο και ένα τετράγωνο συμπεριφέρεται ως τετράγωνο.

• Η κληρονομικότητα όμως μας δίνει και τη δυνατότητα του παρακάτω κώδικα:Rectangle myRectangle = new Square();myRectangle.setLength(5);myRectangle.setWidth(10);System.out.println("Length = " + myRectangle.getLength());System.out.println("Width = "+ myRectangle.getWidth());

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 57

Page 58: Σημερινή παρουσίαση

Η αρχή της υποκατάστασης

• Αυτό που κάναμε είναι ότι εκχωρήσαμε σε μία αναφορά του τύπου Rectangle ένα αντικείμενο της κλάσης Square.

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

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 58

Page 59: Σημερινή παρουσίαση

Σχεδίαση βάσει συμβολαίου

• Το ερώτημα που προκύπτει είναι βέβαια ποιοι είναι αυτοί οι κανόνες οι οποίοι οδηγούν στην παραβίαση της αρχής της υποκατάστασης και πώς αυτοί οι κανόνες διατυπώνονται.

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

• Την απάντηση στο ερώτημα αυτό μας τη δίνει η σχεδίαση βάσει συμβολαίου (design by contract) που προτάθηκε από τον Meyer [Meyer 97].

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 59

Page 60: Σημερινή παρουσίαση

Σχεδίαση βάσει συμβολαίου

• Κεντρική έννοια της σχεδίασης βάσει συμβολαίου είναι οι ισχυρισμοί (assertions) οι οποίοι χωρίζονται σε τρεις κατηγορίες και είναι:

• Προϋποθέσεις (preconditions). Είναι οι συνθήκες οι οποίες θα πρέπει να ισχύουν ως προϋπόθεση για την εκτέλεση μίας μεθόδου της κλάσης. Οι προϋποθέσεις δεν ελέγχονται από τη μέθοδο αλλά από τις μονάδες λογισμικού που χρησιμοποιούν τη μέθοδο.

• Μετασυνθήκες (postconditions). Είναι οι συνθήκες που θα πρέπει να ισχύουν μετά την εκτέλεση μίας μεθόδου.

• Αναλλοίωτα (invariants). Είναι οι συνθήκες που θα πρέπει να είναι αληθείς για όλα τα στιγμιότυπα της κλάσης. Ένα αναλλοίωτο μπορεί να είναι ψευδές κατά τη διάρκεια εκτέλεσης μίας μεθόδου της κλάσης, θα πρέπει όμως να επανέλθει σε αληθές, όταν η μέθοδος αυτή ολοκληρωθεί.

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 60

Page 61: Σημερινή παρουσίαση

Σχεδίαση βάσει συμβολαίου• Οι προϋποθέσεις και οι μετασυνθήκες αφορούν τις

πράξεις της κλάσης μεμονωμένα, ενώ τα αναλλοίωτα αφορούν την κλάση στο σύνολό της.

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

• Ένα αναλλοίωτο για παράδειγμα για την κλάση Square είναι ότι το πλάτος και το μήκος είναι πάντα ίσα. Δεν επιτρέπεται η παραβίαση του αναλλοίωτου σε καμία από τις μεθόδους της κλάσης.

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 61

Page 62: Σημερινή παρουσίαση

Σχεδίαση βάσει συμβολαίου και κληρονομικότητα

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

• Οι προϋποθέσεις και οι μετασυνθήκες αποτελούν και το συμβόλαιο της κλάσης.

• Κάθε χρήστης της κλάσης θα πρέπει εκτός από τη διεπαφή της κλάσης να λαμβάνει υπόψη του και το συμβόλαιό της.

• Το συμβόλαιο μίας κλάσης θα πρέπει να λαμβάνεται υπόψη και στη χρήση της κληρονομικότητας.

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

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 62

Page 63: Σημερινή παρουσίαση

Σχεδίαση βάσει συμβολαίου και κληρονομικότητα

• Οι κανόνες που ισχύουν για τη χρήση της κληρονομικότητας είναι:• Όλα τα αναλλοίωτα μίας κλάσης ισχύουν και για τις υποκλάσεις της.• Κατά τον επαναορισμό μίας μεθόδου μίας κλάσης σε μία υποκλάση οι προϋποθέσεις αντικαθίστανται από τις ίδιες ή ασθενέστερες.

• • Κατά τον επαναορισμό μίας μεθόδου μίας κλάσης σε μία υποκλάση οι μετασυνθήκες αντικαθίστανται από τις ίδιες ή ισχυρότερες.

• Αν δούμε την κλάση Square, θα δούμε ότι παραβιάζει ένα αναλλοίωτο της κλάσης Rectangle, ότι το πλάτος και το μήκος αλλάζουν ανεξάρτητα.

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 63

Page 64: Σημερινή παρουσίαση

Κανόνες για τις ιεραρχίες κλάσεων

• Η συστηματική χρήση της κληρονομικότητας καταλήγει στην δημιουργία ιεραρχιών κληρονομικότητας.

• Ορισμένοι κανόνες για τον ορισμό των ιεραρχιών είναι [McConnell 04, Riel 96]:

• Μία ιεραρχία θα πρέπει να έχει όσο το δυνατό μικρότερο βάθος.

• Οι κοινές ιδιότητες και λειτουργίες σε μία ιεραρχία κληρονομικότητας θα πρέπει να τοποθετούνται όσο το δυνατό ψηλότερα στην ιεραρχία.

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 64

Page 65: Σημερινή παρουσίαση

Κανόνες για τις ιεραρχίες κλάσεων

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

• Μία υποκλάση γνωρίζει εξ ορισμού την υπερκλάση της, ενώ οι υπερκλάσεις δε θα πρέπει να γνωρίζουν τίποτα για τις υποκλάσεις τους.

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 65

Page 66: Σημερινή παρουσίαση

Πολυμορφισμός

• Ο πολυμορφισμός είναι ο συμπληρωματικός μηχανισμός της κληρονομικότητας.

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

• Έχουμε ήδη συναντήσει τους δύο μηχανισμούς για την επίτευξη του πολυμορφισμού. Ο πρώτος μηχανισμός είναι η κληρονομικότητα των κλάσεων και ο δεύτερος είναι η υλοποίηση των διεπαφών.

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 66

Page 67: Σημερινή παρουσίαση

Πολυμορφισμός

• Με την κληρονομικότητα κλάσεων έχουμε κληρονομικότητα διεπαφών και υλοποίησης, ενώ με τις διεπαφές κληρονομικότητα μόνο των διεπαφών.

• Ο πολυμορφισμός είναι ένας άριστος μηχανισμός για να διαχειριστούμε και να αποκρύψουμε στοιχεία μεταβλητότητας, όταν εφαρμόζουμε την αρχή της απόκρυψης πληροφοριών.

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 67

Page 68: Σημερινή παρουσίαση

Πολυμορφισμός

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

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 68

Page 69: Σημερινή παρουσίαση

Πολυμορφισμός• Μία βασική χρήση του πολυμορφισμού είναι η απαλοιφή

της λογικής που βασίζεται σε συνθήκες ελέγχου (conditional logic).

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

• Η βασικότερη ένδειξη είναι η ύπαρξη συνθηκών ελέγχου (προτάσεις if και switch) στον κώδικα, οι οποίες επηρεάζουν και τη συμπεριφορά των αντικειμένων.

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 69

Page 70: Σημερινή παρουσίαση

Πολυμορφισμός• Τα σημεία που δίνουμε τη μεγαλύτερη προσοχή είναι δύο:• • Όταν η χρήση των προτάσεων if και switch συνοδεύεται

από έλεγχο τύπων. Για παράδειγμα, η γλώσσα Java συμπεριλαμβάνει τον τελεστή instanceοf ο οποίος ελέγχει για το αν κάποιο αντικείμενο είναι αντικείμενο κάποιας συγκεκριμένης κλάσης. Όταν ο έλεγχος επηρεάζει επιλογές για τη συμπεριφορά των αντικειμένων, τότε θα πρέπει να αντικαθίσταται ο έλεγχος του τύπου από πολυμορφισμό.

• • Όταν η χρήση των προτάσεων if και switch ελέγχει την τιμή μίας ιδιότητας ενός αντικειμένου η οποία συνοδεύεται από επιλογές για τη συμπεριφορά του αντικειμένου.

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 70

Page 71: Σημερινή παρουσίαση

Πολυμορφισμός• Η πρώτη περίπτωση χρήσης της if που συνοδεύεται από

έλεγχο τύπων είναι παραστατική στο παρακάτω τμήμα κώδικα:if ( shape instanceof Rectangle ) {shape.drawRectangle();} else {shape.drawCircle(); }

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

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 71

Page 72: Σημερινή παρουσίαση

Πολυμορφισμός• switch (shape.type) {

case Shape.RECTANGLE:shape.drawRectangle();break;default:shape.drawCircle(); }

• Και για τις δύο παραπάνω περιπτώσεις συνίσταται φυσικά η χρήση του πολυμορφισμού. Ορίζουμε τη μέθοδο draw στην κλάση Shape και αφήνουμε τις υποκλάσεις Rectangle και Circle να τις επαναορίσουν.

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 72

Page 73: Σημερινή παρουσίαση

Συνεργασία αντικειμένων• Από τα πρώτα βήματα της εξέτασης ενός προβλήματος ορίζουμε

κλάσεις με δεδομένα και συμπεριφορά. • Η λειτουργικότητα του λογισμικού παρέχεται με τη συνεργασία

(collaboration) αντικειμένων. • Για την υλοποίηση μίας περίπτωσης χρήσης δημιουργείται μία

γειτονιά αντικειμένων τα οποία επικοινωνούν μέσω της ανταλλαγής μηνυμάτων.

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

• Οι αρμοδιότητες των κλάσεων προκύπτουν από τα διαγράμματα κλάσεων και η συνεργασία των αντικειμένων τους παρουσιάζεται με τα διαγράμματα ακολουθίας ή τα διαγράμματα επικοινωνίας.

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 73

Page 74: Σημερινή παρουσίαση

Χρήση των διαγραμμάτων ακολουθίας στη σχεδίαση

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

• • Τα διαγράμματα ακολουθίας εμφανίζουν αλληλεπιδράσεις και συνεργασία αντικειμένων και όχι αλγορίθμους.

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 74

Page 75: Σημερινή παρουσίαση

Χρήση των διαγραμμάτων ακολουθίας στη σχεδίαση

• • Τα διαγράμματα ακολουθίας λειτουργούν ως μέσο επικοινωνίας στην ομάδα ανάπτυξης.

• • Τα διαγράμματα ακολουθίας λειτουργούν ως μέσο διερεύνησης εναλλακτικών λύσεων.

• • Τα διαγράμματα ακολουθίας λειτουργούν συμπληρωματικά με τα διαγράμματα κλάσεων.

• • Τα διαγράμματα ακολουθίας μπορούν να λειτουργήσουν ως μέσο λεπτομερούς σχεδίασης του λογισμικού.

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 75

Page 76: Σημερινή παρουσίαση

Ομοιόμορφη κατανομή αρμοδιοτήτων

• Μία από τις κεντρικές ιδέες της αντικειμενοστρεφούς σκέψης είναι η ομοιόμορφη κατανομή των αρμοδιοτήτων στις κλάσεις του λογισμικού.

• Σε ένα καλά σχεδιασμένο σύστημα λογισμικού δεν υπάρχει κάποια κλάση που αποτελεί κεντρικό σημείο αναφοράς της σχεδίασης.

• Αντίθετα, η συμπεριφορά του συστήματος προκύπτει από τη συνεργασία αντικειμένων με διαφορετικές αρμοδιότητες.

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 76

Page 77: Σημερινή παρουσίαση

Ομοιόμορφη κατανομή αρμοδιοτήτων

• Θα πρέπει επομένως να αποφεύγονται οι λεγόμενες θεϊκές κλάσεις, οι οποίες είτε γνωρίζουν πολλά είτε εκτελούν σημαντικό μέρος της λειτουργικότητας του λογισμικού.

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

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 77

Page 78: Σημερινή παρουσίαση

Κεντροποιημένος υπολογισμός προθεσμίας επιστροφής αντιτύπου

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 78

Page 79: Σημερινή παρουσίαση

Κατανεμημένο υπολογισμός με χρήση της μεταβίβασης

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 79

Page 80: Σημερινή παρουσίαση

Σύζευξη• Η χαλαρή σύζευξη των μονάδων λογισμικού είναι ένα

από τα σημαντικότερα ποιοτικά κριτήρια της καλής σχεδίασης.

• Όπως και με τη συνεκτικότητα, εφαρμόζεται και στις απλούστερες μονάδες λογισμικού που στην προκειμένη περίπτωση είναι οι κλάσεις. Υψηλή σύζευξη σημαίνει υψηλός βαθμός εξάρτησης μεταξύ δύο κλάσεων. Η σύζευξη μεταξύ κλάσεων εμφανίζεται, όταν:

• • Υπάρχει συσχέτιση μεταξύ των κλάσεων.• • Αντικείμενα μίας κλάσης καλούν λειτουργίες της

δεύτερης.

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 80

Page 81: Σημερινή παρουσίαση

Σύζευξη• • Αντικείμενο μίας κλάσης χρησιμοποιεί ένα αντικείμενο

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

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

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 81

Page 82: Σημερινή παρουσίαση

Εμφάνιση της σύζευξης στα διαγράμματα UML

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 82

Page 83: Σημερινή παρουσίαση

Σύζευξη και συνεκτικότητα των οντοτήτων του συστήματος δανεισμού

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 83

Page 84: Σημερινή παρουσίαση

Σύζευξη και συνεκτικότητα των οντοτήτων του συστήματος δανεισμού

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 84

Page 85: Σημερινή παρουσίαση

Σύζευξη και συνεκτικότητα των οντοτήτων του συστήματος δανεισμού

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 85

Page 86: Σημερινή παρουσίαση

Σύζευξη και συνεκτικότητα των οντοτήτων του συστήματος δανεισμού

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 86

Page 87: Σημερινή παρουσίαση

Επικοινωνία Αντικειμένων

• Η συνεργασία των αντικειμένων διέπεται από ορισμένους κανόνες για την επίτευξη ποιοτικής σχεδίασης [McConnell 04, Riel 96, Wirfs-Brock 02]. Οι πιο σημαντικοί είναι:

• • Θα πρέπει να ελαχιστοποιείται ο αριθμός των μηνυμάτων μεταξύ των συνεργαζόμενων αντικειμένων.

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

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 87

Page 88: Σημερινή παρουσίαση

Επικοινωνία Αντικειμένων

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

• • Θα πρέπει να είμαστε πολύ προσεκτικοί, όταν οι παράμετροι είναι πρωταρχικοί τύποι. Όταν κάποια παράμετρος είναι αφαίρεση κάποιου τύπου, τότε θα πρέπει να δημιουργούμε απλούς τύπους και αντικείμενα τιμές.

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 88

Page 89: Σημερινή παρουσίαση

Επικοινωνία Αντικειμένων

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

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 89

Page 90: Σημερινή παρουσίαση

Επικοινωνία Αντικειμένων

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 90

Page 91: Σημερινή παρουσίαση

Επικοινωνία Αντικειμένων

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 91

Page 92: Σημερινή παρουσίαση

Επικοινωνία Αντικειμένων• Το παρακάτω τμήμα κώδικα παρουσιάζει την υλοποίηση

του διαγράμματος ακολουθίας του σήματος 8-56.• public class Borrower {

private BorrowerCategory category;public BorrowerCategory getCategory() {return category;}public boolean canBorrow() {int pendingItems;if (getCategory() == null ) {return false;}

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 92

Page 93: Σημερινή παρουσίαση

Επικοινωνία Αντικειμένων• pendingItems = countPendingItems();

return getCategory().canBorrow(pendingItems);}}public class BorrowerCategory {private int maxLendingItems;public boolean canBorrow(int pendingItems) {return maxLendingItems > pendingItems;}}

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 93

Page 94: Σημερινή παρουσίαση

Επικοινωνία Αντικειμένων

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 94

Δανεισμός αντιτύπου

Page 95: Σημερινή παρουσίαση

Επικοινωνία Αντικειμένων

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 95

Δημιουργία Δανεισμού

Page 96: Σημερινή παρουσίαση

Επικοινωνία ΑντικειμένωνΠαρακάτω παρουσιάζεται ο κώδικας για το διάγραμμα ακολουθίας του

σχήματος.

public class Item {public Loan borrow(Borrower borrower) {if (borrower == null ) {return null;}if (!borrower.canBorrow()) {return null;}Loan loan = new Loan();loan.setItem(this);loan.setBorrower(borrower);loan.setLoanDate(Calendar.getInstance());return loan;} }

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 96

Page 97: Σημερινή παρουσίαση

Επικοινωνία Αντικειμένων

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 97

Συνολικό Διάγραμμα Δανεισμού

Page 98: Σημερινή παρουσίαση

Σχεδίαση πακέτων• Τα πακέτα στη σχεδίαση τοποθετούνται σε υψηλότερο

επίπεδο των κλάσεων.• Χρησιμοποιούμε τα πακέτα για να τμηματοποιήσουμε το

λογισμικό σε διαχειρίσιμες μονάδες του λογισμικού. • Τα πακέτα μας βοηθούν επίσης να παρακολουθήσουμε

την ανάθεση του λογισμικού στα μέλη της ομάδας ανάπτυξης.

• Η ανάπτυξη του λογισμικού είναι μία ομαδική προσπάθεια και πρέπει να υπάρχει κάποιος τρόπος ανάθεσης μίας μονάδας λογισμικού σε ένα ή περισσοτέρους μηχανικούς λογισμικού της ομάδας ανάπτυξης.

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 98

Page 99: Σημερινή παρουσίαση

Σχεδίαση πακέτων• Συνήθως η ανάθεση της κωδικοποίησης γίνεται σε

επίπεδο πακέτου και όχι σε επίπεδο μεμονωμένης κλάσης.

• Εκτός από την οργάνωση της ανάπτυξης τα πακέτα προσφέρουν και μία βάση για τον τρόπο παράταξης (deployment) του λογισμικού η οποία γίνεται σε φυσικές μονάδες λογισμικού όπως π.χ. σε αρχεία jar ή dll. Σε ένα πολύπλοκο σύστημα λογισμικού επιθυμούμε να παραδίδουμε μία φυσική μονάδα λογισμικού ανεξάρτητα από τις υπόλοιπες φυσικές μονάδες. Τα πακέτα καθοδηγούν σε σημαντικό βαθμό και την οργάνωση του λογισμικού και σε φυσικές μονάδες λογισμικού.

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 99

Page 100: Σημερινή παρουσίαση

Εξαρτήσεις πακέτων

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 100

Δύο πακέτα έχουν σχέση εξάρτησης, όταν υπάρχει κάποιου είδους εξάρτησης στα περιεχόμενά τους.

Page 101: Σημερινή παρουσίαση

Ορατότητα σε πακέτα

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 101

Με το σχήμα 8-61 δείχνουμε ότι εκτός του πακέτου banking είναι γνωστή μόνη η αφηρημένη κλάση Transaction. Οι κλάσεις Deposit και Withdrawal είναι γνωστές μόνο σε κλάσεις εντός του πακέτου banking.

Page 102: Σημερινή παρουσίαση

Συνεκτικότητα πακέτων

• Το κριτήριο της συνεκτικότητας θα μας καθοδηγήσει στον τρόπο που δημιουργούνται τα πακέτα και στον τρόπο που επιλέγονται οι κλάσεις που θα τοποθετηθούν εντός των πακέτων.

• Το βασικότερο ίσως κριτήριο για την επίτευξη υψηλής συνεκτικότητας είναι να τοποθετούνται σε ένα πακέτο οι κλάσεις με ισχυρή εξάρτηση.

• Όταν τοποθετούμε κλάσεις σε ένα πακέτο, θα πρέπει να έχουμε υπόψη μας τα παρακάτω:

• • Στο ίδιο πακέτο τοποθετούνται κλάσεις με ισχυρές στατικές εξαρτήσεις.

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 102

Page 103: Σημερινή παρουσίαση

Συνεκτικότητα πακέτων

• • Στο ίδιο πακέτο τοποθετούνται κλάσεις που εξυπηρετούν τον ίδιο ή παρόμοιο σκοπό.

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

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

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 103

Page 104: Σημερινή παρουσίαση

Συνεκτικότητα πακέτων

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 104

Page 105: Σημερινή παρουσίαση

Σύζευξη πακέτων• Η σύζευξη μεταξύ των πακέτων προκύπτει από τη

σύζευξη των περιεχομένων τους.• Η δημιουργία πακέτων με σκοπό τη μείωση της

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

• Ένα φαινόμενο αυξημένης σύζευξης πακέτων είναι η εμφάνιση κυκλικών εξαρτήσεων σε ένα διάγραμμα

πακέτων της UML.

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 105

Page 106: Σημερινή παρουσίαση

Σύζευξη πακέτων

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 106

Απάλειψη κυκλικών εξαρτήσεων σε πακέτα

Page 107: Σημερινή παρουσίαση

Σύζευξη πακέτων

2009 ΟΠΑ -Τεχνολογία Λογισμικού – Εμμ. Γιακουμάκης 107

Εξάρτηση και σταθερότητα