Προγραμματισμός

Η συσχέτιση, η συγκέντρωση και η σύνθεση στο OOP εξηγούνται

Το Unified Modeling Language (UML) είναι ένα de-facto πρότυπο για μοντελοποίηση αντικειμενοστρεφών συστημάτων. Στο UML υπάρχουν πέντε διαφορετικοί τύποι σχέσεων: συσχέτιση, συνάθροιση, σύνθεση, εξάρτηση και κληρονομικότητα. Αυτό το άρθρο παρουσιάζει μια συζήτηση για τις τρεις πρώτες από αυτές τις έννοιες, αφήνοντας τις υπόλοιπες σε άλλη ανάρτηση ιστολογίου.

Σύνδεση σε αντικειμενοστρεφή προγραμματισμό

Η συσχέτιση είναι μια σημασιολογικά αδύναμη σχέση (μια σημασιολογική εξάρτηση) ανάμεσα σε διαφορετικά άσχετα αντικείμενα. Ένας συσχετισμός είναι μια σχέση «χρήσης» μεταξύ δύο ή περισσότερων αντικειμένων στα οποία τα αντικείμενα έχουν τη δική τους διάρκεια ζωής και δεν υπάρχει κάτοχος.

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

Στο UML μια σχέση συσχέτισης αντιπροσωπεύεται από ένα μόνο βέλος. Μια σχέση συσχέτισης μπορεί να αναπαρασταθεί ως ένα προς ένα, ένα προς πολλά ή πολλά προς πολλά (επίσης γνωστά ως καρδινιλότητα). Ουσιαστικά, μια σχέση συσχέτισης μεταξύ δύο ή περισσότερων αντικειμένων υποδηλώνει μια διαδρομή επικοινωνίας (που ονομάζεται επίσης σύνδεσμος) μεταξύ τους, έτσι ώστε ένα αντικείμενο να μπορεί να στείλει ένα μήνυμα σε άλλο. Το παρακάτω απόσπασμα κώδικα απεικονίζει τον τρόπο με τον οποίο συνδέονται δύο τάξεις, το BlogAccount και το BlogEntry.

δημόσια τάξη BlogAccount

   {

ιδιωτικό BlogEntry [] blogEntries;

// Άλλα μέλη της τάξης BlogAccount

   }

δημόσια τάξη BlogEntry

   {

Int32 blogId;

λεζάντα συμβολοσειράς;

κείμενο συμβολοσειράς;

// Άλλα μέλη της τάξης BlogEntry

   }

Συγκέντρωση σε αντικειμενοστρεφή προγραμματισμό

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

Για παράδειγμα, ένας υπάλληλος μπορεί να ανήκει σε ένα ή περισσότερα τμήματα ενός οργανισμού. Ωστόσο, εάν διαγραφεί το τμήμα εργαζομένου, το αντικείμενο του εργαζομένου δεν θα καταστραφεί, αλλά θα συνεχίσει να λειτουργεί. Λάβετε υπόψη ότι οι σχέσεις μεταξύ αντικειμένων που συμμετέχουν σε μια συγκέντρωση δεν μπορούν να είναι αμοιβαίες - δηλαδή, ένα τμήμα μπορεί να «κατέχει» έναν υπάλληλο, αλλά ο υπάλληλος δεν κατέχει το τμήμα. Στο ακόλουθο παράδειγμα κώδικα, μια σχέση συσσωμάτωσης είναι εμφανής μεταξύ των τάξεων BlogAuthor και BlogAccount.

δημόσια τάξη BlogAuthor

   {

ιδιωτικό Int32 authorId;

ιδιωτική συμβολοσειρά firstName;

ιδιωτική συμβολοσειρά lastName;

// Άλλα μέλη της τάξης BlogAuthor

   }

δημόσια τάξη BlogAccount

   {

ιδιωτικό BlogEntry [] blogEntries;

// Άλλα μέλη της τάξης BlogAccount

   }

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

Σύνθεση σε αντικειμενοστρεφή προγραμματισμό

Η σύνθεση είναι μια εξειδικευμένη μορφή συνάθροισης. Στη σύνθεση, εάν το γονικό αντικείμενο καταστραφεί, τότε τα θυγατρικά αντικείμενα παύουν επίσης να υπάρχουν. Η σύνθεση είναι στην πραγματικότητα ένας ισχυρός τύπος συσσωμάτωσης και μερικές φορές αναφέρεται ως σχέση «θανάτου». Για παράδειγμα, ένα σπίτι μπορεί να αποτελείται από ένα ή περισσότερα δωμάτια. Εάν το σπίτι καταστραφεί, τότε όλα τα δωμάτια που είναι μέρος του σπιτιού καταστρέφονται επίσης. Το παρακάτω απόσπασμα κώδικα απεικονίζει μια σχέση σύνθεσης μεταξύ δύο τάξεων, House and Room.

δημόσια τάξη House

{

ιδιωτικό δωμάτιο δωματίου

δημόσιο σπίτι()

   {

room = νέο δωμάτιο ();

   }

}

Όπως η συσσωμάτωση, η σύνθεση είναι επίσης μια ολόκληρη / μέρος ή σχέση γονέα / παιδιού. Ωστόσο, στη σύνθεση ο κύκλος ζωής του μέρους ή του παιδιού ελέγχεται από το σύνολο ή τον γονέα που το κατέχει. Πρέπει να σημειωθεί ότι αυτός ο έλεγχος μπορεί να είναι άμεσος ή μεταβατικός. Δηλαδή, ο γονέας μπορεί να είναι άμεσα υπεύθυνος για τη δημιουργία ή την καταστροφή του παιδιού ή ο γονέας μπορεί να χρησιμοποιήσει ένα παιδί που έχει ήδη δημιουργηθεί. Ομοίως, ένα γονικό αντικείμενο ενδέχεται να εκχωρήσει το στοιχείο ελέγχου σε κάποιον άλλο γονέα για να καταστρέψει το θυγατρικό αντικείμενο. Η σύνθεση αντιπροσωπεύεται στο UML χρησιμοποιώντας μια γραμμή που συνδέει τα αντικείμενα με ένα συμπαγές διαμάντι στο τέλος του αντικειμένου που κατέχει το άλλο αντικείμενο.

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

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