Κατέβασμα παρουσίασης
Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε
1
Μηχανική Λογισμικού ΙΙ
Αντίστροφη Μηχανική Reverse Engineering Παναγιώτης Σφέτσος, PhD Παναγιώτης Σφέτσος Μεθοδολογίες Προγραμματισμού ΙΙ
2
Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
Γ ε ν ι κ ά - 1 Αντίστροφη Μηχανική: Είναι η διαδικασία εύρεσης των τεχνολογικών αρχών που διέπουν μία συσκευή, ένα αντικείμενο ή ένα σύστημα λογισμικού, μέσα από: την ανάλυση της δομής και της λειτουργίας του συστήματος τον διαχωρισμό των τμημάτων του συστήματος την ανακατασκευή του συστήματος, χωρίς αντιγραφή Κίνητρα – Αιτίες – Συμπτώματα Ταυτόχρονη ανάπτυξη του από πολλούς προγραμματιστές και ύπαρξη πολλαπλών εκδόσεων (multi-persons, multi- versions). Ασυνέπεια μεταξύ τεκμηρίωσης ενός έργου λογισμικού και του κώδικα. Αιτία η ικανοποίηση νέων απαιτήσεων (γρήγορος κώδικας) χωρίς την ενημέρωση των υπολοίπων εγγράφων ή διαγραμμάτων που αντιστοιχούν στις διάφορες φάσεις ανάπτυξης. Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
3
Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
Γ ε ν ι κ ά - 1 Χαμένη τεκμηρίωση Ανάλυση προϊόντος, πως δουλεύει; Παρακολούθηση ασφάλειας συστημάτων Διαλειτουργικότητα (Interoperability). Όταν ο χρήστης έχει μικρή ή καθόλου γνώση των ιδιαίτερων χαρακτηριστικών του συστήματος που εργάζεται. Ψηφιακή ενημέρωση / διόρθωση συστήματος Διαγραφή απαγόρευσης αντιγραφής (cracking) Εύρεση σχεδιαστικής δομής συστήματος Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
4
Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
Γ ε ν ι κ ά - 2 Εκμάθηση ή Ακαδημαϊκοί λόγοι Βιομηχανική / κρατική κατασκοπεία Αποφυγή λαθών που έκαναν κατασκευαστές συστημάτων Περιέργεια : : Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
5
Αντίστροφη Μηχανική Λογισμικού
Μπορεί να χρησιμοποιηθεί επίσης για την: Τροποποίηση του Λογισμικού Αλλαγή περιβάλλοντος – πλατφόρμας χρήσης (Y2K, , €, ηλεκτρονικό εμπόριο, κλπ.) Σχεδίαση και υλοποίηση στην παραδοσιακή (κανονική) Μηχανική Λογισμικού (π.χ. Debugging) Κατανόηση του Λογισμικού Οπτική αναπαράσταση του Λογισμικού Επαναχρησιμοποίηση (re-use) του κώδικα Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
6
Αντίστροφη Μηχανική Δεδομένων
Εστιάζει στα δεδομένα και τις σχέσεις μεταξύ των δεδομένων Έλεγχος των δομών των δεδομένων μέσα στα προγράμματα και στις Βάσεις των Δεδομένων. Για παράδειγμα τις Σχεσιακές Βάσεις Δεδομένων (RDB’s). Ιεραρχικά αρχεία δεδομένων RDB’s RDB’s Μοντέλο-ΟΟ Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
7
Αντίστροφη Μηχανική Λογισμικού
Διαφορετικές όψεις: Chikofsky και Cross: “είναι η διαδικασία ανάλυσης ενός συστήματος για την δημιουργία μιας αναπαράστασης / αναπαραγωγής του σε υψηλότερο επίπεδο αφαίρεσης” Επιστροφή στην αρχή του κύκλου ανάπτυξης ενός συστήματος Requirements Analysis Forward engineering Reverse engineering Design Implementation Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
8
Αντίστροφη Μηχανική Λογισμικού
Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
9
Απεικονίσεις UML και σύμβολα
V i s i b i l i t y UML Notation A t r i b u t e s M e t h o d s Java visibility UML Notation public + private - Protected # package ~ Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
10
Είδη ορατότητας - Είδη σχέσεων
Είδη ορατότητας Είδη σχέσεων μεταξύ κλάσεων Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
11
περισσότεροι συμβολισμοί..
Η τιμή μεταβλητών ή επιστρεφόμενη τιμή από μεθόδους, γράφεται μετά από (:), π.χ. carPrice : double = 0.0 employeeID : int getDepartment() : String 2) Σε static μεταβλητές ή λειτουργίες οι τιμές υπογραμμίζονται, π.χ. department : String = “Grammateia” 3) Abstract classes και interfaces, γράφονται με italics Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
12
Συσχέτιση – Association (1/4)
Απεικονίζει την στατική (μη δυναμική) σχέση μεταξύ δύο κλάσεων και με πολλαπλότητα. Η πολλαπλότητα ορίζει πόσες περιπτώσεις συσχετίζονται σε μια δεδομένη στιγμή: 0..1 Καμία ή μία μόνο περίπτωση Μια θέση αυτοκινήτου μπορεί να έχει ένα ή κανένα επιβάτη 1 Ακριβώς μία περίπτωση Μια παραγγελία έχει ένα πελάτη 0..* or * Μηδέν ή περισσότερες περιπτώσεις.. Μια τάξη μπορεί να έχει μηδέν ή πολλούς φοιτητές 1..* Μια ή περισσότερες περιπτώσεις (τουλάχιστον μια) Μια πτήση μπορεί να έχει ένα ή περισσότερους επιβάτες Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
13
Συσχέτιση – Association (2/4)
class Company { Employee emp[]= new Employee[4]; public void setEmployee(Employee e,int a) {emp[a]=e;} public void printAll() { for (int i=0;i<4;i++) { System.out.println("Name = "+ emp[i].getName()); System.out.println("Type Of Employment = "+ emp[i].getEmpType()); System.out.println("Type Of Payment = "+ emp[i].getPayType()); System.out.println(); emp[i].calcSalary(); } } } abstract class Employee { String name; protected int payType; protected int b; protected int h; Employee(String s, int b_, int h_, int p) {name=s; payType=p; b=b_; h=h_;} public String getName() {return name;} public String getPayType() { String pType; if (payType==0) pType="Salary"; else pType="ByHour"; return pType; } abstract String getEmpType(); abstract void calcSalary(); } Πολλαπλότητα Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
14
Συσχέτιση – Association (3/4)
Συσχέτιση μονής κατεύθυνσης (unidirectional association) public class Customer { private String name; private String address; private String contactNumber; } public class Car { private String modelNumber; private Customer owner; Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
15
Συσχέτιση – Association (4/4)
Συσχέτιση διπλής κατεύθυνσης (bidirectional association) public class Customer { private String name; private String address; private String contactNumber; private Car car; } public class Car { private String modelNumber; private Customer owner; Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
16
Γενίκευση – Κληρονομικότητα (1/3)
Γενίκευση – Κληρονομικότητα (1/3) Απεικονίζει την κληρονομικότητα (στη java την λέξη κλειδί extends) Ακολουθεί την αρχή της Υποκατάστασης της Liskov (Liskov Substitution Principle) , όπου η κλάση παιδί (υποκλάση) μπορεί να αντικαταστήσει την κλάση μαμά (υπερκλάση). Έτσι βοηθά στο να ακολουθείται και η αρχή της Ανοικτής-Κλειστής Σχεδίασης (Open-Closed Principle) , δηλ ανοικτή για επεκτάσεις – κλειστή για τροποποιήσεις. abstract class Employee { protected String name; protected int payType; protected int b; protected int h; Employee(String s, int b_, int h_, int p) {name=s; payType=p; b=b_; h=h_;} public String getName() {return name;} Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
17
Γενίκευση – Κληρονομικότητα (2/3)
Γενίκευση – Κληρονομικότητα (2/3) public String getPayType() { String pType; if (payType==0) pType="Salary"; else pType="ByHour"; return pType; } abstract String getEmpType(); abstract void calcSalary(); } class Administrator extends Employee { Administrator(String s, int b, int h, int p) {super(s,b,h,p);} public String getEmpType() {return "Administrator";} public void calcSalary() { int s=0; if (payType==0) s=1200+b; else s=(h*12); System.out.println(" Sarary = " + s); }} Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
18
Γενίκευση – Κληρονομικότητα (3/3)
Γενίκευση – Κληρονομικότητα (3/3) class Technical extends Employee { public Technical(String s, int b, int h, int p) {super(s,b,h,p);} public String getEmpType() {return "Technical";} public void calcSalary() { int s=0; if (payType==0) s=800+b; else s=(h*10); System.out.println(" Sarary = " + s); } Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
19
Εξάρτηση (Dependency)
Απεικονίζει την εξάρτηση δύο κλάσεων, δηλαδή την εξάρτηση που έχει μια κλάση προς μια άλλη, για την ύπαρξη ή υλοποίηση της. Στη java θεωρούμε εξάρτηση την περίπτωση που η εξαρτώμενη κλάση κάνει αναφορά (με αντικείμενο) στην κλάση από την οποία εξαρτάται ή έχει μεθόδους στις οποίες περνούν σαν παράμετροι αντικείμενα της κλάσης από την οποία εξαρτάται. public class PaymentSystem { : : } public class Order { public void processPayment(PaymentSystem ps){ Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
20
Συνάθροιση (Aggregation)
Απεικονίζει την “έχει ένα” – σχέση, δηλαδή τονίζει ότι το “όλον” aαποτελείται από μέρη που θα υπάρχουν ακόμη και αν το “όλον” καταστραφεί. Είναι ένα είδος συσχέτισης. Απεικονίζεται με τον διάφανο ρόμβο και στη java ακολουθούμε τους συμβολισμούς και πολλαπλότητες της συσχέτισης. public class Student { : : } public class School { private Student student; Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
21
Σύνθεση (Composition)
Απεικονίζει την σχέση του “όλον” με τα “μέρη” του μόνο που αν το όλον καταστραφεί , τότε τα μέρη του δεν μπορούν να υπάρχουν ανεξάρτητα. Ένα κομμάτι ή μέρος του όλου μπορεί να έχει ένα ιδιοκτήτη, π.χ. ένας δημόσιος υπάλληλος μπορεί να είναι έχει μια θέση σε δημόσιο οργανισμό ή εταιρία. Απεικονίζεται με τον γεμάτο (μαύρο) ρόμβο και στη java ακολουθούμε τους συμβολισμούς και πολλαπλότητες της συνάθροισης με την βοήθεια και τοπικών μεταβλητών . public class Professor { : : } public class University { private Professor[] professors; Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
22
Παραδείγματα Απεικονίσεων (1/2)
Από το βιβλίο: UML Class Diagrams for Java Programmers Απεικόνιση κλάσης: Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
23
Παραδείγματα Απεικονίσεων (2/2)
Απεικόνιση Κληρονομικότητας: Υλοποίηση Διεπαφής: Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
24
Εργαλεία Eclipse και VP
Εργαλεία εξαγωγής πληροφορίας από πηγαίο κώδικα (ή και μορφή bytecode) και η κατασκευή ή ενημέρωση ενός μοντέλου UML. Η παραγωγή κώδικα από διαγράμματα αντιστρέφεται, και δημιουργούνται διαγράμματα (συνήθως κλάσεων και ακολουθίας) από υπάρχοντα κώδικα (reverse engineering). Έτσι διατηρείται η συνέπεια μεταξύ μοντέλου και κώδικα, καθώς κάθε αλλαγή στον κώδικα ενημερώνει αυτόματα το μοντέλο – τα διαγράμματα UML (συγχρονισμός μοντέλου - κώδικα). Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
25
Visual Paradigm - Παράδειγμα (1/7)
Έστω ο κώδικας: abstract class Employee { String name; protected int payType; protected int b; protected int h; Employee(String s, int b_, int h_, int p) {name=s; payType=p; b=b_; h=h_;} public String getName() {return name;} public String getPayType() { String pType; if (payType==0) pType="Salary"; else pType="ByHour"; return pType; } abstract String getEmpType(); abstract void calcSalary(); } Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
26
Visual Paradigm - Παράδειγμα (2/7)
class Administrator extends Employee { Administrator(String s, int b, int h, int p) {super(s,b,h,p);} public String getEmpType() {return "Administrator";} public void calcSalary() { int s=0; if (payType==0) s=1000+b; else s=(h*12); System.out.println(" Sarary = " + s); }} class Technical extends Employee { public Technical(String s, int b, int h, int p) {super(s,b,h,p);} public String getEmpType() {return "Technical";} if (payType==0) s=800+b; else s=(h*10); System.out.println(" Sarary = " + s); } } Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
27
Visual Paradigm - Παράδειγμα (3/7)
class Company { Employee emp[]= new Employee[4]; public void setEmployee(Employee e,int a) {emp[a]=e;} public void printAll() { for (int i=0;i<4;i++) { System.out.println("Name = "+ emp[i].getName()); System.out.println("Type Of Employment = "+ emp[i].getEmpType()); System.out.println("Type Of Payment = "+ emp[i].getPayType()); System.out.println(); emp[i].calcSalary(); } } } class Ask1 { public static void main(String[] args) { int a; Employee e1= new Technical("Nikas",10,10,0); Employee e2=new Administrator("Vasileiou",10,10,1); Employee e3= new Technical("Paylidis",10,10,1); Employee e4=new Administrator("Apostolatos",10,10,0); Company c = new Company(); c.setEmployee(e1,0); c.setEmployee(e2,1); c.setEmployee(e3,2); c.setEmployee(e4,3); c.printAll(); } } Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
28
Visual Paradigm - Παράδειγμα (4/7)
Το αποτέλεσμα του προγράμματος: Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
29
Visual Paradigm - Παράδειγμα (5/7)
Αυτόματα με την επιλογή Instant Reverse, αφού έχουμε εισάγει τις java κλάσεις: Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
30
Visual Paradigm - Παράδειγμα (6/7)
Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
31
Visual Paradigm - Παράδειγμα (7/7)
Προσοχή στα: Είδη σχέσεων μεταξύ κλάσεων Είδη ορατότητας Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
32
Eclipse – Παράδειγμα (1/6)
Στο Eclipse θα εγκαταστήσουμε το plugin : ObjectAid Εγκατάσταση: 1) Ανοίγουμε το Eclipse, πάμε Help > Install New Software 2) Πατάμε add και εισάγουμε το όνομα ObjectAid UML Explorer 3) Εισάγουμε την διεύθυνση του plugin: Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
33
Eclipse – Παράδειγμα (2/6)
Στις επιλογές που εμφανίζει επιλέγουμε μόνο το ObjectAid Class Diagram – plugin, γιατί τα άλλα (π.χ. Sequence diagrams) είναι επί πληρωμή, ενώ αυτό free και πατάμε Next. Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
34
Eclipse – Παράδειγμα (3/6)
Πατάμε Finish για να τελειώσει η εγκατάσταση. Πατάμε Οk στο μήνυμα προειδοποίησης για το security του plugin και κάνουμε Restart το Eclipse. Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
35
Eclipse – Παράδειγμα (4/6)
Για να δημιουργήσουμε ένα UML διάγραμμα με τον ObjectAid wizard από τον java κώδικα μας, πατάμε: File > New > Other… Επιλέγουμε στο textbox Class Diagram και πατάμε Next Εισάγουμε τον κατάλογο όπου θα αποθηκεύσουμε το διάγραμμα και το όνομα του διαγράμματος. Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
36
Eclipse – Παράδειγμα (5/6)
Στον visual UML editor δημιουργείται μια κενή κλάση (με κατάληξη .ucls) όπου με drag and drop μπορούμε να “ρίξουμε” οποιαδήποτε κλάση ή ολόκληρο πρόγραμμα με κλάσεις και να γίνει η εμφάνιση του UML – class diagram. Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
37
Eclipse – Παράδειγμα (6/6)
Ο κώδικας είναι ο ίδιος με το παράδειγμα VP, αλλά εδώ η κλάση της main() Ονομάζεται EmployeeTest και όχι Ask1. Το παραγόμενο διάγραμμα: Προσοχή στις διαφορές ορατότητας Παναγιώτης Σφέτσος, Μηχανική Λογισμικού ΙΙ
Παρόμοιες παρουσιάσεις
© 2024 SlidePlayer.gr Inc.
All rights reserved.