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

Αναπτύξτε εύκολα διαμορφώσιμες εφαρμογές λογισμικού

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

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

Το Obix Framework είναι ένα πλαίσιο ανοιχτού κώδικα που παρέχει τα κοινά μέσα και μορφές για την αποθήκευση δεδομένων διαμόρφωσης σε XML και για την πρόσβαση σε αυτά τα δεδομένα μέσω απλών αντικειμένων Java. Επιτρέπει τη διαμόρφωση των δεδομένων διαμόρφωσης επιτρέποντας την εισαγωγή και συμπερίληψη αρχείων διαμόρφωσης μεταξύ τους και την οργάνωση πληροφοριών διαμόρφωσης σε "modules".

Επιπλέον, υποστηρίζει "καυτές" τροποποιήσεις διαμόρφωσης - μέσω αυτόματης ανίχνευσης και αυτόματης επαναφόρτωσης αλλαγών σε δεδομένα διαμόρφωσης - και παρέχει επίσης υποστήριξη για το Java Naming and Directory Interface API (JNDI). Επιπλέον, μπορεί να ενσωματωθεί σε εφαρμογές Java με πολλούς τρόπους, όπως μέσω Java Management Extensions (JMX) και Java Platform, Enterprise Edition ακροατές που δεν απαιτούν κωδικοποίηση, καθώς και απλές τάξεις Java που μπορούν να κληθούν απευθείας. Τέλος, το πλαίσιο παρέχει ένα εύχρηστο API προσθηκών που επιτρέπει στους προγραμματιστές να το επεκτείνουν για να εκτελούν εργασίες που σχετίζονται με την προετοιμασία. Αυτό το API έχει χρησιμοποιηθεί από την ομάδα Obix για την παροχή βοηθητικών προγραμμάτων προετοιμασίας για άλλα πλαίσια ανοιχτού κώδικα, όπως το Apache's log4j, το Hibernate και το Commons DBCP (ομάδες σύνδεσης βάσης δεδομένων).

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

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

Σενάριο προβλήματος

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

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

Παράδειγμα 1: Ένα βασικό αρχείο διαμόρφωσης

Σε αυτό το παράδειγμα, δημιουργούμε ένα βασικό αρχείο διαμόρφωσης, το example1-config.xml, για την εφαρμογή μας, το οποίο περιέχει τις λεπτομέρειες σύνδεσης με την υπηρεσία Web που παρέχει τις στατιστικές εισόδους στη διαδικασία αποτίμησης. Αυτό το αρχείο διαμόρφωσης θα αποθηκεύσει επίσης τον αριθμό των προσομοιώσεων που θα εκτελεστούν για οποιοδήποτε αίτημα αποτίμησης. Αυτό το αρχείο (καθώς και τα αρχεία διαμόρφωσης για τα άλλα παραδείγματα) βρίσκεται στον κατάλογο config του αρχείου με δυνατότητα λήψης που σχετίζεται με αυτό το σεμινάριο. Τα περιεχόμενα του αρχείου διαμόρφωσης παρατίθενται ως εξής:

//www.some-exchange.com/marketdata

trading_app_dbo

nopassword

10000

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

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

εισαγωγή org.obix.configuration.Configuration; εισαγωγή org.obix.configuration.ConfigurationAdapter; εισαγωγή org.obix.configuration.ConfigurationAdapterFactory;

δημόσια τάξη Παράδειγμα 1 {public static void main (String [] args) {ConfigurationAdapterFactory adapterFactory = ConfigurationAdapterFactory.newAdapterFactory ();

ConfigurationAdapter adapter = adapterFactory.create (null);

adapter.adaptConfiguration (Configuration.getConfiguration (), "config / example1-config.xml"); printMarketDataInfo (); }

private static void printMarketDataInfo () {Configuration globalConfig = Configuration.getConfiguration ();

System.out.println ("Διεύθυνση URL υπηρεσίας δεδομένων: \ t \ t" + globalConfig.getValue ("market.data.service.url"));

System.out.println ("Αναγνωριστικό χρήστη υπηρεσίας δεδομένων: \ t \ t" + globalConfig.getValue ("market.data.service.uid"));

System.out.println ("Κωδικός πρόσβασης υπηρεσίας δεδομένων: \ t \ t" + globalConfig.getValue ("market.data.service.password"));

System.out.println ("Αριθμός προσομοίωσης: \ t \ t" + globalConfig.getValue ("number.of.valuation.simulations")); }}

Για να εκτελέσετε αυτό και τα επόμενα παραδείγματα, πρέπει να κάνετε λήψη των δυαδικών αρχείων του Obix Framework σε μια τοποθεσία προσβάσιμη μέσω του classpath σας. Το classpath πρέπει να αναφέρεται στη βιβλιοθήκη Obix, obix-framework.jar, που μπορεί να βρεθεί στο φάκελο lib του ριζικού καταλόγου του πλαισίου. Θα χρειαστείτε επίσης τις ακόλουθες βιβλιοθήκες ανοιχτού κώδικα τρίτων: dom.jar, jaxen-full.jar, sax.jar, saxpath.jar, και xercesImpl.jar, που μπορεί να βρεθεί στο φάκελο lib / thirdParty του ριζικού καταλόγου του πλαισίου.

Η εκτέλεση αυτής της τάξης θα πρέπει να έχει το ακόλουθο αποτέλεσμα:

Διεύθυνση URL υπηρεσίας δεδομένων: //www.some-exchange.com/marketdata Υπηρεσία δεδομένων Αναγνωριστικό χρήστη: trading_app_dbo Κωδικός πρόσβασης υπηρεσίας δεδομένων: nopassword Αριθμός προσομοίωσης: 10000 

Για την ανατομή αυτής της τάξης, ξεκινάμε με την κύρια μέθοδο. Η πρώτη γραμμή αυτής της μεθόδου δημιουργεί μια παρουσία της τάξης org.obix.configuration.ConfigurationAdapterFactory, ο οποίος είναι υπεύθυνος για τη δημιουργία προσαρμογέα διαμόρφωσης (μια παρουσία κλάσης org.obix.configuration.ConfigurationAdapter). Ο προσαρμογέας, με τη σειρά του, είναι υπεύθυνος για την πραγματική ανάγνωση ενός εγγράφου διαμόρφωσης από μια δεδομένη τοποθεσία (καθορίζεται ως διαδρομή αρχείου ή διεύθυνση URL).

Το ακόλουθο απόσπασμα κώδικα διαβάζει τα περιεχόμενα του αρχείου διαμόρφωσης στην παρουσία καθολικής / στατικής διαμόρφωσης, κάνοντας χρήση της μεθόδου προσαρμογέα adaptConfiguration ()και μεταβιβάζοντας μια αναφορά στην παγκόσμια παρουσία - όπως προκύπτει από την κλήση Configuration.getConfiguration ()—Και τη διαδρομή προς το αρχείο διαμόρφωσης config / example1-config.xml:

adapter.adaptConfiguration (Configuration.getConfiguration (), "config / example1-config.xml"); 

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

Στη συνέχεια, εξετάζουμε εν συντομία τη μέθοδο printMarketDataInfo (), το οποίο διαβάζει απλώς τις καταχωρήσεις διαμόρφωσης (δηλαδή, το Κόμβοι XML) και εκτυπώνει τις τιμές τους (δηλαδή, τους θυγατρικοί κόμβοι). Παρατηρήστε ότι η τιμή κάθε καταχώρησης λαμβάνεται καλώντας τη μέθοδο getValue (...) στο σχετικό Διαμόρφωση παράδειγμα, μεταβιβάζοντας το όνομα / το κλειδί της καταχώρησης — όπως καθορίζεται για τους κόμβους εισόδου είσοδος Χαρακτηριστικό. Εκτός αυτού, σημειώστε ότι μια καταχώρηση μπορεί να έχει πολλές τιμές, οι οποίες θα αποδειχθούν αργότερα σε αυτό το σεμινάριο.

Παράδειγμα 2: Διαμόρφωση δεδομένων διαμόρφωσης

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

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

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

.................... .................... .......... ......... [email protected]

υπολογιστικό φύλλο σε μορφή αρχείου pdf

Δύο πράγματα ξεχωρίζουν αμέσως σε αυτό το αρχείο διαμόρφωσης: το πρώτο, φυσικά, είναι ο ορισμός της ενότητας μας , ακολουθούμενος από τον δεύτερο κόμβο εισόδου της ενότητας . Ξεκινάμε με τον ορισμό της ενότητας. Ένα έγγραφο διαμόρφωσης Obix μπορεί να περιέχει οποιονδήποτε αριθμό υπομονάδων. Φραγή δύο στοιχείων - που δεν συζητούνται σε αυτό το σεμινάριο - οι λειτουργικές μονάδες υποστηρίζουν τον ίδιο κόμβο που έχει και η ριζική μονάδα. Με άλλα λόγια, οι ενότητες έχουν καταχωρήσεις και μπορούν να περιέχουν άλλες ενότητες. Ως εκ τούτου, οι ενότητες μπορούν αποτελεσματικά να χρησιμοποιηθούν για την αναπαραγωγή μιας δομής δέντρου.

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

Εξετάζουμε τώρα τον κώδικα Java για ανάγνωση των καταχωρήσεων στην ενότητα διαμόρφωσης αναφορών. Τροποποιούμε την πηγή Java για το προηγούμενο παράδειγμα προσθέτοντας την ακόλουθη μέθοδο. το τροποποιημένο αρχείο προέλευσης (κλάση) μετονομάζεται Παράδειγμα 2. javaκαι μπορεί να βρεθεί στο φάκελο src του αρχείου που σχετίζεται με αυτό το σεμινάριο:

private static void printReportingConfig () {Configuration globalConfig = Configuration.getConfiguration ();

Configuration reportConig = globalConfig.getModule ("αναφορά.παραμέτρους");

System.out.println ("Αναφορές προορισμός: \ t \ t" + reportConig.getValue ("report.destination.email"));

System.out.println ("Μορφές αναφοράς: \ t \ t" + reportConig.getValues ​​("report_formats")); }

Κατά την εκτέλεση αυτής της κλάσης, θα πρέπει να παράγει την έξοδο:

Διεύθυνση URL υπηρεσίας δεδομένων: //www.some-exchange.com/marketdata Υπηρεσία δεδομένων Αναγνωριστικό χρήστη: trading_app_dbo Κωδικός πρόσβασης υπηρεσίας δεδομένων: nopassword Αριθμός προσομοίωσης: 10000

Αναφορά παραμέτρων διαμόρφωσης = Προορισμός αναφορών: [email protected] Μορφές αναφοράς: [υπολογιστικό φύλλο, αρχείο κειμένου, pdf]

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

$config[zx-auto] not found$config[zx-overlay] not found