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

Εξυπνότερη ανάπτυξη Java

Ένα γρήγορο και απλό σχήμα για την επιτάχυνση της ανάπτυξης εφαρμογών Java μεγάλης κλίμακας περιλαμβάνει τη χρήση διεπαφών. Οι διεπαφές Java είναι ένα προσχέδιο για τη λειτουργικότητα που περιέχεται σε ένα σχετικό αντικείμενο.

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

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

Μια επισκόπηση

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

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

Γιατί να κωδικοποιήσετε τις διεπαφές;

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

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

Ένας άλλος λόγος για τον κώδικα σε διεπαφές και όχι σε αντικείμενα είναι ότι παρέχει υψηλότερη απόδοση στις διάφορες φάσεις του κύκλου ζωής ενός συστήματος:

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

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

Βασικό παράδειγμα

Για να εξηγήσω περαιτέρω την έννοια της κωδικοποίησης σε διασυνδέσεις, έχω δημιουργήσει ένα απλό παράδειγμα. Ενώ αυτό το παράδειγμα είναι σαφώς ασήμαντο, δείχνει μερικά από τα οφέλη που αναφέρονται παραπάνω.

Εξετάστε το απλό παράδειγμα μιας τάξης Αυτοκίνητο που εφαρμόζει διεπαφή Οχημα. Διεπαφή Οχημα έχει μια μεμονωμένη μέθοδο που ονομάζεται αρχή(). Τάξη Αυτοκίνητο θα εφαρμόσει τη διεπαφή παρέχοντας ένα αρχή() μέθοδος. Άλλες λειτουργίες στο Αυτοκίνητο η τάξη έχει παραμείνει για λόγους σαφήνειας.

interface Vehicle {// Όλες οι υλοποιήσεις οχημάτων πρέπει να εφαρμόζουν τη μέθοδο εκκίνησης public void start (); } class Car υλοποιεί Όχημα {// Απαιτείται για την εφαρμογή του οχήματος δημόσια άκυρη εκκίνηση () {...}} 

Έχοντας θέσει τα θεμέλια του Αυτοκίνητο αντικείμενο, μπορούμε να δημιουργήσουμε ένα άλλο αντικείμενο που ονομάζεται Υπηρέτης. Είναι το Υπηρέτηςδουλειά για να ξεκινήσετε το Αυτοκίνητο και να το φέρει στον προστάτη του εστιατορίου. ο Υπηρέτης το αντικείμενο μπορεί να γραφτεί χωρίς διασυνδέσεις, ως εξής:

τάξη Valet {public Car getCar (Car c) {...}} 

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

Για να κωδικοποιήσετε το Υπηρέτης αντικείμενο χρησιμοποιώντας διεπαφές, θα μπορούσε να χρησιμοποιηθεί η ακόλουθη εφαρμογή:

τάξη Valet {public Vehicle getVehicle (Vehicle c) {...}} 

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

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

Δημιουργία αντικειμένου διεπαφής

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

Αυτή η διαδικασία δημιουργίας μπορεί να επιτευχθεί χρησιμοποιώντας ένα Εργοστάσιο μοτίβο στο οποίο ένα εξωτερικό αντικείμενο καλεί στατικό δημιουργίαXYZ () μέθοδος σε ένα Εργοστάσιο και επιστρέφει μια διεπαφή. Μπορεί επίσης να επιτευχθεί εάν ένας προγραμματιστής καλέσει μια μέθοδο σε άλλο αντικείμενο και την περάσει μια διεπαφή αντί για την πραγματική κλάση. Αυτό θα ήταν ανάλογο με το πέρασμα ενός Απαρίθμηση διεπαφή αντί για Διάνυσμα ή Hashtable.

Λεπτομερές παράδειγμα

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

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

Εξετάστε το παράδειγμα του a Πρόσωπο. ΕΝΑ Πρόσωπο μπορεί να εφαρμόσει πολλές μεθόδους, αλλά θα εφαρμόσει το Πόρος διεπαφή για αυτήν την εφαρμογή. Έχω δημιουργήσει το Πόρος διασύνδεση με όλες τις απαραίτητες μεθόδους πρόσβασης για όλους τους πόρους που χρησιμοποιούνται σε αυτό το παράδειγμα (φαίνεται παρακάτω):

δημόσια διεπαφή Πόρος {public String getID (); δημόσια συμβολοσειρά getName (); δημόσιο άκυρο addOccurrence (Περίπτωση o); } 

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

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

Δημόσια διεπαφή Περίπτωση {public void setEndDatetime (Ημερομηνία d); δημόσια Ημερομηνία getEndDatetime (); public void setStartDatetime (Ημερομηνία d); δημόσια Ημερομηνία getStartDatetime (); public void setDescription (περιγραφή συμβολοσειράς); δημόσια συμβολοσειρά getDescription (); public void addResource (πόρος r); δημόσιος πόρος [] getResources (); το δημόσιο boolean εμφανίζεται On (Ημερομηνία d). } 

ο Χρονοδιάγραμμα ο κώδικας χρησιμοποιεί το Πόρος διεπαφή και το Περιστατικό διεπαφή για τη διατήρηση του χρονοδιαγράμματος ενός πόρου. Παρατηρήστε ότι το Χρονοδιάγραμμα δεν έχει καμία γνώση της οντότητας για την οποία διατηρεί το χρονοδιάγραμμα:

Πρόγραμμα δημοσίων τάξεων υλοποιεί το Πρόγραμμα {Vector sched = null; δημόσιο χρονοδιάγραμμα () {sched = new Vector (); } public void addOccurrence (Περίπτωση o) {sched.addElement (o); } public void removeOccurrence (Περίπτωση o) {sched.removeElement (o); } Δημόσιο περιστατικό getOccurrence (Ημερομηνία δ) {Πρόγραμμα απαρίθμησηςElements = jadwal.elements (); Περίπτωση o = null; ενώ (schedElements.hasMoreElements ()) {o = (Περιστασιακό) πρόγραμμαElements.nextElement (); // Για αυτό το απλό παράδειγμα, η εμφάνιση ταιριάζει εάν // η ώρα είναι η ώρα έναρξης της σύσκεψης. Αυτή η λογική // μπορεί να γίνει πιο περίπλοκη όπως απαιτείται. εάν (o.getStartDatetime () == d) {break; }} επιστροφή o; }} 

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

Τελικές σκέψεις για διασυνδέσεις

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

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

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

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

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

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

Ένα άλλο πλεονέκτημα είναι η κεντρική θέση του κώδικα. Εάν πρόκειται να προστεθούν νέες μέθοδοι στο Πόρος διεπαφή, όλες οι υλοποιήσεις αυτής της διεπαφής θα αναγνωριστούν ότι απαιτούν αλλαγή. Αυτό θα μειώσει την απαιτούμενη έρευνα για να προσδιορίσει τον πιθανό αντίκτυπο των αλλαγών στη διεπαφή.

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