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

Σχετικά έγγραφα
11α Κατασκευαστικά πρότυπα σχεδίασης

14 Πρότυπα Σχεδίασης συνέχεια

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

11β Δομικά πρότυπα σχεδίασης

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


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

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

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

Προγραμματισμός ΙΙ (Java) 10. Πολυνηματικές εφαρμογές

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

Διάλεξη Εισαγωγή στη Java, Μέρος Γ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ - ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΛ 133: ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΕΡΓΑΣΤΗΡΙΟ 3 Javadoc Tutorial

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

Δομές Δεδομένων - Εργαστήριο 2. Λίστες

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

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

(Διαφάνειες Νίκου Βιδάκη)

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

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

(C) 2010 Pearson Education, Inc. All rights reserved.

Στόχοι της Πτυχιακής

Ειδικά Θέματα Προγραμματισμού

EPL 603 TOPICS IN SOFTWARE ENGINEERING. Lab 5: Component Adaptation Environment (COPE)

Μοτίβα Σχεδίασης (Design Patterns)

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

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

Δομές Δεδομένων - Εργαστήριο 5. Ουρές Προτεραιότητας

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

12 Πρότυπα σχεδίασης συμπεριφοράς

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

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

Διδάσκων: Παναγιώτης Ανδρέου

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

Εγκατάσταση λογισμικού και αναβάθμιση συσκευής Device software installation and software upgrade

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

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

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

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

Wrapper Classes, Abstract Classes and Interfaces

άσκηση Hide UI Elements 7.2 Try and Catch

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

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

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ. Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής

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

Εργαστήριο Ανάπτυξης Εφαρμογών Βάσεων Δεδομένων. Εξάμηνο 7 ο

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

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

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Υλοποίηση Δυαδικού Σωρού σε γλώσσα Java. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Τι είναι η Spring. Η Spring είναι ένα ελεύθερο (open source) περιβάλλον εργασίας για εφαρμογές Java. Μπορεί να περιγραφεί ως:

Περιγραφή Μαθήματος ΠΕΡΙΓΡΑΦΗ ΜΑΘΗΜΑΤΟΣ. Γεώργιος Παπαϊωάννου ( )

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

Διδάσκων: Παναγιώτης Ανδρέου

Test Data Management in Practice

CYTA Cloud Server Set Up Instructions

Προγραμματισμός ΙΙ (Java) 10. Πολυνηματικές εφαρμογές Τεκμηρίωση κώδικα

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

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

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

Abstract classes, Interfaces ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

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

Διάλεξη 16-17: Πολυμορφισμός (Polymorphism) Διδάσκων: Παναγιώτης Ανδρέου

Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής T.E.I. ΘΕΣΣΑΛΟΝΙΚΗΣ

ΕΠΛ131 Αρχές Προγραμματισμού

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

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

Κατασκευαστές. Μέθοδοι Κατασκευής (Constructors).

Διάγραμμα Κλάσεων. Class Diagram

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 9 : ΕΞΑΙΡΕΣΕΙΣ ΚΑΙ Ο ΧΕΙΡΙΣΜΟΣ ΤΟΥΣ

Βασίλης Χριστοφίδης Επαναληπτική Εξέταση (3 ώρες) Ηµεροµηνία: 21 Σεπτεµβρίου 2012

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

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

Διασυνδέσεις / Διεπαφές. Παναγιώτης Σφέτσος, PhD

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι

Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΔΕΝΤΡΑ (TREES) B C D E F G H I J K L M

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

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

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

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

Πρότυπα Σχεδίασης. Design Patterns

Case 1: Original version of a bill available in only one language.

ΕΡΓΑΣΙΑ 4 - Αντικειμενοστραφής Υλοποίηση του Συστήματος Κατανομής Θέσεων σε Προγράμματα Σπουδών

08 Η γλώσσα UML I. Τεχνολογία Λογισμικού. Σχολή Hλεκτρολόγων Mηχανικών & Mηχανικών Yπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο. Χειμερινό εξάμηνο

Πρότυπα Σχεδίασης. Design Patterns

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

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

ΑΝΑΠΤΥΞΗ ΠΑΙΧΝΙΔΙΟΥ ΣΟΒΑΡΟΥ ΣΚΟΠΟΥ ΓΙΑ ΤΗΝ ΕΚΜΑΘΗΣΗ ΕΝΝΟΙΩΝ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΣΕ JAVA

Η λέξη κλειδί this. Γαβαλάς Δαμιανός

VBA ΣΤΟ WORD. 1. Συχνά, όταν ήθελα να δώσω ένα φυλλάδιο εργασίας με ασκήσεις στους μαθητές έκανα το εξής: Version ΗΜΙΤΕΛΗΣ!!!!

Καλές επιτυχίες παιδιά στα υπόλοιπα μαθήματά σας και καλές γιορτές!!!!

4 Συλλογές Αντικειμένων

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 9 : ΑΦΗΡΗΜΕΝΕΣ ΚΛΑΣΕΙΣ

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

Instruction Execution Times

Εργαστήριο Ανάπτυξης Εφαρμογών Βάσεων Δεδομένων. Εξάμηνο 7 ο

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

9:00-10:00 π.μ. (60 λεπτά) Παρασκευή, 14 Οκτωβρίου, 2016

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

ΕΠΛ233 ΠΛΗΡΟΦΟΡΙΑ ΤΥΠΟΥ. Type Information. Μ. Δικαιάκος

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

Transcript:

Τμήμα Πληροφορικής & Τηλεπικοινωνιών, ΕΚΠΑ Τεχνολογία Λογισμικού 8ο Εξάμηνο 2018 19 Πρότυπα σχεδίασης Ι Δρ. Κώστας Σαΐδης saiko@di.uoa.gr

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

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

Λίστα αναγνωσμάτων Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides, "Design Patterns: Elements of Reusable Object Oriented Software", Addison Wesley, 1994, 0 201 63361 2.

Κύρια είδη προτύπων Αρχιτεκτονικά architectural MVC, Multi tier, κ.ά Κατασκευαστικά 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, κ.ά

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

Παράδειγμα σχεδιαστικού προτύπου

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

Παράδειγμα interface TreeVisitor { void visit(treenode node); abstract class TreeNode { TreeNode getleft(); TreeNode getright(); int getvalue(); void accept(treevisitor visitor) { visitor.visit(this);

Υλοποίση 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);

Πραγματικό Παράδειγμα Java 7+ FileVisitor java.nio.files static Path walkfiletree( Path start, FileVisitor<? super Path> visitor ) throws IOException

java.nio.file.filevisitor interface FileVisitor<T> { FileVisitResult postvisitdirectory(t dir,...) FileVisitResult previsitdirectory(t dir,...) FileVisitResult visitfile(t file,...) FileVisitResult visitfilefailed(t file,...)

Κατασκευαστικά πρότυπα σχεδίασης Πρότυπα σχετικά με την κατασκευή αντικειμένων / στιγμιοτύπων 13

Περιεχόμενα 1. Singleton 2. Factory Method 3. Abstract Factory 4. Builder 5. Object Pool 6. Prototype 14

Singleton Σκοπός: Να διαφυλάξει ότι μια κλάση έχει μόνο ένα στιγμιότυπο και να προσφέρει την πρόσβαση σε αυτό 15

Παράδειγμα Eager initialization public class Configuration { private static final Configuration c = new Configuration(); private Configuration() {... public static Configuration getinstance() { return c; Από το repo του μαθήματος 16

Lazy initialization public class Configuration { private static Configuration c; private Configuration() {... public static Configuration getinstance() { if (c == null) { synchronized(configuration.class) { if (c == null) { c = new Configuration(); return c; 17

Πραγματικό παράδειγμα JVM Runtime http://docs.oracle.com/javase/8/docs/api/java/lang/runtime.html# getruntime 18

Συζήτηση Το singleton πρότυπο εξυπηρετεί όταν θέλουμε ένας "ευαίσθητος" για την εφαρμογή πόρος να αρχικοποιείται μόνο μία φορά π.χ. configuration file reader, data access handler, κλπ. Προβληματική κληρονομικότητα λόγω του private constructor Απαιτείται προσεκτική και "φειδωλή" εφαρμογή του προτύπου 19

Factory Method & Abstract Factory Σκοπός: Να αποκρύψουν τις λεπτομέρειες δημιουργίας "συγγενών" στιγμιοτύπων 20

Factory Method aka Virtual constructor Ένα πρόσθετο επίπεδο ανακατεύθυνσης / αφαίρεσης level of indirection στην απευθείας εκτέλεση ενός κατασκευαστή constructor. Η κλάση χρήστης βασίζεται στον τύπο των στιγμιοτύπων και όχι σε συγκεκριμένη κλάση concrete class. 21

Παράδειγμα abstract class MVCResource { //controller abstract User createuser(httprequest req) void doservice(httprequest req, HttpResponse res) { User user = createuser(req) Template tpl = Helper.getTemplateFrom(req) //view Context ctx = Helper.createContextFrom(req) //model tpl.render(user, ctx, res) 22

class PublicResource extends MVCResource { User createuser(req) { String id = req.getcookie().get("session id") if (id) { User user = SessionDB.getUserFrom(id) if (user) { return user //for logging purposes return User.ANONYMOUS; 23

class ProtectedResource extends MVCResource { User createuser(req) { String id = req.getcookie().get("session id") if (id) { User user = SessionDB.getUserFrom(id) if (user && user.isauthorizedfor(this)) { return user throw new AuthorizationException("Not authorized") 24

Συζήτηση Χρήση του προτύπου: όταν μια κλάση δεν μπορεί να "ξέρει πλήρως" τι στιγμιότυπα θα δημιουργηθούν όταν μια κλάση "θέλει" να μεταθέσει την αρμοδιότητα δημιουργίας στιγμιοτύπων σε υποκλάσεις της όταν μπορεί να προκύψει σφάλμα exception εντός των κατασκευαστών constructors ώστε να αποφευχθούν "ασυνεπή" στιγμιότυπα 25

Abstract Factory Ένα interface δημιουργίας "συγγενών" στιγμιοτύπων 26

Παράδειγμα interface Product {... class Tablet implements Product {... class Mobile implements Product {... 27

interface ProductFactory { Product newproduct(httprequest req) class TabletFactory implements ProductFactory { Product newproduct(httprequest req) { //process req return new Tablet(...) class MobileFactory implements ProductFactory { Product newproduct(httprequest req) { //process req return new Mobile(...) 28

class ShopingCart { private final List<Product> = new ArrayList() static Map<String, ProductFactory> factories = [ "Tablet": new TabletFactory(), "Mobile": new MobileFactory() ] void addproduct(httprequest req) { String family = req.getparameter("family") ProductFactory factory = factories.get(family) if (factory) { products.add(factory.newproduct(req)) else { throw new BadRequestException("Invalid product family") 29

Συζήτηση Χρήση του προτύπου: όταν μια κλάση είναι ανεξάρτητη του πώς δημιουργούνται ή αναπαρίστανται τα "στοιχεία" που συνθέτει όταν μια κλάση θα "αποφασίσει" στο runtime τι στιγμιότυπα πρέπει να δημιουργηθούν 30

Πραγματικό παράδειγμα XML Parsing https://docs.oracle.com/javase/8/docs/api/javax/xml/parsers/docu mentbuilderfactory.html#newinstance 31

Builder Σκοπός: Να απλοποιήσει τη δημιουργία σύνθετων αντικειμένων που απαιτούν πολλές παραμέτρους 32

Παράδειγμα Something s = new BuilderOfSomething(). setanoption(1). setanother("x"). setaflag(false). build(); 33

Η υλοποίηση class BuilderOfSomething { private Something s; BuilderOfSomething() { s = new Something(); BuilderOfSomething setanoption(int option) { s.setint(option); return this; //allows chaining of calls BuilderOfSomething setanother(string option) { s.setstring(option); return this;... Something build() { return s; 34

Πραγματικό Παράδειγμα Guava Cache Cache<String, X> cache = CacheBuilder. newbuilder(). maximumsize(100). expireafterwrite(1, TimeUnit.MINUTES). removallistener( new RemovalListener<String, X>() { @Override void onremoval(removalnotification<string, X> n) {... ). build() 35

Πραγματικό Παράδειγμα Guava Cache Cache<String, X> cache = CacheBuilder. newbuilder(). maximumsize(100). expireafterwrite(1, TimeUnit.MINUTES). removallistener( (RemovalNotification<String, X> n) > {... ). build() 36

37

If you have a procedure with ten parameters, you probably missed some. Alan Perlis 38

Συζήτηση Αποφυγή κατασκευαστών με πολλές παραμέτρους >6 Επιλογή του χρήστη ποια παράμετρο θα θέσει ρητά οι υπόλοιπες θα πάρουν κάποια default τιμή Η "κατασκευαστική" διαδικασία πρέπει να υποστηρίζει διαφορετικές "αναπαραστάσεις" για τα αντικείμενα υπό κατασκευή 39

Object Pool Σκοπός: Να διατηρήσει "ζωντανά" σε μια μορφή ενδιάμεσης μνήμης cache αντικείμενα των οποίων η κατασκευή είναι "ακριβή" 40

Συζήτηση Thread Pools, Connection Pools, κτλ. Μοτίβο borrow & return. Εκ των προτέρων κατασκευή συγκεριμένου πλήθους αντικειμένων που επαναχρησιμοποιούνται αντί να κατασκευάζονται και να καταστρέφονται σε κάθε χρήση. Άνω όρια στη δέσμευση πόρων αποφυγή επιθέσεων τύπου Denial Of Service. Μικρά όρια μπορεί να μειώσουν την απόδοση. 41

Παράδειγμα Database Connection Pool στο repo του μαθήματος 42

Thread Pools Java 5+ Executors java.util.concurrent.executors static ExecutorService newcachedthreadpool() static ExecutorService newfixedthreadpool() 43

Από το Javadoc newfixedthreadpool Creates a thread pool that reuses a fixed number of threads operating off a shared unbounded queue. At any point, at most n threads will be active processing tasks. If additional tasks are submitted when all threads are active, they will wait in the queue until a thread is available. If any thread terminates due to a failure during execution prior to shutdown, a new one will take its place if needed to execute subsequent tasks. The threads in the pool will exist until it is explicitly shutdown. 44

newcachedthreadpool Creates a thread pool that creates new threads as needed, but will reuse previously constructed threads when they are available. These pools will typically improve the performance of programs that execute many short lived asynchronous tasks. Calls to execute will reuse previously constructed threads if available. If no existing thread is available, a new thread will be created and added to the pool. Threads that have not been used for sixty seconds are terminated and removed from the cache. Thus, a pool that remains idle for long enough will not consume any resources. 45

Prototype Σκοπός: Δημιουργία νέου στιγμιοτύπου από την "αντιγραφή" ενός υπάρχοντος 46

Java Cloneable http://docs.oracle.com/javase/8/docs/api/java/lang/object.html#cl one 47

Παράδειγμα Shallow cloning vs deep cloning https://programmingmitra.blogspot.gr/2016/11/java Cloning Types of Cloning Shallow Deep in Details with Example.html 48

Copy Constructor pattern Εναλλακτική στο cloning public Person(Person original) { this.id = original.id + 1; this.name = new String(original.name); this.city = new City(original.city); 49