04 - - PowerPoint PPT Presentation

04
SMART_READER_LITE
LIVE PREVIEW

04 - - PowerPoint PPT Presentation

04 H M & M Y


slide-1
SLIDE 1

04 Αντικειμενοστραφής ανάλυση και σχεδιασμός

Τεχνολογία Λογισμικού

Σχολή Hλεκτρολόγων Mηχανικών & Mηχανικών Yπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο Χειμερινό εξάμηνο 2017‐18 Δρ. Κώστας Σαΐδης ﴾saiko@di.uoa.gr﴿

slide-2
SLIDE 2

Περιεχόμενα

  • 1. Αντικειμενοστράφεια ﴾με παραδείγματα σε Java, Javascript﴿
  • 2. Εισαγωγή στη UML*
  • 3. Εισαγωγή στα πρότυπα σχεδίασης*

* Θα επανέλθουμε αναλυτικότερα σε επόμενες διαλέξεις

2

slide-3
SLIDE 3
  • 1. Αντικειμενοστράφεια

3

slide-4
SLIDE 4

Αντικείμενα

Ενθυλακώνουν ﴾encapsulate﴿ Kατάσταση ﴾state﴿ δεδομένα που τηρούνται σε πεδία Συμπεριφορά ﴾behavior﴿ λειτουργίες που τηρούνται σε μεθόδους ﴾behavior﴿ Στιγμιοτύπιση ﴾instantiation﴿ Μέσω κατασκευαστών ﴾constructors﴿ Αυτο‐αναφορά ﴾this, self﴿ Ανταλλαγή μηνυμάτων ﴾message passing﴿

4

slide-5
SLIDE 5

Βασικές έννοιες

Ενθυλάκωση ﴾encapsulation﴿ Στυγμιοτύπιση ﴾instantiation﴿ Κληρονομικότητα ﴾inheritance﴿ Με βάση κλάσεις / διεπαφές ﴾classes / interfaces﴿ Με βάση πρωτότυπα ﴾prototypes﴿ Δυναμική αποστολή μηνυμάτων ﴾dynamic method dispatch﴿ Αργή δέσμευση ﴾late binding﴿ Σύνθεση Πολυμορφισμός

5

slide-6
SLIDE 6

Βασικές αρχές αφαίρεσης ﴾abstraction principles﴿

Το σήμειο που το αντικειμενοστραφές μοντέλο συνδέεται με την εννοιολογική μοντελοποίηση ﴾conceptual modeling﴿ και την αναπαράσταση γνώσης ﴾knowledge represenation﴿

6

slide-7
SLIDE 7

Λίστα αναγνωσμάτων

Antero Taivalsaari, "On the notion of inheritance", ACM Computing Surveys, Vol. 28, No 3, September 1996.

7

slide-8
SLIDE 8
  • I. Classification ‐ Instantiation
  • A. Taivalsaari

8

slide-9
SLIDE 9

Classification ‐ Instantiation

Σχέση του αντικειμένου με την κλάση του και αντίστροφα. Όλα τα αντικείμενα / στιγμιότυπα μιας κλάσης μοιράζονται κοινά και ομοιόμορφα χαρακτηριστικά. Η κλάση είναι το intensional abstraction όλων των δυνατών της αντικειμένων.

9

slide-10
SLIDE 10

Παράδειγμα ﴾Java﴿

class Point { private int x; private int y; public Point(int x, int y) { this.x = x; this.y = y; } public int getX() { return x; } public int getY() { return y; } public void setX(int x) { this.x = x; } public void setY(int y) { this.y = y; } public void addToX(int num) { this.x += num; } public void addΤoY(int num) { this.y += num; } } 10

slide-11
SLIDE 11

Χρήση

Point p1 = new Point(0, 0); //στιγμιοτύπιση p1.addToX(10); //αποστολή μηνύματος (επίκληση μεθόδου) Point p2 = new Point(10, 0); assert(p1.getX() == p2.getX()); assert(p1 instanceof Point); assert(p2 instanceof Point); 11

slide-12
SLIDE 12

Παράδειγμα ﴾Javascript < ES6﴿

var Point = function(x, y) { //constuctor this.x = x; this.y = y; this.getX = function() { return this.x; } this.getY = function() { return this.y; } this.setX = function(x) { this.x = x; } this.setY = function(y) { this.y = y; } this.addToX = function(num) { this.x += num; } this.addToY = function(num) { this.y += num; } } 12

slide-13
SLIDE 13

Καλύτερο Παράδειγμα ﴾Javascript < ES6﴿

var Point = function(x, y) { //constuctor this.x = x; this.y = y; } Point.prototype.getX = function() { return this.x; } Point.prototype.getY = function() { return this.y; } Point.prototype.setX = function(x) { this.x = x; } Point.prototype.setY = function(y) { this.y = y; } Point.prototype.addToX = function(num) { this.x += num; } Point.prototype.addToY = function(num) { this.y += num; } 13

slide-14
SLIDE 14

Παράδειγμα ﴾Javascript >= ES6﴿

class Point { constructor(x, y) { this.x = x; this.y = y; } get x() { return this.x; } get y() { return this.y; } set x(x) { this.x = x; } set y(y) { this.y = y; } addToX(num) { this.x += num; } addΤoY(num) { this.y += num; } } 14

slide-15
SLIDE 15

Χρήση

var p1 = new Point(0, 0); p1.addToX(10); var p2 = new Point(10, 0); assert p1.getX() == p2.getX(); assert (p1 instanceof Point); assert (p2 instanceof Point); 15

slide-16
SLIDE 16
  • 2. Aggregation ‐ Decomposition
  • A. Taivalsaari

16

slide-17
SLIDE 17

Aggregation ‐ Decomposition

Συνάθροιση ﴾ή σύνθεση﴿ επιμέρους εννοιών για τη σύσταση μιας νέας ξεχωριστής έννοιας. Σχέσεις μέρους‐όλου ﴾part‐of﴿.

17

slide-18
SLIDE 18

Παράδειγμα ﴾Java﴿

Ένα αντικείμενο περιέχει ﴾συντίθεται﴿ από άλλο αντικείμενα

class Line { private Point first; private Point second; public Line(Point first, Point second) { this.first = first; this.second = second; } Point getFirstPoint() { return first; } Point getSecondPoint() { return second; } } 18

slide-19
SLIDE 19

Παράδειγμα ﴾ES6﴿

Ένα αντικείμενο περιέχει ﴾συντίθεται﴿ από άλλο αντικείμενα

class Line { constructor(first, second) { //Points this.first = first; this.second = second; } getFirstPoint() { return this.first; } getSecondPoint() { return this.second; } } 19

slide-20
SLIDE 20
  • 3. Generalization ‐ Specialization
  • A. Taivalsaari

20

slide-21
SLIDE 21

Generalization ‐ Specialization

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

21

slide-22
SLIDE 22

Κληρονομικότητα

Ένα αντικείμενο κληρονομεί τα πεδία ή/και τις μεθόδους των "προγόνων" του Στην πράξη έχουμε: Κληρονομικότητα για εξειδίκευση ﴾specialization﴿ Κληρονομικότητα για επαναχρησιμοποίηση ﴾reuse﴿

22

slide-23
SLIDE 23

Παράδειγμα ﴾Java﴿

class Arrow extends Line { enum Direction{FIRST_TO_SECOND, SECOND_TO_FIRST}; private Direction d; public Arrow(Point p1, Point p2, Direction d) { super(p1, p2); this.d = d; } public void toggleDirection() { if (d == Direction.FIRST_ΤΟ_SECOND) d = Direction.SECOND_TO_FIRST; else d = Direction.FIRST_ΤΟ_SECOND; } } 23

slide-24
SLIDE 24

Χρήση

Point p1 = new Point(0, 0); Point p2 = new Point(10, 10); Arrow a = new Arrow(p1, p2, Arrow.Direction.FIRST_TO_SECOND); assert(a instanceof Arrow); //Προφανώς assert(a instanceof Line); //Επίσης ‐‐ πολυμορφισμός assert(a.getFirstPoint().getX() == 0); //Κληρονομικότητα 24

slide-25
SLIDE 25

Παράδειγμα ﴾Javascript < ES6﴿

var Line = function() { //Line constructor ... } var Direction = { FIRST_TO_SECOND: 1, SECOND_TO_FIRST: 2 } var Arrow = function(p1, p2, d) { Line.call(this, p1, p2); //call the Line constructor this.d = d; } Arrow.prototype = new Line(); //"Inherit" from Line Arrow.prototype.constructor = Arrow; //Just to make sure Arrow.prototype.toggleDirection = function() { if (this.d == Direction.FIRST_ΤΟ_SECOND) this.d = Direction.SECOND_TO_FIRST; else this.d = Direction.FIRST_ΤΟ_SECOND; } 25

slide-26
SLIDE 26

Παράδειγμα ﴾Javascript >= ES6﴿

class Line { ... } var Direction = { FIRST_TO_SECOND: 1, SECOND_TO_FIRST: 2 } class Arrow extends Line { constructor(p1, p2, d) { super(p1, p2); this.d = d; } toggleDirection() { if (this.d == Direction.FIRST_ΤΟ_SECOND) this.d = Direction.SECOND_TO_FIRST; else this.d = Direction.FIRST_ΤΟ_SECOND; } 26

slide-27
SLIDE 27

Χρήση

var p1 = new Point(0, 0); var p2 = new Point(10, 10); var a = new Arrow(p1, p2, Direction.FIRST_TO_SECOND); assert(a instanceof Arrow); assert(a instanceof Line); assert(a.getFirstPoint().getX() == 0); 27

slide-28
SLIDE 28

Private state/behavior

Στο ﴾απλό﴿ παράδειγμά μας: Η κλάση Point ενθυλακώνει δύο ακεραίους Η κλάση Line ενθυλακώνει δύο Point αντικείμενα Η κλάση Arrow ενθυλακώνει δύο Point αντικείμενα και μια διεύθυνση Μηχανισμός απόκρυψης πληροφορίας ﴾information hiding﴿

28

slide-29
SLIDE 29

Private state σε Javascript

var Line = function(x, y) { var state = { x:x, y:y }; this.getX = function() { return state.x } ... }; 29

slide-30
SLIDE 30
  • 4. Grouping ‐ Individualization
  • A. Taivalsaari

30

slide-31
SLIDE 31

Ομαδοποίηση ‐ Διαχωρισμός

Ομαδοποίηση αντικειμένων με βάση κάποιο extensional και όχι intensional χαρακτηριστικό. Παραδείγματα: Αγαπημένα του χρήστη ﴾user favorites﴿ Πιο πρόσφατα / πιο δημοφιλή Αποτελέσματα μιας αναζήτησης

31

slide-32
SLIDE 32

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

Παροχή μιας κοινής διεπαφής για αντικείμενα διαφορετικών τύπων ή Ένα αντικείμενο μπορεί να έχει πολλούς τύπους ﴾πολλές συμπεριφορές﴿

32

slide-33
SLIDE 33

Είδη πολυμορφισμού

Universal polymorphism Parametric Inclusion Ad‐hoc Overloading Coercion

33

slide-34
SLIDE 34

Λίστα αναγνωσμάτων

Luca Cardelli, Peter Wegner, "On Understanding Types, Data Abstraction, and Polymorphism", ACM Computing Surveys, Vol 17

  • n. 4, pp 471‐522, December 1985.

34

slide-35
SLIDE 35

Ad‐hoc πολυμορφισμός ﴾Overloading﴿

Operator overloading

int x = 3 + 5; String s = name + " " + surname;

Method overloading

class Foo { void doSomething(A a) { ... } void doSomething(A a, B b) { ... } } class Bar extends Foo { void doSomething(C c, D d) { ... } } 35

slide-36
SLIDE 36

Ad‐hoc πολυμορφισμός ﴾Coercion﴿

Type coercion

double x = 1; //The int constant is converted to double automatically double avg, sum; int count; ... avg = sum / count; //The int count is coverted to double automatically //before applying the division 36

slide-37
SLIDE 37

Παραμετρικός πολυμορφισμός

Generics

class Cache<K, V> { private final Map<K, V> cache = new HashMap<>(); public synchronized void put(K key, V value) { cache.put(key, value); } public synchronized V get(K key) { return cache.get(key); } } 37

slide-38
SLIDE 38

Cache<String, Line> lineLabels = new Cache<>(); cache.put("First line", someLine); cache.put("Second line", someOtherLine); 38

slide-39
SLIDE 39

Πολυμορφισμός υπο‐τύπων ﴾inclusion polymorphism﴿

interface Shape { double getArea(); } class Rectangle implements Shape { private double width; private double height; public double getArea() { return width * height; } } class Circle implements Shape { private double radius; public double getArea() { return Math.PI * radius * radius; } } 39

slide-40
SLIDE 40

class AreaPrinter { public static void print(Shape s) { System.out.println(s.getArea()); } } Rectangle r = new Rectangle(2.0, 3.0); Circle c = new Circle(1.0); AreaPrinter.print(r); // 6.0 AreaPrinter.print(c); // 3.14 40

slide-41
SLIDE 41

Δυναμική αποστολή μηνυμάτων και αργή δέσμευση

interface Computation { String getName(); void compute(); } abstract class ComputationBase implements Computation { public String getName() { return getClass().getName(); } } 41

slide-42
SLIDE 42

class SimpleComputation extends ComputationBase { public void compute() { System.out.println("Done computing"); } } class SimpleComputation2 extends SimpleComputation { public String getName() { return "Simple2" } } 42

slide-43
SLIDE 43

class ListOfComputations extends ComputationBase { private final List<Computation> computations; public ListOfComputations(Computation... computations) { this.computations = Arrays.asList(computations); } public void compute() { for(Computation c: computations) { System.out.println("Computing: " + c.getName()); c.compute(); } } } 43

slide-44
SLIDE 44

Computation c1 = new SimpleComputation(); Computation c2 = new SimpleComputation2(); Computation list = new ListOfComputations(c1, c2); System.out.println(list.getName()); list.compute(); //Output ListOfComputations Computing: SimpleComputation Done computing Computing: Simple2 Done computing 44

slide-45
SLIDE 45
  • 2. Εισαγωγή στη γλώσσα UML

45

slide-46
SLIDE 46

Unified Modeling Language ﴾UML﴿

Γλώσσα μοντελοποίησης γενικής χρήσης που στοχεύει στην παροχή ενός καθιερωμένου τρόπου οπτικοποίησης και επικοινωνίας του σχεδιασμού ενός συστήματος. ISO standard 19501:2005 Ενοποιημένη μοντελοποίηση τόσο των απαιτήσεων όσο και του σχεδιασμού Τελευτία έκδοση 2.5 ﴾2015﴿

46

slide-47
SLIDE 47

Μοντελοποίηση συμπεριφοράς

Διαγράμματα περιπτώσεων χρήσης ﴾Use‐case diagrams﴿ Διαγράμματα δραστηριότητας ﴾Activity diagrams﴿ Διαγράμματα μηχανών κατάστασης ﴾State machine diagrams﴿ Διαγράμματα ακολουθίας ﴾Sequence diagrams﴿ Διαγράμματα επικοινωνίας ﴾Communication diagrams﴿ Διαγράμματα χρονισμού ﴾Timing diagrams﴿

47

slide-48
SLIDE 48

Μοντελοποίηση δομής

Διαγράμματα κλάσεων ﴾Class diagrams﴿ Διαγράμματα συστατικών ﴾Component diagrams﴿ Διαγράμματα πακέτων ﴾Package diagrams﴿ Διαγράμματα "παράταξης / εγκατάστασης" ﴾Deployment diagrams﴿ Διαγράμματα σύνθετης δομής ﴾Composite structure diagrams﴿

48

slide-49
SLIDE 49

Διάγραμμα περίπτωσης χρήσης

By Kishorekumar 62, CC BY‐SA 3.0, https://commons.wikimedia.org/w/index.php?curid=7880320

49

slide-50
SLIDE 50

Διάγραμμα κλάσεων

50

slide-51
SLIDE 51

Διάγραμμα συστατικών

smartdraw.com

51

slide-52
SLIDE 52

Διάγραμμα δραστηριότητας

1ο Παράδειγμα 2ο Παράδειγμα

52

slide-53
SLIDE 53

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

53

slide-54
SLIDE 54

Θα επανέλθουμε σε επόμενη διάλεξη...

54

slide-55
SLIDE 55
  • 3. Εισαγωγή στα πρότυπα σχεδίασης

55

slide-56
SLIDE 56

Πρότυπο σχεδίασης ﴾Design pattern﴿

Μια καλή πρακτική για την αντιμετώπιση ενός σχεδιαστικού προβλήματος στο λογισμικό.

56

slide-57
SLIDE 57

Προσοχή

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

57

slide-58
SLIDE 58

Λίστα αναγνωσμάτων

Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides, "Design Patterns: Elements of Reusable Object‐Oriented Software", Addison Wesley, 1994, 0‐201‐63361‐2.

58

slide-59
SLIDE 59

Κύρια είδη προτύπων

Αρχιτεκτονικά ﴾architectural﴿ MVC, MVVM, κ.ά Κατασκευαστικά ﴾creational﴿ Factory, Builder, Object Pool, Singleton, κ.ά Δομικά ﴾structural﴿ Adapter/Wrapper, Bridge, Decorator, Facade, Proxy, κ.ά Συμπεριφοράς ﴾behavioral﴿ Chain of responsibility, Command, Iterator, Mediator, Observer, Strategy, Template method, Visitor, κ.ά

59

slide-60
SLIDE 60

Παράδειγμα

60

slide-61
SLIDE 61

Visitor

Διαχωρισμός του αλγορίθμου από τη δομή δεδομένων. Η "λογική" της επίσκεψης στα στοιχεία της δομής ﴾traversal﴿ διαχωρίζεται από τη δομή αυτή καθ' αυτή.

61

slide-62
SLIDE 62

Παράδειγμα

interface TreeVisitor { void visit(TreeNode node); } interface TreeNode { TreeNode getLeft(); TreeNode getRight(); int getValue(); void accept(TreeVisitor visitor); } class SimpleTreeNode implements TreeNode { ... public void accept(TreeVisitor vistor) { visitor.visit(this); } } 62

slide-63
SLIDE 63

Υλοποίση

class PreOrderTreeVisitor implements TreeVisitor { public void visit(TreeNode node) { int value = node.getValue(); //do something with the node's value ... //then traverse from left to right (pre‐order) TreeNode left = node.getLeft(); if (left != null) left.accept(this); TreeNode right = node.getRight(); if (right != null) right.accept(this); } } 63

slide-64
SLIDE 64

Πραγματικό Παράδειγμα ﴾Java 7+ FileVisitor﴿

java.nio.Files

static Path walkFileTree( Path start, FileVisitor<? super Path> visitor ) throws IOException 64

slide-65
SLIDE 65

java.nio.file.FileVisitor

interface FileVisitor<T> { FileVisitResult postVisitDirectory(T dir, ...) FileVisitResult preVisitDirectory(T dir, ...) FileVisitResult visitFile(T file, ...) FileVisitResult visitFileFailed(T file, ...) } 65

slide-66
SLIDE 66

Θα επανέλθουμε σε επόμενη διάλεξη...

66