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

Τα μοτίβα σχεδίασης δημιουργούν καλύτερες εφαρμογές J2EE

Από την ίδρυσή του, το J2EE (Java 2 Platform, Enterprise Edition) απλοποίησε την κατασκευή εταιρικών εφαρμογών στην Java. Καθώς το J2EE υιοθετείται ευρύτερα, ωστόσο, οι προγραμματιστές συνειδητοποιούν την ανάγκη καθορισμένων προσεγγίσεων που απλοποιούν και τυποποιούν τη δημιουργία εφαρμογών. Μπορείτε να αρχίσετε να επιτυγχάνετε αυτόν τον στόχο τυποποιώντας την εφαρμογή σας αρχιτεκτονικό στρώμα.

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

Αρχιτεκτονική εφαρμογών και J2EE

Το J2EE είναι μια εξαιρετική τεχνολογία υποδομής. Παρέχει ένα ομοιόμορφο πρότυπο για τις εργασίες χαμηλότερου επιπέδου της στοίβας τεχνολογίας, όπως επικοινωνία βάσης δεδομένων ή διανομή εφαρμογών. Το J2EE, ωστόσο, δεν οδηγεί προγραμματιστές στην κατασκευή επιτυχημένων εφαρμογών. Οι δημιουργοί του J2EE, κοιτάζοντας προς τα κάτω τη στοίβα τεχνολογίας, αναρωτήθηκαν: "Πώς μπορούμε να τυποποιήσουμε αυτά τα API;" Θα έπρεπε να έχουν κοιτάξει τους προγραμματιστές εφαρμογών και να ρωτήσουν: "Πώς μπορώ να δώσω στους προγραμματιστές τα δομικά στοιχεία που πρέπει να εστιάσουν στην επιχειρηματική τους εφαρμογή;"

Όταν ξεκινά ένα νέο έργο J2EE, ορισμένα μέλη της ομάδας συχνά ρωτούν: "Εάν το J2EE είναι το ίδιο αρχιτεκτονική, γιατί χρειαζόμαστε περισσότερα;" Πολλοί προγραμματιστές υποστήριξαν αυτήν την εσφαλμένη αντίληψη στις πρώτες μέρες του J2EE, αλλά οι έμπειροι προγραμματιστές J2EE καταλαβαίνουν ότι το J2EE δεν παρέχει την αρχιτεκτονική εφαρμογών που είναι απαραίτητη για την παροχή εφαρμογών υψηλής ποιότητας με συνέπεια. Αυτοί οι προγραμματιστές χρησιμοποιούν συχνά σχέδια σχεδίασης για να καλύψουν αυτό το κενό.

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

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

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

Ας εξετάσουμε κάθε περιοχή με περισσότερες λεπτομέρειες.

Σχέδια σχεδίασης J2EE

Τα πρότυπα σχεδίασης J2EE εξελίσσονται τα τελευταία χρόνια καθώς η κοινότητα Java έχει αποκτήσει εμπειρία J2EE. Αυτά τα σχέδια σχεδίασης εντοπίζουν πιθανά προβλήματα που συναντώνται κατά τη χρήση των διαφόρων τεχνολογιών που καθορίζονται από το J2EE και βοηθούν τους προγραμματιστές να κατασκευάσουν τις απαιτήσεις μιας αρχιτεκτονικής εφαρμογών. Το δημοφιλές σχέδιο σχεδίασης Front Controller, για παράδειγμα, μετατρέπει τον μη δομημένο servlet κώδικα σε έναν ελεγκτή που θυμίζει την εκλεπτυσμένη ανάπτυξη GUI (γραφική διεπαφή χρήστη).

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

Λοιπόν, πού βρίσκετε τα σχέδια σχεδίασης J2EE; Η Sun Microsystems προσφέρει δύο βιβλία που περιέχουν πολλά μοτίβα J2EE:

  • Το J2EE BluePrint Group's Σχεδιασμός εταιρικών εφαρμογών με την πλατφόρμα Java 2 (Enterprise Edition), Nicholas Kassem et al. (Addison-Wesley, 2000; ISBN: 0201702770)
  • Το Sun Professional Services Group's Core J2EE Μοτίβα: Βέλτιστες πρακτικές και στρατηγικές σχεδιασμού, Deepak Alur, John Crupi και Dan Malks (Prentice Hall, 2001; ISBN: 0130648841)

(Δείτε πόρους για συνδέσμους και στα δύο βιβλία.)

Πέρα από τους πόρους της Sun, άλλες δημοσιεύσεις προσφέρουν πληροφορίες για το σχέδιο σχεδίασης J2EE, συμπεριλαμβανομένων διαφόρων περιοδικών ή ιστότοπων της Java (όπως JavaWorld), καθώς και πολλά βιβλία. (Δείτε πόρους για συνδέσμους σε ορισμένους από αυτούς τους ιστότοπους, συμπεριλαμβανομένων JavaWorld 'μικρό Σχεδιαστικά πρότυπα Σελίδα τοπικού ευρετηρίου.)

Σχέδια σχεδιασμού ανάπτυξης λογισμικού

Επίσης, λάβετε υπόψη σας τα μοτίβα σχεδιασμού ανάπτυξης λογισμικού, χωρισμένα σε γενικά σχέδια αντικειμενοστρεφής (OO) και μοτίβα σχεδιασμού ειδικά για Java. Το εργοστασιακό μοτίβο, για παράδειγμα, αντιπροσωπεύει ένα ισχυρό σχέδιο σχεδίασης OO για την ενθυλάκωση της δημιουργίας αντικειμένων που επιτρέπει την επαναχρησιμοποίηση και την ικανοποίηση των αλλαγών των απαιτήσεων ενός συστήματος. Από την πλευρά τους, τα μοτίβα σχεδιασμού γλώσσας Java αντιστοιχούν σε συγκεκριμένες γλώσσες Java. Ορισμένα είναι μοναδικά για την Java και είναι συνήθως ανεπίσημα (για παράδειγμα, εξαιρέσεις και πρωτόγονα), ενώ άλλα είναι μοτίβα OO που είναι εκλεπτυσμένα για εφαρμογή στην Java. Το διάσημο βιβλίο των Gang of Four, Σχεδιαστικά πρότυπα από τους Eric Gamma et al., περιγράφει πολλά γενικά πρότυπα ανάπτυξης λογισμικού χρήσιμα για όλους τους προγραμματιστές.

Μην απορρίψετε αυτά τα μοτίβα απλώς και μόνο επειδή δεν είναι συγκεκριμένα για το J2EE. Αντίθετα, τέτοια μοτίβα μπορούν να αποδειχθούν εξίσου ισχυρά, αν όχι περισσότερο, από τα σχέδια σχεδίασης J2EE, επειδή:

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

Μην δημιουργήσετε μια λίστα ελέγχου που να καλύπτει τα πρότυπα ανάπτυξης λογισμικού που απαιτεί η αρχιτεκτονική σας, όπως θα κάνατε με τα μοτίβα J2EE. Αντ 'αυτού, χρησιμοποιήστε τέτοια μοτίβα, όπου χρειάζεται, με βάση τις συγκεκριμένες προκλήσεις του έργου σας. Πολλοί προγραμματιστές πιστεύουν λανθασμένα ότι τα προϊόντα τους θα βελτιωθούν εάν χρησιμοποιούν περισσότερα μοτίβα - ή εάν τα χρησιμοποιούν όλα! Αυτό όμως δεν ισχύει. Χρησιμοποιήστε διακριτικότητα και φινέτσα όταν αποφασίζετε ποια μοτίβα θα χρησιμοποιήσετε και πώς να τα χρησιμοποιήσετε μαζί.

Σχέδια σχεδίασης: Πού είναι ο κωδικός;

Λάβετε υπόψη ότι τα μοτίβα σχεδιασμού δεν συνοδεύονται από την ακριβή εφαρμογή ή τον πηγαίο κώδικα που θα χρησιμοποιήσετε. Οι προσφορές μοτίβων σχεδιασμού κυμαίνονται από αραιές περιγραφές κειμένου έως πλούσια τεκμηρίωση έως πιθανώς κάποιο δείγμα κώδικα. Η πρόκληση έρχεται στην εφαρμογή ισχυρών ιδεών των προτύπων. Αυτές οι ιδέες πρέπει να εφαρμοστούν στο περιβάλλον στο οποίο θα χρησιμοποιηθούν. το περιβάλλον καθορίζει τη σωστή εφαρμογή.

Ως αναλογία, σκεφτείτε ένα σχέδιο σχεδίασης για την οικοδόμηση του θεμέλιο ενός σπιτιού. Το σχέδιο σχεδίασης προσδιορίζει το πρόβλημα, το πλαίσιο και την πιθανή λύση για την κατασκευή του θεμελίου - πληροφορίες που είναι εξαιρετικά πολύτιμες για τον εργάτη στον τομέα. Ωστόσο, ο εργαζόμενος πρέπει να χτίσει τα θεμέλια. Δεν θα ωφεληθεί περισσότερο αυτός ο εργάτης οικοδομών από το να δοθεί το ίδρυμα (παρόμοιο με αυτό που έχει δοθεί στην εφαρμογή λογισμικού); Ίσως αυτό το ίδρυμα να είναι απλώς μια πλάκα από μπετόν στο οποίο θα μπορούσε να χτιστεί το σπίτι. Το πρόβλημα: Το ίδρυμα πρέπει να ενσωματωθεί με το ίδιο το σπίτι και τη γη όπου θα κατοικεί το σπίτι. Πώς μπορεί ένα τέτοιο προκατασκευασμένο ίδρυμα να φιλοξενήσει όλες τις πιθανές κάτοψεις σπιτιού (ορθογώνιο, τετράγωνο και άλλα περίεργα σχήματα) και όλα τα πιθανά τοπία (στην κορυφή ενός λόφου, στη μέση ενός δάσους κ.λπ.);

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

  • Η υλοποίηση, όχι μεμονωμένα σχέδια σχεδίασης, αντιπροσωπεύει μια λύση. Η λύση θα μπορούσε να ενσωματώσει πολλαπλά σχέδια σχεδίασης και, με αυτόν τον τρόπο, θα ξέρει πώς παίζουν τα μεμονωμένα σχέδια σχεδίασης.
  • Η λύση πρέπει να είναι προσαρμόσιμη, η οποία να απαντά στο τελευταίο ερώτημα από την αναλογία του προκατασκευασμένου ιδρύματος: το ίδρυμα πρέπει να μπορεί να προσαρμόζεται στο έδαφος και στις κάτοψεις. Όπως μπορείτε να φανταστείτε, θα χρειαζόταν ένας εξαιρετικά εξειδικευμένος τεχνίτης να χτίσει το προσαρμόσιμο θεμέλιο σε αντίθεση με το τυπικό θεμέλιο.

Κοινά σχέδια σχεδίασης

Ο παρακάτω πίνακας παραθέτει ορισμένα κοινά μοτίβα σχεδιασμού τόσο από πηγές J2EE όσο και από ευρύτερα μοτίβα OO.

Κοινά σχέδια σχεδίασης
Σχέδια σχεδίασης J2EEΣχέδια ανάπτυξης λογισμικού
Πρόσοψη συνεδρίαςΜοναδικό χαρτί
Συγκέντρωση αντικειμένου τιμήςΓέφυρα
Πρότυπο εντοπισμού σέρβιςΠρωτότυπο
Επιχειρηματικός εκπρόσωποςΠερίληψη Εργοστάσιο
Σύνθετη οντότηταFlyweight
Διαχειριστής λίστας τιμώνΜεσολαβητής
Εντοπιστής σέρβιςΣτρατηγική
Σύνθετη οντότηταΔιακοσμητής
Αντικείμενο τιμήςκατάσταση
Υπηρεσία στον εργαζόμενοΕπαναληπτής
Αντικείμενο πρόσβασης δεδομένωνΑλυσίδα ευθύνης
Φίλτρο παρακολούθησηςΜοντέλο Ελεγκτής II
Προβολή ΒοηθούΕνθύμιο
Σύνθετη προβολήΟικοδόμος
Προβολή αποστολέαΕργοστασιακή μέθοδος

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

Παράδειγμα: Το μοτίβο Session Facade J2EE

Το πρότυπο Session Facade εξελίχθηκε από εμπειρίες με το Enterprise JavaBeans (EJBs). Τα συστήματα που βασίζονται στα νεοσύστατα EJB οντότητας (τα οποία επικοινωνούν με μια βάση δεδομένων) επιβραδύνουν την ανίχνευση. Ο έλεγχος απόδοσης αποκάλυψε προβλήματα που προέκυψαν από πολλές κλήσεις δικτύου που έγιναν κατά την επικοινωνία με την οντότητα EJBs, τα οποία πρόσθεσαν γενικά έξοδα για τη δημιουργία της σύνδεσης δικτύου, σειριοποίησης των δεδομένων τόσο για την αποστολή όσο και για τη λήψη και άλλα εφέ.

Σε απάντηση, το πρότυπο Session Facade βελτίωσε την απόδοση συγκεντρώνοντας αυτές τις πολλαπλές επισκέψεις δικτύου σε μία κλήση. Το Session Facade χρησιμοποιεί ένα EJB συνεδρίας χωρίς απάτριδες για να μεσολαβεί μεταξύ της κλήσης του πελάτη και της απαιτούμενης αλληλεπίδρασης EJB οντότητας. Υπάρχουν περισσότερα μοτίβα για τη βελτίωση της απόδοσης πρόσβασης στη βάση δεδομένων, συμπεριλαμβανομένων των προτύπων Fast Lane Reader και Object Access Object.

Παράδειγμα: Το μοτίβο αντικειμένου τιμής J2EE

Το μοτίβο Value Object J2EE στοχεύει επίσης στη βελτίωση της απόδοσης συστημάτων που χρησιμοποιούν EJB μέσω του δικτύου. Αυτές οι κλήσεις δικτύου που προκαλούν γενικά από το προηγούμενο παράδειγμα ανακτούν μεμονωμένα πεδία δεδομένων. Για παράδειγμα, μπορεί να έχετε ένα Πρόσωπο οντότητα EJB με μεθόδους όπως getFirstName (), getMiddleName (), και getLastName (). Με το μοτίβο σχεδίασης Value Object, μπορείτε να μειώσετε τέτοιες πολλαπλές κλήσεις δικτύου σε μία κλήση με μια μέθοδο στο EJB οντότητας, όπως getPersonValueObject (), που επιστρέφει τα δεδομένα ταυτόχρονα. Αυτό το αντικείμενο αξίας περιέχει τα δεδομένα που αντιπροσωπεύει η οντότητα EJB και μπορεί να προσεγγιστεί όπως απαιτείται χωρίς να επιβαρυνθεί η επιβάρυνση της κλήσης δικτύου.

Παράδειγμα: Το μοτίβο Flyweight OO

Για παράδειγμα ενός ευρέως εφαρμόσιμου μοτίβου σχεδίασης OO, σκεφτείτε το μοτίβο Flyweight, το οποίο βελτιώνει την απόδοση της εφαρμογής μέσω επαναχρησιμοποίησης αντικειμένων. Το λογισμικό OO παράγει γενικά - σπατάλη κύκλους CPU, συλλογή απορριμμάτων και κατανομή μνήμης - όταν δημιουργεί και καταστρέφει αντικείμενο. Εάν το σύστημα θα μπορούσε να επαναχρησιμοποιήσει αυτά τα αντικείμενα, θα μπορούσατε να αποφύγετε την επιβάρυνση. Ωστόσο, τα αντικείμενα συχνά δεν μπορούν να επαναχρησιμοποιηθούν, επειδή περιέχουν πληροφορίες (που ονομάζονται κατάσταση) ειδικά για τον τρέχοντα χρήστη του αντικειμένου. Το μοτίβο Flyweight παρέχει προσεγγίσεις για μετακίνηση αυτής της κατάστασης αλλού, ώστε το υπόλοιπο αντικείμενο να μπορεί να επαναχρησιμοποιηθεί.

Συνδυάστε τα όλα: Παράδειγμα επιμονής

Τώρα που γνωρίζετε τα βασικά, μπορείτε να αρχίσετε να εφαρμόζετε μοτίβα σχεδίασης στις αναπτυξιακές σας πρακτικές. Αλλά πώς χρησιμοποιείτε τα μοτίβα; Ξεκινήστε εντοπίζοντας έναν τομέα ή ένα τεχνικό πρόβλημα που απαιτεί λύση. Η επιμονή - επίλυση της παλιάς αναντιστοιχίας αντικειμένων σε σχέση με τη βάση δεδομένων - αντιπροσωπεύει ένα καλό παράδειγμα για τις περισσότερες εταιρικές εφαρμογές. Ας δούμε τα βήματα που απαιτούνται για το σχεδιασμό και τη δημιουργία του επιπέδου επιμονής μιας αρχιτεκτονικής εφαρμογών.

Ακολουθώντας την παραδοσιακή προσέγγιση αρχιτεκτονικής και σχεδιασμού OO, δημιουργήστε θήκες χρήσης που περιγράφουν τις ανάγκες επιμονής σας. Πιθανές περιπτώσεις χρήσης περιλαμβάνουν:

  1. Η επιμονή των αντικειμένων πρέπει να είναι διαφανής από την άποψη των προγραμματιστών.
  2. Οι μηχανισμοί ανθεκτικότητας - EJB οντοτήτων, αντικείμενα πρόσβασης δεδομένων και ούτω καθεξής - πρέπει να είναι διαμορφώσιμοι σε αρχιτεκτονικό επίπεδο.
  3. Η αρχιτεκτονική μας πρέπει να χρησιμοποιεί τεχνολογίες J2EE αλλά να ενσωματώνει τις εξαρτήσεις J2EE. Θα πρέπει να είμαστε σε θέση να αλλάξουμε τους προμηθευτές διακομιστών εφαρμογών J2EE, τις εκδόσεις J2EE ή να αντικαταστήσουμε εντελώς το J2EE χωρίς να απαιτείται μια γενική αναθεώρηση της εφαρμογής.
  4. Το προκύπτον επίπεδο επιμονής πρέπει να μπορεί να επαναχρησιμοποιηθεί σε έργα. Αυτό θα πρέπει να είναι μέρος της τρέχουσας αρχιτεκτονικής εφαρμογών μας.

Μόλις εντοπίσετε το πρόβλημα, μπορείτε να αποφασίσετε ποια μοτίβα ισχύουν. Να θυμάστε ότι για τα μοτίβα J2EE, θα πρέπει να καθορίσετε ποια μοτίβα ισχύουν στην περιοχή προβλήματος και να τα αντιμετωπίσετε. Για επιμονή, τα σχετικά σχέδια σχεδίασης J2EE είναι (βλ. Βιβλία σχεδίων J2EE της Sun στο Resources):

  • Αντικείμενο τιμής
  • Αναγνώστης γρήγορης λωρίδας
  • Αντικείμενο πρόσβασης δεδομένων
  • Πρόσοψη συνεδρίας
  • Σύνθετη οντότητα
  • Διαχειριστής λίστας τιμών

Δεδομένου ότι θα χρησιμοποιήσετε EJB, συμπεριλάβετε τα πρότυπα Business Delegate και Service Locator για την αντιμετώπιση της πρόσβασης στο EJB.

Επιπλέον, για την επίλυση της δεύτερης και τρίτης περίπτωσης χρήσης απαιτούνται παραδοσιακά πρότυπα σχεδιασμού ανάπτυξης λογισμικού. Πώς ενσωματώνετε εξαρτήσεις και έχετε ρυθμιζόμενους μηχανισμούς επιμονής; Ορισμένα πρότυπα ανάπτυξης λογισμικού περιλαμβάνουν:

  • Εργοστάσιο
  • Μεσολαβητής
  • Στρατηγική