(Translated by https://www.hiragana.jp/)
Αντικειμενοστρεφής προγραμματισμός - Βικιπαίδεια

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

Σしぐまτたうηいーたνにゅー πληροφορική αντικειμενοστρεφή προγραμματισμό (object-oriented programming)[1][2] ή ΑあるふぁΠぱい, ονομάζουμε ένα προγραμματιστικό υπόδειγμα τたうοおみくろん οποίο εμφανίστηκε σしぐまτたうαあるふぁ τέλη της δεκαετίας τたうοおみくろんυうぷしろん 1970 κかっぱαあるふぁιいおた καθιερώθηκε κατά τたうηいーた δεκαετία τたうοおみくろんυうぷしろん 1990, αντικαθιστώντας σしぐまεいぷしろん μεγάλο βαθμό τたうοおみくろん παραδοσιακό υπόδειγμα τたうοおみくろんυうぷしろん δομημένου προγραμματισμού. Πρόκειται γがんまιいおたαあるふぁ μία μεθοδολογία ανάπτυξης προγραμμάτων, υποστηριζόμενη από κατάλληλες γλώσσες προγραμματισμού, όπου οおみくろん χειρισμός σχετιζόμενων δεδομένων κかっぱαあるふぁιいおた τたうωおめがνにゅー διαδικασιών πぱいοおみくろんυうぷしろん επενεργούν σしぐまεいぷしろん αυτά γίνεται από κοινού, μέσω μίας δομής δεδομένων πぱいοおみくろんυうぷしろん τたうαあるふぁ περιβάλλει ως αυτόνομη οντότητα μみゅーεいぷしろん ταυτότητα κかっぱαあるふぁιいおた δικά της χαρακτηριστικά. Αυτή ηいーた δομή δεδομένων καλείται αντικείμενο κかっぱαあるふぁιいおた αποτελεί πραγματικό στιγμιότυπο σしぐまτたうηいーた μνήμη ενός σύνθετου, κかっぱαあるふぁιいおた πιθανώς οριζόμενου από τたうοおみくろんνにゅー χρήστη, τύπου δεδομένων πぱいοおみくろんυうぷしろん ονομάζεται κλάση (class). Ηいーた κλάση προδιαγράφει τόσο δεδομένα όσο κかっぱαあるふぁιいおた τις διαδικασίες οおみくろんιいおた οποίες επιδρουζν επάνω τους· αυτή υπήρξε ηいーた πρωταρχική καινοτομία τたうοおみくろんυうぷしろん ΑあるふぁΠぱい.

Έτσι μπορεί νにゅーαあるふぁ οριστεί μία προδιαγραφή δομής αποθήκευσης (πぱい.χかい. μία κλάση «τηλεόραση») ηいーた οποία νにゅーαあるふぁ περιέχει τόσο ιδιότητες (πぱい.χかい. μία μεταβλητή (variable) «τρέχον κανάλι») όσο κかっぱαあるふぁιいおた πράξεις ή χειρισμούς επί αυτών τたうωおめがνにゅー ιδιοτήτων (πぱい.χかい. μία διαδικασία (method/function) «άνοιγμα της τηλεόρασης»). Σしぐまτたうοおみくろん εいぷしろんνにゅー λόγω παράδειγμα κάθε υλική τηλεόραση (κάθε αντικείμενο αποθηκευμένο πραγματικά σしぐまτたうηいーた μνήμη) αναπαρίσταται ως ξεχωριστό, «φυσικό» στιγμιότυπο αυτής της πρότυπης, ιδεατής κλάσης. Επομένως μόνο τたうαあるふぁ αντικείμενα καταλαμβάνουν χώρο σしぐまτたうηいーた μνήμη τたうοおみくろんυうぷしろん υπολογιστή ενώ οおみくろんιいおた κλάσεις αποτελούν απλώς «καλούπια». Οおみくろんιいおた αιτίες πぱいοおみくろんυうぷしろん ώθησαν σしぐまτたうηいーたνにゅー ανάπτυξη τたうοおみくろんυうぷしろん ΑあるふぁΠぱい ήταν οおみくろんιいおた ίδιες μみゅーεいぷしろん αυτές πぱいοおみくろんυうぷしろん οδήγησαν σしぐまτたうηいーたνにゅー ανάπτυξη τたうοおみくろんυうぷしろん δομημένου προγραμματισμού (ευκολία συντήρησης, οργάνωσης, χειρισμού κかっぱαあるふぁιいおた επαναχρησιμοποίησης κώδικα μεγάλων κかっぱαあるふぁιいおた πολύπλοκων εφαρμογών), όμως τελικώς ηいーた αντικειμενοστρέφεια επικράτησε καθώς μπορούσε νにゅーαあるふぁ ανταπεξέλθει σしぐまεいぷしろん προγράμματα πολύ μεγαλύτερου όγκου κかっぱαあるふぁιいおた πολυπλοκότητας.

Ιστορικό

Επεξεργασία

Οおみくろんιいおた περισσότερες αντικειμενοστρεφείς έννοιες εμφανίστηκαν αρχικά σしぐまτたうηいーた γλώσσα προγραμματισμού Simula 67, ηいーた οποία ήταν προσανατολισμένη σしぐまτたうηいーたνにゅー εκτέλεση προσομοιώσεων τたうοおみくろんυうぷしろん πραγματικού κόσμου. Οおみくろんιいおた ιδέες της Simula 67 επηρέασαν κατά τたうηいーた δεκαετία τたうοおみくろんυうぷしろん '70 τたうηいーたνにゅー ανάπτυξη της Smalltalk, της γλώσσας πぱいοおみくろんυうぷしろん εισήγαγε τたうοおみくろんνにゅー όρο αντικειμενοστρεφής προγραμματισμός. Ηいーた Smalltalk αναπτύχθηκε από τたうοおみくろんνにゅー Άλαν Κέι (Alan Key) της εταιρείας Xerox σしぐまτたうοおみくろん πλαίσιο μίας εργασίας μみゅーεいぷしろん στόχο τたうηいーた δημιουργία ενός χρήσιμου, αλλά κかっぱαあるふぁιいおた εύχρηστου, προσωπικού υπολογιστή. Όταν ηいーた τελική έκδοση της Smalltalk έγινε διαθέσιμη τたうοおみくろん 1980 ηいーた έρευνα γがんまιいおたαあるふぁ τたうηいーたνにゅー αντικατάσταση τたうοおみくろんυうぷしろん δομημένου προγραμματισμού μみゅーεいぷしろん ένα πぱいιいおたοおみくろん σύγχρονο υπόδειγμα ήταν ήδη εいぷしろんνにゅー εξελίξει. Σしぐまτたうηいーた γλώσσα αυτή όλοι οおみくろんιいおた τύποι δεδομένων ήταν κλάσεις (δでるたεいぷしろんνにゅー υπήρχαν δηλαδή πぱいιいおたαあるふぁ παραδοσιακές δομές δεδομένων παρά μόνο αντικείμενα).

Τたうηいーたνにゅー ίδια περίπου εποχή, κかっぱαあるふぁιいおた επίσης μみゅーεいぷしろん επιρροές από τたうηいーた Simula, ολοκληρωνόταν ηいーた ανάπτυξη της C++ ως μίας ισχυρής επέκτασης της δημοφιλούς γλώσσας προγραμματισμού C σしぐまτたうηいーたνにゅー οποία είχαν "μεταμοσχευθεί" αντικειμενοστρεφή χαρακτηριστικά. Ηいーた επιρροή της C++ καθ' όλη της δεκαετία τたうοおみくろんυうぷしろん '80 ήταν καταλυτική μみゅーεいぷしろん αποτέλεσμα τたうηいーた σταδιακή κυκλοφορία αντικειμενοστρεφών εκδόσεων πολλών γνωστών διαδικαστικών γλωσσών προγραμματισμού. Κατά τたうοおみくろん πρώτο ήμισυ της δεκαετίας τたうοおみくろんυうぷしろん '90 ηいーた βαθμιαία καθιέρωση στους μικροϋπολογιστές τたうωおめがνにゅー γραφικών διασυνδέσεων χρήστη (GUI), γがんまιいおたαあるふぁ τたうηいーたνにゅー ανάπτυξη τたうωおめがνにゅー οποίων οおみくろん ΑあるふぁΠぱい φαινόταν ιδιαιτέρως κατάλληλος, κかっぱαあるふぁιいおた ηいーた επίδραση της C++ οδήγησαν σしぐまτたうηいーたνにゅー επικράτηση της αντικειμενοστρέφειας ως βασικού προγραμματιστικού υποδείγματος.

Τたうοおみくろん 1995 ηいーた εμφάνιση της Java, μίας ιδιαίτερα επιτυχημένης, πλήρως αντικειμενοστρεφούς γλώσσας πぱいοおみくろんυうぷしろん έμοιαζε συντακτικώς μみゅーεいぷしろん τたうηいーた C/C++ κかっぱαあるふぁιいおた προσέφερε πρωτοποριακές γがんまιいおたαあるふぁ τたうηいーたνにゅー εποχή δυνατότητες, έδωσε νέα ώθηση σしぐまτたうοおみくろんνにゅー ΑあるふぁΠぱい. Παράλληλα εμφανίστηκαν ποικίλες άτυπες βελτιώσεις σしぐまτたうοおみくろん βασικό προγραμματιστικό υπόδειγμα, όπως οおみくろんιいおた αντικειμενοστρεφείς γλώσσες μοντελοποίησης λογισμικού, τたうαあるふぁ σχεδιαστικά πρότυπα κかっぱ.λらむだπぱい. Τたうοおみくろん 2001 ηいーた Microsoft εστίασε τたうηいーたνにゅー προσοχή της σしぐまτたうηいーたνにゅー πλατφόρμα .NET, μία ανταγωνιστική της Java πλατφόρμα ανάπτυξης κかっぱαあるふぁιいおた εκτέλεσης λογισμικού, ηいーた οποία ήταν εいぷしろんξくしー ολοκλήρου προσανατολισμένη σしぐまτたうηいーたνにゅー αντικειμενοστρέφεια.

Κεντρική ιδέα σしぐまτたうοおみくろんνにゅー αντικειμενοστρεφή προγραμματισμό είναι ηいーた κλάση (class), μία αυτοτελής κかっぱαあるふぁιいおた αφαιρετική αναπαράσταση κάποιας κατηγορίας αντικειμένων, είτε φυσικών αντικειμένων τたうοおみくろんυうぷしろん πραγματικού κόσμου είτε νοητών, εννοιολογικών αντικειμένων, σしぐまεいぷしろん ένα περιβάλλον προγραμματισμού. Πρακτικώς είναι ένας τύπος δεδομένων, ή αλλιώς τたうοおみくろん προσχέδιο μιας δομής δεδομένων μみゅーεいぷしろん δικά της περιεχόμενα, τόσο μεταβλητές όσο κかっぱαあるふぁιいおた διαδικασίες. Τたうαあるふぁ περιεχόμενα αυτά δηλώνονται είτε ως δημόσια (public) είτε ως ιδιωτικά (private), μみゅーεいぷしろん τたうαあるふぁ ιδιωτικά νにゅーαあるふぁ μみゅーηいーたνにゅー είναι προσπελάσιμα από κώδικα εκτός της κλάσης. Οおみくろんιいおた διαδικασίες τたうωおめがνにゅー κλάσεων συνήθως καλούνται μέθοδοι (methods) κかっぱαあるふぁιいおた οおみくろんιいおた μεταβλητές τους γνωρίσματα (attributes) ή πεδία (fields). Μία κλάση πρέπει ιδανικά νにゅーαあるふぁ είναι εννοιολογικά αυτοτελής, νにゅーαあるふぁ περιέχει δηλαδή μόνο πεδία τたうαあるふぁ οποία περιγράφουν μία κατηγορία αντικειμένων κかっぱαあるふぁιいおた δημόσιες μεθόδους οおみくろんιいおた οποίες επενεργούν σしぐまεいぷしろん αυτά όταν καλούνται από τたうοおみくろん εξωτερικό πρόγραμμα, χωρίς νにゅーαあるふぁ εξαρτώνται από άλλα δεδομένα ή κώδικα εκτός της κλάσης, κかっぱαあるふぁιいおた επαναχρησιμοποιήσιμη, νにゅーαあるふぁ αποτελεί δηλαδή μαύρο κουτί δυνάμενο νにゅーαあるふぁ λειτουργήσει χωρίς τροποποιήσεις ως τμήμα διαφορετικών προγραμμάτων.

Αντικείμενο (object) είναι τたうοおみくろん στιγμιότυπο μίας κλάσης, δηλαδή αυτή καθαυτή ηいーた δομή δεδομένων (μみゅーεいぷしろん αποκλειστικά δεσμευμένο χώρο σしぐまτたうηいーた μνήμη) βασισμένη σしぐまτたうοおみくろん «καλούπι» πぱいοおみくろんυうぷしろん προσφέρει ηいーた κλάση. Παραδείγματος χάριν, σしぐまεいぷしろん μία αντικειμενοστρεφή γλώσσα προγραμματισμού θしーたαあるふぁ μπορούσαμε νにゅーαあるふぁ ορίσουμε κάποια κλάση ονόματι BankAccount, ηいーた οποία αναπαριστά έναν τραπεζικό λογαριασμό, κかっぱαあるふぁιいおた νにゅーαあるふぁ δηλώσουμε ένα αντικείμενο της μみゅーεいぷしろん όνομα MyAccount. Τたうοおみくろん αντικείμενο αυτό θしーたαあるふぁ έχει δεσμεύσει χώρο σしぐまτたうηいーた μνήμη μみゅーεいぷしろん βάση τις μεταβλητές κかっぱαあるふぁιいおた τις μεθόδους πぱいοおみくろんυうぷしろん περιγράψαμε όταν δηλώσαμε τたうηいーたνにゅー κλάση. Έτσι, σしぐまτたうοおみくろん αντικείμενο θしーたαあるふぁ μπορούσε νにゅーαあるふぁ περιέχεται ένα γνώρισμα Balance (=υπόλοιπο) κかっぱαあるふぁιいおた μία μέθοδος GetBalance (=επίστρεψε τたうοおみくろん υπόλοιπο). Ακολούθως, θしーたαあるふぁ μπορούσαμε νにゅーαあるふぁ δημιουργήσουμε ακόμα ένα ή περισσότερα αντικείμενα της ίδιας κλάσης, τたうαあるふぁ οποία θしーたαあるふぁ είναι διαφορετικές δομές δεδομένων (διαφορετικοί τραπεζικοί λογαριασμοί σしぐまτたうοおみくろん παράδειγμα). Τたうαあるふぁ αντικείμενα μιας κλάσης μπορούν νにゅーαあるふぁ προσπελάσουν τたうαあるふぁ ιδιωτικά περιεχόμενα άλλων αντικειμένων της ίδιας κλάσης.

Ενθυλάκωση δεδομένων (data encapsulation) καλείται ηいーた ιδιότητα πぱいοおみくろんυうぷしろん προσφέρουν οおみくろんιいおた κλάσεις νにゅーαあるふぁ «κρύβουν» τたうαあるふぁ ιδιωτικά δεδομένα τους από τたうοおみくろん υπόλοιπο πρόγραμμα κかっぱαあるふぁιいおた νにゅーαあるふぁ εξασφαλίζουν πως μόνο μέσω τたうωおめがνにゅー δημόσιων μεθόδων τους θしーたαあるふぁ μπορούν αυτά νにゅーαあるふぁ προσπελαστούν. Αυτή ηいーた τακτική παρουσιάζει μόνο οφέλη καθώς εξαναγκάζει κάθε εξωτερικό πρόγραμμα νにゅーαあるふぁ φιλτράρει τたうοおみくろん χειρισμό πぱいοおみくろんυうぷしろん επιθυμεί νにゅーαあるふぁ κάνει σしぐまτたうαあるふぁ πεδία μίας κλάσης μέσω τたうωおめがνにゅー ελέγχων πぱいοおみくろんυうぷしろん μπορούν νにゅーαあるふぁ περιέχονται στις δημόσιες μεθόδους της κλάσης.

Αφαίρεση δεδομένων καλείται ηいーた ιδιότητα τたうωおめがνにゅー κλάσεων νにゅーαあるふぁ αναπαριστούν αφαιρετικά πολύπλοκες οντότητες σしぐまτたうοおみくろん προγραμματιστικό περιβάλλον. Μία κλάση αποτελεί ένα αφαιρετικό μοντέλο κάποιας κατηγορίας αντικειμένων. Επίσης, οおみくろんιいおた κλάσεις προσφέρουν κかっぱαあるふぁιいおた αφαίρεση ως προς τたうοおみくろんνにゅー υπολογιστή, εφόσον ηいーた καθεμία μπορεί νにゅーαあるふぁ θεωρηθεί ένας μικρός κかっぱαあるふぁιいおた αυτάρκης υπολογιστής (μみゅーεいぷしろん δική τたうοおみくろんυうぷしろん κατάσταση, μεθόδους κかっぱαあるふぁιいおた μεταβλητές).

Κληρονομικότητα ονομάζεται ηいーた ιδιότητα τたうωおめがνにゅー κλάσεων νにゅーαあるふぁ επεκτείνονται σしぐまεいぷしろん νέες κλάσεις, ρητά δηλωμένες ως κληρονόμους (υποκλάσεις ή 'θυγατρικές κλάσεις'), οおみくろんιいおた οποίες μπορούν νにゅーαあるふぁ επαναχρησιμοποιήσουν τις μεταβιβάσιμες μεθόδους κかっぱαあるふぁιいおた ιδιότητες της γονικής τους κλάσης αλλά κかっぱαあるふぁιいおた νにゅーαあるふぁ προσθέσουν δικές τους. Στιγμιότυπα τたうωおめがνにゅー θυγατρικών κλάσεων μπορούν νにゅーαあるふぁ χρησιμοποιηθούν όπου απαιτούνται στιγμιότυπα τたうωおめがνにゅー γονικών (εφόσον ηいーた θυγατρική είναι κατά κάποιον τρόπο μία πぱいιいおたοおみくろん εξειδικευμένη εκδοχή της γονικής), αλλά τたうοおみくろん αντίστροφο δでるたεいぷしろんνにゅー ισχύει. Παράδειγμα κληρονομικότητας είναι μία γονική κλάση Vehicle (=Όχημα) κかっぱαあるふぁιいおた οおみくろんιいおた δύο πぱいιいおたοおみくろん εξειδικευμένες υποκλάσεις της Car (=Αυτοκίνητο) κかっぱαあるふぁιいおた Bicycle (=Ποδήλατο), οおみくろんιいおた οποίες λέμε ότι "κληρονομούν" από αυτήν. Πολλαπλή κληρονομικότητα είναι ηいーた δυνατότητα πぱいοおみくろんυうぷしろん προσφέρουν ορισμένες γλώσσες προγραμματισμού μία κλάση νにゅーαあるふぁ κληρονομεί ταυτόχρονα από περισσότερες από μία γονικές. Από μία υποκλάση μπορούν νにゅーαあるふぁ προκύψουν νέες υποκλάσεις πぱいοおみくろんυうぷしろん κληρονομούν από αυτήν, μみゅーεいぷしろん αποτέλεσμα μία ιεραρχία κλάσεων πぱいοおみくろんυうぷしろん συνδέονται μεταξύ τους "ανά γενιά" μみゅーεいぷしろん σχέσεις κληρονομικότητας.

Υπερφόρτωση μεθόδου (method overloading) είναι ηいーた κατάσταση κατά τたうηいーたνにゅー οποία υπάρχουν, σしぐまτたうηいーたνにゅー ίδια ή σしぐまεいぷしろん διαφορετικές κλάσεις, μέθοδοι μみゅーεいぷしろん τたうοおみくろん ίδιο όνομα κかっぱαあるふぁιいおた πιθανώς διαφορετικά ορίσματα. Αあるふぁνにゅー πρόκειται γがんまιいおたαあるふぁ μεθόδους της ίδιας κλάσης διαφοροποιούνται μόνο από τις διαφορές τους σしぐまτたうαあるふぁ ορίσματα κかっぱαあるふぁιいおた σしぐまτたうοおみくろんνにゅー τύπο επιστροφής.

Υποσκέλιση μεθόδου (method overriding) είναι ηいーた κατάσταση κατά τたうηいーたνにゅー οποία μία θυγατρική κλάση κかっぱαあるふぁιいおた ηいーた γονική της έχουν μία μέθοδο ομώνυμη κかっぱαあるふぁιいおた μみゅーεいぷしろん τたうαあるふぁ ίδια ορίσματα. Χάρη σしぐまτたうηいーた δυνατότητα τたうοおみくろんυうぷしろん πολυμορφισμού οおみくろん μεταγλωττιστής «ξέρει» πότε νにゅーαあるふぁ καλέσει πぱいοおみくろんιいおたαあるふぁ μέθοδο, βασισμένος σしぐまτたうοおみくろんνにゅー τύπο τたうοおみくろんυうぷしろん τρέχοντος αντικειμένου. Δηλαδή πολυμορφισμός είναι ηいーた δυνατότητα τたうωおめがνにゅー αντικειμενοστρεφών μεταγλωττιστών νにゅーαあるふぁ αποφασίζουν δυναμικά πぱいοおみくろんιいおたαあるふぁ είναι ηいーた κατάλληλη νにゅーαあるふぁ κληθεί μέθοδος σしぐまεいぷしろん συνθήκες υποσκέλισης.

Αφηρημένη κλάση (abstract class) είναι μία κλάση πぱいοおみくろんυうぷしろん ορίζεται μόνο γがんまιいおたαあるふぁ νにゅーαあるふぁ κληρονομηθεί σしぐまεいぷしろん θυγατρικές υποκλάσεις κかっぱαあるふぁιいおた δでるたεいぷしろんνにゅー υπάρχουν δικά της στιγμιότυπα (αντικείμενα). Ηいーた αφηρημένη κλάση ορίζει απλώς ένα "συμβόλαιο" τたうοおみくろん οποίο θしーたαあるふぁ πρέπει νにゅーαあるふぁ ακολουθούν οおみくろんιいおた υποκλάσεις της όσον αφορά τις υπογραφές τたうωおめがνにゅー μεθόδων τους (όπου ως υπογραφή ορίζεται τたうοおみくろん όνομα, τたうαあるふぁ ορίσματα κかっぱαあるふぁιいおた ηいーた τιμή επιστροφής μίας διαδικασίας). Μία αφηρημένη κλάση μπορεί νにゅーαあるふぁ έχει κかっぱαあるふぁιいおた μみゅーηいーた αφηρημένες μεθόδους οおみくろんιいおた οποίες υλοποιούνται σしぐまτたうηいーたνにゅー ίδια τたうηいーたνにゅー κλάση (αあるふぁνにゅー κかっぱαあるふぁιいおた φυσικά μπορούν νにゅーαあるふぁ υποσκελίζονται σしぐまεいぷしろん υποκλάσεις). Αντιθέτως, οおみくろんιいおた αφηρημένες μέθοδοί της είναι απλώς ένας ορισμός της υπογραφής τους κかっぱαあるふぁιいおた εναπόκειται στις υποκλάσεις νにゅーαあるふぁ τις υλοποιήσουν. Μία αφηρημένη κλάση πぱいοおみくろんυうぷしろん δでるたεいぷしろんνにゅー έχει γνωρίσματα κかっぱαあるふぁιいおた όλες οおみくろんιいおた μέθοδοί της είναι αφηρημένες κかっぱαあるふぁιいおた δημόσιες καλείται διασύνδεση (interface). Οおみくろんιいおた κλάσεις πぱいοおみくろんυうぷしろん κληρονομούν από μία διασύνδεση λέγεται ότι τたうηいーたνにゅー "υλοποιούν".

Ακολουθεί ένα απλό παράδειγμα σしぐまεいぷしろん γλώσσα προγραμματισμού Java:

interface Logger {
   public void log(String msg);
}

class ConsoleLogger implements Logger {
   public void log(String msg) {
      System.err.println("\nConsole logging..." + msg + "\n");
   }
}

class FileLogger implements Logger {
   public void log(String msg) {
       System.out.println("\nFile logging..." + msg + "\n");
   }
}

public class LogTest {
    public static void main(String[] args) {
       if (args.length != 1) {
           System.out.println("\nError. Exiting...");
           return;
       }
       Logger logg;
       String choice = args[0];
       if (choice.equals("FileLogger")) {
          logg = new FileLogger();
       } else if (choice.equals("ConsoleLogger")) {
          logg = new ConsoleLogger();
       } else {
          System.err.println("\nError. Exiting...");
          return;
       }
       logg.log("Log This!");
    }
}

Σしぐまτたうοおみくろん παραπάνω παράδειγμα ορίζουμε μία διασύνδεση Logger ηいーた οποία παρέχει τたうηいーたνにゅー υπογραφή μίας μεθόδου log, πぱいοおみくろんυうぷしろん υποθέτουμε πως πρέπει νにゅーαあるふぁ καταγράφει κάπου πληροφορίες γがんまιいおたαあるふぁ τたうαあるふぁ σφάλματα πぱいοおみくろんυうぷしろん συναντά ηいーた εφαρμογή όταν εκτελείται (οおみくろんιいおた πληροφορίες αυτές τής μεταβιβάζονται μみゅーεいぷしろん τたうοおみくろん αλφαριθμητικό όρισμα msg). Ηいーた κλάση ConsoleLogger κかっぱαあるふぁιいおた ηいーた κλάση FileLogger είναι δύο διαφορετικές κλάσεις πぱいοおみくろんυうぷしろん υλοποιούν τたうηいーた διασύνδεση Logger κかっぱαあるふぁιいおた υποσκελίζουν, ηいーた καθεμία μみゅーεいぷしろん διαφορετικό τρόπο, τたうηいーた μέθοδο log ώστε ηいーた μία νにゅーαあるふぁ καταγράφει πληροφορίες σしぐまτたうηいーたνにゅー οθόνη κかっぱαあるふぁιいおた ηいーた άλλη σしぐまεいぷしろん κάποιο αρχείο.

Τたうοおみくろん πρόγραμμα LogTest είναι ένα μικρό δοκιμαστικό πρόγραμμα τたうοおみくろん οποίο δέχεται ως όρισμα γραμμής εντολών τたうοおみくろん πού επιθυμεί οおみくろん χρήστης νにゅーαあるふぁ γίνεται ηいーた καταγραφή κかっぱαあるふぁιいおた δημιουργεί ένα στιγμιότυπο της αντίστοιχης κλάσης: της ConsoleLogger ή της FileLogger. Τたうοおみくろん στιγμιότυπο αυτό δηλώνεται μみゅーεいぷしろん τたうοおみくろんνにゅー γενικότερο τύπο Logger, τたうοおみくろんνにゅー τύπο δηλαδή της διασύνδεσης πぱいοおみくろんυうぷしろん υλοποιούν κかっぱαあるふぁιいおた οおみくろんιいおた δύο κλάσεις, αλλά χάρη σしぐまτたうοおみくろんνにゅー πολυμορφισμό καλείται αυτομάτως ηいーた κατάλληλη εκδοχή της μεθόδου log.

Αρχές αντικειμενοστρεφούς σχεδίασης

Επεξεργασία

Μみゅーεいぷしろん τたうοおみくろん πέρασμα τたうοおみくろんυうぷしろん χρόνου κωδικοποιήθηκαν κάποιες ανεπίσημες αρχές γがんまιいおたαあるふぁ τたうηいーたνにゅー ορθή σχεδίαση αντικειμενοστρεφών συστημάτων λογισμικού. Οおみくろんιいおた αρχές αυτές παρουσιάστηκαν κατά καιρούς σしぐまεいぷしろん βιβλία κかっぱαあるふぁιいおた άρθρα ακαδημαϊκών κかっぱαあるふぁιいおた αναγνωρισμένων μηχανικών λογισμικού. Οおみくろんιいおた σπουδαιότερες αρχές είναι οおみくろんιいおた παρακάτω:

  • Αρχή ανοιχτότητας-κλειστότητας (open-closed principle), τたうοおみくろんυうぷしろん δημιουργού της γλώσσας προγραμματισμού Eiffel Μπέρτραντ Μέιερ. Ηいーた αρχή αυτή δηλώνει πως τたうαあるふぁ συστατικά ενός προγράμματος πρέπει νにゅーαあるふぁ είναι "ανοιχτά" ως προς τたうηいーたνにゅー επέκταση τたうωおめがνにゅー δυνατοτήτων τたうοおみくろんυうぷしろん συστήματος αλλά "κλειστά" ως προς αλλαγές σしぐまτたうηいーたνにゅー υλοποίηση τたうοおみくろんυうぷしろん. Πρακτικώς αυτό σημαίνει οおみくろんιいおた διάφορες κλάσεις κかっぱαあるふぁιいおた τたうαあるふぁ υπόλοιπα τμήματα λογισμικού νにゅーαあるふぁ μみゅーηいーた χρειάζεται νにゅーαあるふぁ τροποποιηθούν σしぐまεいぷしろん περίπτωση πぱいοおみくろんυうぷしろん προστεθεί νέα λειτουργικότητα σしぐまτたうοおみくろん σύστημα (πぱい.χかい. μία νέα κλάση) προκειμένου νにゅーαあるふぁ τたうηいーたνにゅー αξιοποιήσουν. Βεβαίως είναι αδύνατο νにゅーαあるふぁ μみゅーηいーた χρειάζεται νにゅーαあるふぁ τροποποιηθεί τίποτα, οπότε αυτό πぱいοおみくろんυうぷしろん επιτάσσει σしぐまτたうηいーたνにゅー πραγματικότητα ηいーた εいぷしろんνにゅー λόγω αρχή είναι ηいーた ελαχιστοποίηση κかっぱαあるふぁιいおた ηいーた συγκέντρωση, κατά προτίμηση σしぐまεいぷしろん ένα μικρό τμήμα τたうοおみくろんυうぷしろん κώδικα, τたうωおめがνにゅー γραμμών πぱいοおみくろんυうぷしろん θしーたαあるふぁ πρέπει νにゅーαあるふぁ αλλάξουν. Αυτό συνήθως επιτυγχάνεται μέσω αφαίρεσης (μみゅーεいぷしろん αφηρημένες κλάσεις ή διασυνδέσεις κかっぱαあるふぁιいおた πραγματικές κλάσεις πぱいοおみくろんυうぷしろん κληρονομούν από αυτές) κかっぱαあるふぁιいおた μみゅーεいぷしろん χρήση τたうοおみくろんυうぷしろん πολυμορφισμού. Έτσι, σしぐまτたうοおみくろん παράδειγμα της προηγούμενης ενότητας αあるふぁνにゅー προσθέσουμε κかっぱαあるふぁιいおた μία τρίτη υλοποίηση της διασύνδεσης Logger, τたうηいーたνにゅー PrinterLogger ηいーた οποία "καταγράφει" σφάλματα αποστέλλοντας τたうαあるふぁ προς εκτύπωση, οおみくろん κώδικας τたうοおみくろんυうぷしろん προγράμματος γίνεται:
public class LogTest {
    public static void main(String[] args) {
       if (args.length != 1) {
           System.out.println("\nError. Exiting...");
           return;
       }
       Logger logg;
       String choice = args[0];
       if (choice.equals("FileLogger")) {
          logg = new FileLogger();
       } else if(choice.equals("ConsoleLogger")) {
          logg = new ConsoleLogger();
       } else if(choice.equals("PrinterLogger")) {
          logg = new PrinterLogger();
       } else {
          System.err.println("\nError. Exiting...");
          return;
       }
       logg.log("Log This!");
    }
}

Όπως φαίνεται μόνη αλλαγή είναι ηいーた προσθήκη μίας ακόμα δήλωσης else if. Ηいーた εντολή

logg.log("Log This!");

μπορεί νにゅーαあるふぁ λειτουργήσει κかっぱαあるふぁιいおた μみゅーεいぷしろん αντικείμενα τたうοおみくろんυうぷしろん νέου τύπου χωρίς καμία τροποποίηση. Μία συνηθισμένη τακτική γがんまιいおたαあるふぁ διασφάλιση της κλειστότητας τたうοおみくろんυうぷしろん ολικού προγράμματος ως προς τたうηいーたνにゅー υλοποίηση μίας κλάσης, είναι ηいーた συνειδητή προσπάθεια γがんまιいおたαあるふぁ δήλωση όλων τたうωおめがνにゅー γνωρισμάτων της ως ιδιωτικών. Έτσι ηいーた προσπέλαση τたうωおめがνにゅー πεδίων της κλάσης μπορεί νにゅーαあるふぁ ελεγχθεί εいぷしろんξくしー ολοκλήρου μέσω ειδικών δημόσιων μεθόδων της, γεγονός πぱいοおみくろんυうぷしろん διευκολύνει κατά πολύ τたうηいーたνにゅー αποσφαλμάτωση: στις μεθόδους αυτές συγκεντρώνονται οおみくろんιいおた έλεγχοι επιτρεπτών τιμών γがんまιいおたαあるふぁ τたうαあるふぁ πεδία, έλεγχοι κατάλληλων συνθηκών κかっぱλらむだπぱい.

  • Αρχή υποκατάστασης Λίσκοφ (Liskov substitution principle), της επιστήμονα υπολογιστών Μπάρμπαρα Λίσκοφ. Ηいーた αρχή αυτή συμπυκνώνεται σしぐまτたうοおみくろんνにゅー παρακάτω κανόνα γがんまιいおたαあるふぁ σχηματισμό μίας ορθής ιεραρχίας κλάσεων: μία κλάση Κかっぱ1 μπορεί νにゅーαあるふぁ υλοποιηθεί ως υποκλάση μίας κλάσης Κかっぱ2 αあるふぁνにゅー κάθε πρόγραμμα Πぱい τたうοおみくろん οποίο λειτουργεί μみゅーεいぷしろん αντικείμενα Κかっぱ2 συμπεριφέρεται μみゅーεいぷしろん τたうοおみくろんνにゅー ίδιο τρόπο κかっぱαあるふぁιいおた μみゅーεいぷしろん αντίστοιχα αντικείμενα Κかっぱ1. Έτσι μみゅーεいぷしろん τたうηいーたνにゅー αρχή υποκατάστασης Λίσκοφ φαίνεται πως γがんまιいおたαあるふぁ νにゅーαあるふぁ οριστεί μία κλάση ως θυγατρική μίας άλλης δでるたεいぷしろんνにゅー αρκεί νにゅーαあるふぁ έχουν διαισθητικά μία ανάλογη εννοιολογική σχέση (πぱい.χかい. μία κλάση πぱいοおみくろんυうぷしろん αναπαριστά όχημα κかっぱαあるふぁιいおた μία πぱいοおみくろんυうぷしろん αναπαριστά αυτοκίνητο) αλλά, σしぐまτたうοおみくろん πλαίσιο τたうοおみくろんυうぷしろん υπό εξέταση προγράμματος, τたうαあるふぁ αντικείμενα της υποκλάσης νにゅーαあるふぁ έχουν πάντα τたうηいーたνにゅー ίδια προγραμματιστική συμπεριφορά μみゅーεいぷしろん τたうαあるふぁ αντικείμενα της υπερκλάσης υπό τις ίδιες συνθήκες.
  • Αρχή αντιστροφής εξαρτήσεων (dependency inversion principle), τたうοおみくろんυうぷしろん γνωστού μηχανικού λογισμικού Ρόμπερτ Σέσιλ Μάρτιν. Ηいーた αρχή αυτή πρακτικά αποτελεί εκλέπτυνση της αρχής ανοιχτότητας-κλειστότητας, προϋποθέτοντας όμως χρήση κかっぱαあるふぁιいおた της αρχής υποκατάστασης Λίσκοφ. Αφορά ιεραρχίες κληρονομικότητας κλάσεων κかっぱαあるふぁιいおた τたうηいーた χρήση αντικειμένων αυτών τたうωおめがνにゅー ιεραρχιών από εξωτερικά προγράμματα. Σしぐまτたうαあるふぁ πλαίσια της αρχής αντιστροφής εξαρτήσεων ένα τμήμα λογισμικού Αあるふぁ (πぱい.χかい. μία κλάση) τたうοおみくろん οποίο χρησιμοποιεί τις υπηρεσίες πぱいοおみくろんυうぷしろん παρέχει ένα άλλο τμήμα λογισμικού Βべーた, καλώντας γがんまιいおたαあるふぁ παράδειγμα μία μέθοδό τたうοおみくろんυうぷしろん, θεωρείται στοιχείο "υψηλότερου επιπέδου" σしぐまεいぷしろん σχέση μみゅーεいぷしろん τたうοおみくろん Βべーた. Ηいーた αρχή λέει πως τたうαあるふぁ υψηλού επιπέδου στοιχεία δでるたεいぷしろんνにゅー πρέπει νにゅーαあるふぁ εξαρτώνται από τたうηいーたνにゅー υλοποίηση χαμηλότερου επιπέδου στοιχείων, αλλά πως κかっぱαあるふぁιいおた τたうαあるふぁ δύο πρέπει νにゅーαあるふぁ βασίζονται σしぐまεいぷしろん ενδιάμεσα επίπεδα αφαίρεσης. Σしぐまτたうηいーたνにゅー πράξη αυτή ηいーた αφαίρεση είναι μία διασύνδεση (ή αφηρημένη κλάση) τたうηいーたνにゅー οποία γνωρίζει τたうοおみくろん υψηλού επιπέδου στοιχείο Αあるふぁ κかっぱαあるふぁιいおた υλοποιεί τたうοおみくろん χαμηλού επιπέδου στοιχείο Βべーた. Ακόμα κかっぱαあるふぁιいおた αあるふぁνにゅー τたうοおみくろん Βべーた αλλαχθεί μみゅーεいぷしろん μία κλάση Γがんま ηいーた οποία επίσης υλοποιεί τたうηいーたνにゅー ίδια διασύνδεση, τたうοおみくろん Αあるふぁ θしーたαあるふぁ πρέπει νにゅーαあるふぁ συνεχίσει νにゅーαあるふぁ λειτουργεί χωρίς καμία τροποποίηση. Ηいーた αρχή αντιστροφής εξαρτήσεων δでるたεいぷしろんνにゅー είναι παρά ένα απτό παράδειγμα χρήσης ιεραρχικών επιπέδων μみゅーεいぷしろん τたうηいーた βοήθεια ενδιάμεσων αφαιρέσεων, μίας πρακτικής πぱいοおみくろんυうぷしろん εφαρμόζεται κατά κόρον σしぐまτたうηいーたνにゅー επιστήμη υπολογιστών (γがんまιいおたαあるふぁ ένα άλλο παράδειγμα βλέπε δίκτυα υπολογιστών).
  • Αρχή διαχωρισμού διασυνδέσεων (interface segregation principle), τたうοおみくろんυうぷしろん μηχανικού λογισμικού Ρόμπερτ Σέσιλ Μάρτιν. Ηいーた εいぷしろんνにゅー λόγω αρχή σημαίνει ότι σしぐまεいぷしろん περιπτώσεις όπου διαφορετικά υποσύνολα μεθόδων μίας κλάσης αφορούν διαφορετικές περιπτώσεις χρήσης της κλάσης, σκόπιμο είναι νにゅーαあるふぁ ορίζουμε επιμέρους διασυνδέσεις τις οποίες ηいーた κλάση θしーたαあるふぁ υλοποιεί. Κάθε τέτοια διασύνδεση θしーたαあるふぁ ορίζει μόνο τたうοおみくろん αντίστοιχο υποσύνολο τたうωおめがνにゅー μεθόδων.
  • Αρχή μοναδικής αρμοδιότητας (single responsibility principle), τたうωおめがνにゅー Τたうοおみくろんμみゅー Νにゅーτたうεいぷしろん Μάρκο κかっぱαあるふぁιいおた Μέιρ Πέιτζ Τζόουνς. Σύμφωνα μみゅーεいぷしろん τたうηいーたνにゅー αρχή αυτή κάθε κλάση θしーたαあるふぁ πρέπει νにゅーαあるふぁ έχει μόνο μία, καλά ορισμένη κかっぱαあるふぁιいおた διαχωρισμένη από τたうοおみくろん υπόλοιπο πρόγραμμα αρμοδιότητα, ηいーた ύπαρξη της οποίας νにゅーαあるふぁ εξυπηρετεί έναν συγκεκριμένο σκοπό. Αあるふぁνにゅー μπορούμε νにゅーαあるふぁ εντοπίσουμε σしぐまεいぷしろん μία κλάση Αあるふぁ δύο διαφορετικές αρμοδιότητες, τότε ηいーた καλύτερη λύση είναι ηいーた διάσπαση της σしぐまεいぷしろん δύο κλάσεις Βべーた' κかっぱαあるふぁιいおた Γがんま', καθεμία από τις οποίες θしーたαあるふぁ λάβει ένα υποσύνολο τたうωおめがνにゅー πεδίων κかっぱαあるふぁιいおた τたうωおめがνにゅー μεθόδων της Αあるふぁ. Τたうαあるふぁ υποσύνολα αυτά θしーたαあるふぁ είναι ξένα μεταξύ τους, οπότε μみゅーεいぷしろん τたうοおみくろん ανάποδο σκεπτικό αあるふぁνにゅー μπορούμε νにゅーαあるふぁ διασπάσουμε μία κλάση Αあるふぁ σしぐまεいぷしろん δύο άλλες κλάσεις (πぱい.χかい. σしぐまεいぷしろん περίπτωση πぱいοおみくろんυうぷしろん κάποιες μέθοδοι δでるたεいぷしろん χρησιμοποιούν κάποια γνωρίσματα, οπότε οおみくろんιいおた μみゅーεいぷしろんνにゅー μπορούν νにゅーαあるふぁ καταλήξουν σしぐまτたうηいーた μία κλάση Βべーた' κかっぱαあるふぁιいおた τたうαあるふぁ πεδία σしぐまτたうηいーたνにゅー άλλη κλάση Γがんま') τότε πιθανώς ηいーた κλάση νにゅーαあるふぁ παραβιάζει τたうηいーたνにゅー αρχή μοναδικής αρμοδιότητας. Έτσι έχουν προταθεί κάποιες μετρικές οおみくろんιいおた οποίες επιχειρούν νにゅーαあるふぁ προσδιορίσουν τたうηいーたνにゅー έλλειψη συνοχής (cohesion) σしぐまεいぷしろん μία κλάση, δηλαδή τたうοおみくろん κατά πόσον οおみくろんιいおた μέθοδοι της δでるたεいぷしろん σχετίζονται μみゅーεいぷしろん τたうαあるふぁ γνωρίσματα της. Συνήθως ηいーた συνοχή αντιπαραβάλλεται μみゅーεいぷしろん τたうηいーた σύζευξη (coupling), δηλαδή τたうοおみくろん βαθμό σしぐまτたうοおみくろんνにゅー οποίον μία κλάση εξαρτάται από κάποια/ες άλλη/ες, κかっぱαあるふぁιいおた τたうαあるふぁ δύο αυτά μεγέθη είναι αντιστρόφως ανάλογα.

Μετρικές ποιότητας

Επεξεργασία

Κατά καιρούς έχουν οριστεί κάποιες μετρικές γがんまιいおたαあるふぁ τたうηいーたνにゅー εκτίμηση της περιπλοκότητας κかっぱαあるふぁιいおた της ποιότητας μίας αντικειμενοστρεφούς σχεδίασης λογισμικού. Σしぐまεいぷしろん αυτές συμπεριλαμβάνονται κかっぱαあるふぁιいおた οおみくろんιいおた μετρικές έλλειψης συνοχής (LCOM). Ακολουθεί μία σύνοψη τたうωおめがνにゅー σπουδαιότερων:

Weighted Methods per Class (WMC)

Επεξεργασία

Τたうοおみくろん ακέραιο πλήθος τたうωおめがνにゅー μεθόδων πぱいοおみくろんυうぷしろん ορίζονται σしぐまεいぷしろん μία κλάση. Δでるたεいぷしろんνにゅー υπάρχει ένα καθιερωμένο εύρος βέλτιστου WMC αλλά είναι γενικώς αποδεκτό ότι υπερβολικά μεγάλο WMC οδηγεί σしぐまεいぷしろん μεγαλύτερη πιθανότητα σφαλμάτων κかっぱαあるふぁιいおた προβλημάτων συντήρησης.

Depth of Inheritance Tree (DIT)

Επεξεργασία

Τたうοおみくろん μήκος τたうοおみくろんυうぷしろん μέγιστου μονοπατιού κληρονομικότητας από τたうηいーたνにゅー τρέχουσα κλάση έως τたうηいーた ρίζα μιας ιεραρχίας κλάσεων. Μεγάλες τιμές DIT αυξάνουν τたうηいーたνにゅー πολυπλοκότητα της σχεδίασης, τたうηいーたνにゅー πιθανότητα σφαλμάτων αλλά κかっぱαあるふぁιいおた τたうηいーたνにゅー επαναχρησιμοποίηση κώδικα λόγω της κληροδότησης μεθόδων. Μία βέλτιστη τιμή DIT θεωρείται τたうοおみくろん 5.

Number of Children (NOC)

Επεξεργασία

Τたうοおみくろん πλήθος τたうωおめがνにゅー κλάσεων πぱいοおみくろんυうぷしろん κληρονομούν άμεσα από τたうηいーたνにゅー τρέχουσα. Υψηλό NOC σημαίνει υψηλή επαναχρησιμοποίηση κώδικα αλλά πιθανόν νにゅーαあるふぁ υποδεικνύει εννοιολογικά εσφαλμένη χρήση της κληρονομικότητας. Δでるたεいぷしろんνにゅー υπάρχει κάποιο γενικώς αποδεκτό βέλτιστο NOC, αφού αυτό εξαρτάται από τたうηいーたνにゅー εκάστοτε κλάση, αλλά εいぷしろんνにゅー γένει οおみくろんιいおた κλάσεις οおみくろんιいおた ευρισκόμενες υψηλότερα σしぐまτたうηいーたνにゅー ιεραρχία κληρονομικότητας είναι θεμιτό νにゅーαあるふぁ έχουν υψηλότερο NOC από όσες τοποθετούνται χαμηλότερα αφού είναι λιγότερο εξειδικευμένες.

Coupling Between Object Classes (CBO)

Επεξεργασία

Τたうοおみくろん πλήθος τたうωおめがνにゅー κλάσεων από τις οποίες εξαρτάται ηいーた τρέχουσα κλάση. Κάθε τέτοια εξάρτηση μπορεί νにゅーαあるふぁ είναι αμφίδρομη ή μονόδρομη οποιασδήποτε κατεύθυνσης. Επομένως υψηλό CBO σημαίνει υψηλή σύζευξη (coupling) κかっぱαあるふぁιいおた δでるたεいぷしろんνにゅー είναι επιθυμητό, καθώς αποτρέπει τたうηいーたνにゅー επαναχρησιμοποίηση κώδικα κかっぱαあるふぁιいおた ζημιώνει τたうοおみくろんνにゅー αρθρωτό σχεδιασμό τたうοおみくろんυうぷしろん προγράμματος. Όσο χαμηλότερο είναι τたうοおみくろん CBO μίας κλάσης τόσο πιθανότερο είναι νにゅーαあるふぁ μπορεί ηいーた τελευταία νにゅーαあるふぁ επαναχρησιμοποιηθεί ως μαύρο κουτί. Υπερβολικά υψηλές θεωρούνται οおみくろんιいおた τιμές CBO > 14.

Response for a Class (RFC κかっぱαあるふぁιいおた RFC’)

Επεξεργασία

Ηいーた μετρική αυτή ισούται μみゅーεいぷしろん τたうοおみくろん πλήθος τたうωおめがνにゅー μεθόδων πぱいοおみくろんυうぷしろん μπορεί νにゅーαあるふぁ εκτελεστούν ως απάντηση σしぐまτたうηいーた λήψη ενός μηνύματος / συμβάντος από τたうηいーたνにゅー τρέχουσα κλάση (έστω Αあるふぁ), τόσο τοπικών της μεθόδων όσο κかっぱαあるふぁιいおた «απομακρυσμένων» μεθόδων άλλων κλάσεων οおみくろんιいおた οποίες καλούνται άμεσα από τたうηいーたνにゅー Αあるふぁ. Ηいーた μετρική RFC’ συμπεριλαμβάνει επιπλέον κかっぱαあるふぁιいおた τις απομακρυσμένες μεθόδους πぱいοおみくろんυうぷしろん καλούνται εμμέσως (πぱい. χかい. από άμεσα καλούμενες απομακρυσμένες μεθόδους ή, αναδρομικά, από άλλες έμμεσα καλούμενες απομακρυσμένες μεθόδους). Κάθε μέθοδος μετράται μόνο μία φορά σしぐまτたうοおみくろんνにゅー υπολογισμό τたうοおみくろんυうぷしろん RFC, ανεξαρτήτως τたうοおみくろんυうぷしろん πόσες φορές καλείται. Υψηλή τιμή RFC υποδεικνύει υψηλές πιθανότητες σφάλματος κかっぱαあるふぁιいおた δυσκολία συντήρησης.

Μετρική έλλειψης συνοχής. Ισχύει LCOM1 = P - Q αあるふぁνにゅー P > Q, διαφορετικά LCOM1 = 0. Τたうαあるふぁ P, Q υπολογίζονται μみゅーεいぷしろん τたうοおみくろんνにゅー ακόλουθο αλγόριθμο (σしぐまεいぷしろん ψευδοκώδικα):

P = 0; Q = 0;
Γがんまιいおたαあるふぁ κάθε ζεύγος μεθόδων της κλάσης
do
{
   Αあるふぁνにゅー τたうαあるふぁ σύνολα τたうωおめがνにゅー πεδίων πぱいοおみくろんυうぷしろん χρησιμοποιούν οおみくろんιいおた δύο τρέχουσες μέθοδοι είναι ξένα μεταξύ τους
      P = P + 1;
   Διαφορετικά
      Q = Q + 1;
}

Μία τιμή LCOM1 = 0 υποδεικνύει συνεκτική κλάση, ενώ αあるふぁνにゅー LCOM1 > 0 ηいーた κλάση καλό είναι νにゅーαあるふぁ διασπαστεί. Ηいーた μετρική LCOM1 παρουσιάζει κάποια προβλήματα, όπως πぱい.χかい. ότι δίνει τιμή 0 γがんまιいおたαあるふぁ κλάσεις πολύ διαφορετικές μεταξύ τους.

Βελτιωμένη μετρική έλλειψης συνοχής. Ισχύει LCOM2 = 1 - sum(mA)/(m*a), όπου m τたうοおみくろん πλήθος τたうωおめがνにゅー μεθόδων της κλάσης, a τたうοおみくろん πλήθος τたうωおめがνにゅー πεδίων της, mA τたうοおみくろん πλήθος τたうωおめがνにゅー μεθόδων πぱいοおみくろんυうぷしろん προσπελαύνουν ένα γνώρισμα κかっぱαあるふぁιいおた sum(mA) τたうοおみくろん άθροισμα τたうωおめがνにゅー mA γがんまιいおたαあるふぁ όλα τたうαあるふぁ πεδία μίας κλάσης. Ηいーた μετρική LCOM2 αποτελεί τたうοおみくろんνにゅー μέσο όρο τたうωおめがνにゅー ποσοστών τたうωおめがνにゅー μεθόδων πぱいοおみくろんυうぷしろん δでるたεいぷしろん χρησιμοποιούν κάθε γνώρισμα. LCOM2 = 0 (υψηλή συνοχή) σημαίνει πως όλες οおみくろんιいおた μέθοδοι της κλάσης χρησιμοποιούν όλα τたうαあるふぁ πεδία της, ενώ LCOM2 = 1 (καμία συνοχή) σημαίνει πως καμία μέθοδος δでるたεいぷしろんνにゅー προσπελαύνει κανένα πεδίο.

Εναλλακτική μετρική έλλειψης συνοχής. Ισχύει LCOM3 = (m - sum(mA)/a) / (m-1). Ηいーた μετρική LCOM3 λαμβάνει τιμές από 0 (υψηλή συνοχή) έως 2 (καμία συνοχή). Τιμές μεγαλύτερες τたうοおみくろんυうぷしろん 1 σημαίνουν πως μみゅーεいぷしろん βεβαιότητα υπάρχει τουλάχιστον ένα "νにゅーεκρό γνώρισμα", δηλαδή γνώρισμα τたうοおみくろん οποίο δでるたεいぷしろんνにゅー προσπελαύνεται από καμία μέθοδο της κλάσης.

Μετά τたうηいーたνにゅー ευρεία διάδοση τたうοおみくろんυうぷしろん ΑあるふぁΠぱい κατά τたうηいーた δεκαετία τたうοおみくろんυうぷしろん '90, τたうοおみくろん αντικειμενοστρεφές μοντέλο σχεδίασης (μみゅーεいぷしろん κλάσεις, κληρονομικότητα, αντικείμενα κかっぱαあるふぁιいおた τυποποιημένες αλληλεπιδράσεις μεταξύ τους) επικράτησε ακόμη κかっぱαあるふぁιいおた γがんまιいおたαあるふぁ μοντελοποίηση πぱいοおみくろんυうぷしろん δでるたεいぷしろんνにゅー περιελάμβανε κかっぱαあるふぁνにゅー προγραμματισμό (πぱい. χかい. σχήματα βάσεων δεδομένων). Έτσι αναπτύχθηκαν διάφορες πρότυπες γλώσσες μοντελοποίησης λογισμικού οおみくろんιいおた οποίες τυποποιούσαν οπτικά σύμβολα κかっぱαあるふぁιいおた συμπεριφορές μみゅーεいぷしろん στόχο τたうηいーたνにゅー αφαιρετική περιγραφή της λειτουργίας κかっぱαあるふぁιいおた της δομής ενός υπολογιστικού συστήματος. Οおみくろんιいおた γλώσσες αυτές είχαν εξαρχής έναν εμφανή αντικειμενοστρεφή προσανατολισμό. Τελικά οおみくろんιいおた πぱいιいおたοおみくろん δημοφιλείς από αυτές ενοποιήθηκαν σしぐまτたうοおみくろん κοινό πρότυπο UML πぱいοおみくろんυうぷしろん ηいーた πρώτη τたうοおみくろんυうぷしろん έκδοση οριστικοποιήθηκε τたうοおみくろん 1997.

Ηいーた UML πλέον είναι ηいーた πρότυπη γλώσσα μοντελοποίησης σしぐまτたうηいーた μηχανική λογισμικού. Χρησιμοποιείται γがんまιいおたαあるふぁ τたうηいーた γραφική απεικόνιση, προσδιορισμό, κατασκευή κかっぱαあるふぁιいおた τεκμηρίωση τたうωおめがνにゅー στοιχείων ενός συστήματος λογισμικού. Μπορεί νにゅーαあるふぁ χρησιμοποιηθεί σしぐまεいぷしろん διάφορες φάσεις ανάπτυξης, από τたうηいーたνにゅー ανάλυση απαιτήσεων ως τたうοおみくろんνにゅー έλεγχο ενός ολοκληρωμένου συστήματος, κかっぱαあるふぁιいおた αποτελείται από ένα σύνολο προσυμφωνημένων όρων, συμβόλων κかっぱαあるふぁιいおた διαγραμμάτων.

Σχεδιαστικά πρότυπα

Επεξεργασία

Κατά τたうαあるふぁ τέλη της δεκαετίας τたうοおみくろんυうぷしろん '70 ένας αρχιτέκτονας ονόματι Κρίστοφερ Αλεξάντερ επιχείρησε νにゅーαあるふぁ βべーたρろーεいぷしろんιいおた κかっぱαあるふぁιいおた νにゅーαあるふぁ καταγράψει αποδεδειγμένα ποιοτικούς σχεδιασμούς σしぐまτたうοおみくろんνにゅー τομέα τたうωおめがνにゅー κατασκευών. Έτσι μελέτησε πολλές διαφορετικές κατασκευές πぱいοおみくろんυうぷしろん εξυπηρετούσαν τたうοおみくろんνにゅー ίδιο σκοπό κかっぱαあるふぁιいおた προσπάθησε νにゅーαあるふぁ ανακαλύψει κοινά στοιχεία, τたうαあるふぁ οποία κατηγοριοποίησε σしぐまεいぷしろん σχεδιαστικά πρότυπα (design patterns). Τたうοおみくろん 1987 ηいーた ιδέα της εύρεσης σχεδιαστικών προτύπων εφαρμόστηκε γがんまιいおたαあるふぁ πρώτη φορά σしぐまτたうηいーた μηχανική λογισμικού κかっぱαあるふぁιいおた μέχρι τたうαあるふぁ μέσα της δεκαετίας τたうοおみくろんυうぷしろん '90 ηいーた εいぷしろんνにゅー λόγω έννοια είχε καθιερωθεί κかっぱαあるふぁιいおた εξαπλωθεί, στραμμένη πλέον σしぐまτたうοおみくろんνにゅー κόσμο της αντικειμενοστρέφειας.

Ένα πρότυπο σχεδίασης ορίζεται ως μία αποδεδειγμένα καλή λύση πぱいοおみくろんυうぷしろん έχει εφαρμοστεί μみゅーεいぷしろん επιτυχία σしぐまτたうηいーたνにゅー επίλυση ενός επαναλαμβανόμενου προβλήματος σχεδίασης συστημάτων λογισμικού. Τたうαあるふぁ πρότυπα σχεδίασης ορίζονται τόσο σしぐまεいぷしろん επίπεδο μακροσκοπικής σχεδίασης όσο κかっぱαあるふぁιいおた σしぐまεいぷしろん επίπεδο υλοποίησης, ενώ μみゅーεいぷしろん τたうηいーた χρήση τους ένας προγραμματιστής αντικαθιστά πρακτικώς μεγάλα τμήματα τたうοおみくろんυうぷしろん κώδικα τたうοおみくろんυうぷしろん μみゅーεいぷしろん μαύρα κουτιά. Πρόκειται γがんまιいおたαあるふぁ αφαιρέσεις υψηλού επιπέδου πぱいοおみくろんυうぷしろん αποτελούν πλήρη υποσυστήματα, κατάλληλα ρυθμισμένα γがんまιいおたαあるふぁ τたうηいーたνにゅー επίλυση συγκεκριμένων προβλημάτων κかっぱαあるふぁιいおた έτοιμα γがんまιいおたαあるふぁ χρήση. Έχουν οριστεί διάφορες κατηγορίες προτύπων, γがんまιいおたαあるふぁ διαφορετικά προβλήματα, κかっぱαあるふぁιいおた κάθε κατηγορία περιλαμβάνει πολλαπλά στοιχεία. Έτσι υπάρχουν κατασκευαστικά πρότυπα, δομικά πρότυπα, συμπεριφορικά πρότυπα κかっぱλらむだπぱい.

Δείτε επίσης

Επεξεργασία

Παραπομπές

Επεξεργασία
  1. Οおみくろん όρος object-oriented αποδόθηκε από τις ορολογικές ομάδες ΜみゅーΟおみくろんΤたうΟおみくろん κかっぱαあるふぁιいおた ΕいぷしろんΛらむだΟおみくろんΤたう/ΤΕ48/ΟΕ1 σしぐまτたうαあるふぁ ελληνικά ως αντικειμενοστρεφής, αλλά ηいーた λέξη απαντάται σしぐまτたうαあるふぁ ελληνικά κかっぱαあるふぁιいおた σしぐまαあるふぁνにゅー «αντικειμενοστραφής».
  2. «Γιατί χρησιμοποιείτε τたうοおみくろんνにゅー όρο αντικειμενοστρεφής κかっぱαあるふぁιいおた όχι αντικειμενοστραφής;» από ιστοσελίδα τたうοおみくろんυうぷしろん Διομήδη Σπινέλλη. Αρχειοθετήθηκε 13/01/2019. Ανακτήθηκε 13/01/2019.

Βιβλιογραφία κかっぱαあるふぁιいおた Πηγές

Επεξεργασία