portaldacalheta.pt
  • Κύριος
  • Επενδυτές & Χρηματοδότηση
  • Σχεδιασμός Διεπαφής Χρήστη
  • Τεχνολογία
  • Διαχείριση Έργου
Πίσω Μέρος

Ένας οδηγός για προγραμματισμό προσανατολισμένο στη διαδικασία στο Elixir και το OTP



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

Σε κάθε περίπτωση, ένα παράδειγμα έχει γενικά μια «κύρια» εστίαση και τεχνική που είναι η κινητήρια δύναμη για αυτήν την οικογένεια γλωσσών:



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



  • Σε λειτουργικές γλώσσες, μπορεί να είναι το χειρισμός λειτουργιών οι ίδιοι ή το αμετάβλητα δεδομένα πέρασε από λειτουργία σε λειτουργία.



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

πώς να λάβετε δεδομένα twitter

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



Τι είναι ο προγραμματισμός προσανατολισμένος στη διαδικασία;

Ας ξεκινήσουμε με έναν ορισμό: Προγραμματισμός προσανατολισμένος στη διαδικασία είναι ένα παράδειγμα βασισμένο σε Επικοινωνία Διαδοχικές Διαδικασίες , αρχικά από ένα έγγραφο από Τόνι Χορέ το 1977. Αυτό ονομάζεται επίσης το ηθοποιός μοντέλο ταυτότητας. Άλλες γλώσσες με κάποια σχέση με αυτό το πρωτότυπο έργο περιλαμβάνουν τα Occam, Limbo και Go. Το επίσημο έγγραφο αφορά μόνο τη σύγχρονη επικοινωνία. τα περισσότερα μοντέλα ηθοποιών (συμπεριλαμβανομένων ΟΤΡ ) Χρησιμοποιήστε επίσης ασύγχρονη επικοινωνία. Είναι πάντα δυνατή η δημιουργία συγχρονισμένης επικοινωνίας πάνω από την ασύγχρονη επικοινωνία και το OTP υποστηρίζει και τις δύο μορφές.

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



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

Προγραμματισμός με αντικειμενικό προσανατολισμό εναντίον διαδικασίας

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



Προγραμματισμός προσανατολισμένος στη διαδικασία: Δείγμα διαγράμματος κλάσης UML

c++ για ρομποτική

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



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

Λειτουργικός προγραμματισμός με προσανατολισμό στη διαδικασία

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



Για παράδειγμα, Το Scala είναι μια λειτουργική γλώσσα ενσωματωμένο στην εικονική μηχανή Java. Ενώ μπορεί να έχει πρόσβαση σε εγκαταστάσεις Java για επικοινωνία, δεν αποτελεί εγγενές μέρος της γλώσσας. Ενώ είναι μια κοινή γλώσσα που χρησιμοποιείται στον προγραμματισμό Spark, είναι και πάλι μια βιβλιοθήκη που χρησιμοποιείται σε συνδυασμό με τη γλώσσα.

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

Προγραμματισμός Elixir / OTP και προσανατολισμένη στη διαδικασία

Στο Elixir / Erlang και στο OTP, τα πρωτόγονα επικοινωνίας αποτελούν μέρος της εικονικής μηχανής που εκτελεί τη γλώσσα. Η ικανότητα επικοινωνίας μεταξύ διεργασιών και μεταξύ μηχανών είναι ενσωματωμένη και κεντρική στο γλωσσικό σύστημα. Αυτό τονίζει τη σημασία της επικοινωνίας σε αυτό το παράδειγμα και σε αυτά τα γλωσσικά συστήματα.

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

Τι σημαίνει να προσανατολίζεστε στη διαδικασία;

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

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

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

Επιπτώσεις κατάρτισης

Η συνέπεια αυτής της κατηγοριοποίησης στην εκπαίδευση είναι ότι η εκπαίδευση δεν πρέπει να ξεκινά με παραδείγματα γλωσσικής σύνταξης ή «Hello World», αλλά με Σκέψη μηχανικής συστημάτων και σχεδιασμός που εστιάζει στην κατανομή της διαδικασίας .

Οι ανησυχίες κωδικοποίησης είναι δευτερεύουσες στο σχεδιασμό και την κατανομή της διαδικασίας που αντιμετωπίζονται καλύτερα σε υψηλότερο επίπεδο και περιλαμβάνουν διαλειτουργική σκέψη σχετικά με τον κύκλο ζωής, το QA, το DevOps και τις απαιτήσεις των πελατών. Οποιοδήποτε εκπαιδευτικό σεμινάριο στο Elixir ή το Erlang πρέπει (και γενικά) να περιλαμβάνει OTP, και θα πρέπει να έχει προσανατολισμό διαδικασίας από την αρχή, όχι όπως το 'Τώρα μπορείτε να κωδικοποιήσετε στο Elixir, ας κάνουμε ταυτόχρονη προσέγγιση τύπου'.

Επιπτώσεις υιοθεσίας

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

Για εργασίες τεκμηρίωσης και σχεδιασμού, μπορεί να είναι πολύ χρήσιμο να χρησιμοποιήσετε μια γραφική σημειογραφία (όπως το σχήμα 1 για τις γλώσσες OO). Η πρόταση για το Elixir και τον προγραμματισμό προσανατολισμένο στη διαδικασία από το UML θα ήταν το διάγραμμα ακολουθίας (παράδειγμα στο σχήμα 2) για να δείξει χρονικές σχέσεις μεταξύ διεργασιών και να προσδιορίσει ποιες διαδικασίες εμπλέκονται στην εξυπηρέτηση ενός αιτήματος. Δεν υπάρχει τύπος διαγράμματος UML για την καταγραφή του κύκλου ζωής και της δομής της διαδικασίας, αλλά θα μπορούσε να αναπαρασταθεί με ένα απλό πλαίσιο και διάγραμμα βέλους για τύπους διεργασιών και τις σχέσεις τους. Για παράδειγμα, Σχήμα 3:

Διάγραμμα ακολουθίας UML δείγματος προγραμματισμού προσανατολισμένο στη διαδικασία

Διάγραμμα δομής διαδικασίας δείγματος προγραμματισμού προσανατολισμένου στη διαδικασία

Ένα παράδειγμα προσανατολισμού διαδικασίας

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

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

Αρχικός Σχεδιασμός Διαδικασίας και Κατανομή

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

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

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

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

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

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

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

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

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

Πρόσθετες απαιτήσεις

Τώρα, ας προσθέσουμε μερικές περίπλοκες απαιτήσεις. Ας υποθέσουμε ότι σε κάθε δικαιοδοσία (χώρα ή πολιτεία), ο πίνακας των ψήφων μπορεί να οδηγήσει σε αναλογικό αποτέλεσμα, αποτέλεσμα νικητή-λήψης όλων, ή κανένα αποτέλεσμα εάν δεν υπάρχουν επαρκείς ψήφοι σε σχέση με τον πληθυσμό αυτής της δικαιοδοσίας. Κάθε δικαιοδοσία έχει τον έλεγχο αυτών των πτυχών. Με αυτήν την αλλαγή, τότε τα αποτελέσματα των χωρών δεν είναι μια απλή συνάθροιση των αποτελεσμάτων των ψήφων, αλλά είναι ένα σύνολο των αποτελεσμάτων πολιτείας / επαρχίας. Αυτό αλλάζει την κατανομή της διαδικασίας από το πρωτότυπο ώστε να απαιτείται ότι τα αποτελέσματα από τις διαδικασίες πολιτείας / επαρχίας τροφοδοτούν τις διαδικασίες της χώρας. Εάν το πρωτόκολλο που χρησιμοποιείται μεταξύ της συλλογής ψήφων και των διαδικασιών πολιτείας / επαρχίας και επαρχίας προς χώρα είναι το ίδιο, τότε η λογική της συγκέντρωσης μπορεί να επαναχρησιμοποιηθεί, αλλά απαιτούνται ξεχωριστές διαδικασίες που κρατούν τα αποτελέσματα και οι διαδρομές επικοινωνίας τους είναι διαφορετικές, όπως φαίνεται στο σχήμα 5.

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

πώς να βρείτε πελάτες για συμβουλευτικές επιχειρήσεις

Ο κώδικας

Για να ολοκληρώσουμε το παράδειγμα, θα εξετάσουμε μια εφαρμογή του παραδείγματος στο Elixir OTP. Για την απλοποίηση των πραγμάτων, αυτό το παράδειγμα προϋποθέτει ότι ένας διακομιστής Ιστού όπως το Phoenix χρησιμοποιείται για την επεξεργασία πραγματικών αιτημάτων ιστού και αυτές οι υπηρεσίες Ιστού υποβάλλουν αιτήματα στη διαδικασία που προσδιορίζεται παραπάνω. Αυτό έχει το πλεονέκτημα της απλοποίησης του παραδείγματος και της εστίασης στο Elixir / OTP. Σε ένα σύστημα παραγωγής, η ύπαρξη χωριστών διαδικασιών έχει ορισμένα πλεονεκτήματα καθώς επίσης και διαχωρίζει τις ανησυχίες, επιτρέπει την ευέλικτη ανάπτυξη, κατανέμει φορτίο και μειώνει τον λανθάνοντα χρόνο. Μπορείτε να βρείτε τον πλήρη πηγαίο κώδικα με δοκιμές στη διεύθυνση https://github.com/technomage/voting . Η πηγή συντομεύεται σε αυτήν την ανάρτηση για αναγνωσιμότητα. Κάθε παρακάτω διαδικασία ταιριάζει σε ένα δέντρο εποπτείας OTP για να διασφαλιστεί ότι οι διαδικασίες θα επανεκκινήσουν σε περίπτωση αποτυχίας. Δείτε την πηγή για περισσότερα σχετικά με αυτήν την πτυχή του παραδείγματος.

Καταγραφή ψηφοφοριών

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

defmodule Voting.VoteRecorder do @moduledoc ''' This module receives votes and sends them to the proper aggregator. This module uses supervised tasks to ensure that any failure is recovered from and the vote is not lost. ''' @doc ''' Start a task to track the submittal of a vote to an aggregator. This is a supervised task to ensure completion. ''' def cast_vote where, who do Task.Supervisor.async_nolink(Voting.VoteTaskSupervisor, fn -> Voting.Aggregator.submit_vote where, who end) |> Task.await end end

Ψηφοφορία Συγκεντρωτής

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

defmodule Voting.Aggregator do use GenStage ... @doc ''' Submit a single vote to an aggregator ''' def submit_vote id, candidate do pid = __MODULE__.via_tuple(id) :ok = GenStage.call pid, {:submit_vote, candidate} end @doc ''' Respond to requests ''' def handle_call {:submit_vote, candidate}, _from, state do n = state.votes[candidate] || 0 state = % votes: Map.put(state.votes, candidate, n+1) {:reply, :ok, [%{state.id => state.votes}], state} end @doc ''' Handle events from subordinate aggregators ''' def handle_events events, _from, state do votes = Enum.reduce events, state.votes, fn e, votes -> Enum.reduce e, votes, fn {k,v}, votes -> Map.put(votes, k, v) # replace any entries for subordinates end end # Any jurisdiction specific policy would go here # Sum the votes by candidate for the published event merged = Enum.reduce votes, %{}, fn {j, jv}, votes -> # Each jourisdiction is summed for each candidate Enum.reduce jv, votes, fn {candidate, tot}, votes -> Logger.debug '@@@@ Votes in #{inspect j} for #{inspect candidate}: #{inspect tot}' n = votes[candidate] || 0 Map.put(votes, candidate, n + tot) end end # Return the published event and the state which retains # Votes by jourisdiction {:noreply, [%{state.id => merged}], % votes: votes} end end

Παρουσιαστής αποτελεσμάτων

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

πρέπει να μάθω c ή c++
defmodule Voting.ResultPresenter do use GenStage … @doc ''' Handle requests for results ''' def handle_call :get_votes, _from, state do {:reply, {:ok, state.votes}, [], state} end @doc ''' Obtain the results from this presenter ''' def get_votes id do pid = Voting.ResultPresenter.via_tuple(id) {:ok, votes} = GenStage.call pid, :get_votes votes end @doc ''' Receive votes from aggregator ''' def handle_events events, _from, state do Logger.debug '@@@@ Presenter received: #{inspect events}' votes = Enum.reduce events, state.votes, fn v, votes -> Enum.reduce v, votes, fn {k,v}, votes -> Map.put(votes, k, v) end end {:noreply, [], %state } end end

Πάρε μακριά

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

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

Το βασικό takeaway είναι να δούμε τα συστήματα ως μια συλλογή διαδικασιών επικοινωνίας. Προγραμματίστε πρώτα το σύστημα από άποψη σχεδιασμού διαδικασίας και δευτερόλεπτα από λογική κωδικοποίηση.

Κατανόηση των βασικών

Τι είναι το Elixir και το OTP;

Το Elixir είναι μια λειτουργική γλώσσα προγραμματισμού που βασίζεται στο Erlang VM. Το OTP είναι ένα πλαίσιο προγραμματισμού προσανατολισμένο στη διαδικασία, αναπόσπαστο των Erlang και Elixir.

Τι είναι η ανάπτυξη προσανατολισμένη στη διαδικασία;

Η ανάπτυξη προσανατολισμένη στη διαδικασία επικεντρώνεται στη δομή διαδικασίας ενός συστήματος πρώτα και στη λειτουργική λογική του δευτέρου συστήματος.

Τι απαιτείται για την καλύτερη υιοθέτηση του Elixir / OTP και της διαδικασίας προσανατολισμένης στη διαδικασία;

Ξεκινήστε με την εκπαίδευση ή την εξερεύνηση που επικεντρώνεται στο OTP και στη διαχείριση διαδικασιών και στη συνέχεια στη σύνταξη και τις λειτουργικές πτυχές του Elixir. Αποφύγετε την προπόνηση που ξεκινά με παραδείγματα κωδικοποίησης hello world και φτάνει μόνο στο OTP στη μέση.

Γιατί να υιοθετήσετε το Elixir / OTP και την ανάπτυξη με γνώμονα τη διαδικασία;

Η πτυχή της αξιοπιστίας και της ταυτόχρονης ταυτότητας του Elixir / OTP είναι τα κεφάλια και οι ώμοι πάνω από τις ανταγωνιστικές στοίβες, απαιτεί λιγότερη ικανότητα προγραμματιστή για να είναι ικανή και έχει καλύτερη απόδοση από το κουτί από το Ruby on Rails ή το Node.

Πότε να επιλέξετε το Elixir / OTP;

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

Ανώτερος Μηχανικός Δεδομένων

Αλλα

Ανώτερος Μηχανικός Δεδομένων
Ψηφιακές εταιρείες και αποτίμηση άυλων περιουσιακών στοιχείων

Ψηφιακές εταιρείες και αποτίμηση άυλων περιουσιακών στοιχείων

Διαδικασίες Χρηματοδότησης

Δημοφιλείς Αναρτήσεις
Scaling Scala: Τρόπος Dockerize χρησιμοποιώντας Kubernetes
Scaling Scala: Τρόπος Dockerize χρησιμοποιώντας Kubernetes
Μείωση του κόστους σε ένα ψηφιακό μέλλον πετρελαίου και φυσικού αερίου
Μείωση του κόστους σε ένα ψηφιακό μέλλον πετρελαίου και φυσικού αερίου
Το GWT Toolkit: Δημιουργήστε ισχυρές διεπαφές JavaScript χρησιμοποιώντας Java
Το GWT Toolkit: Δημιουργήστε ισχυρές διεπαφές JavaScript χρησιμοποιώντας Java
Επισκόπηση των δημοφιλών δημιουργών στατικών ιστότοπων
Επισκόπηση των δημοφιλών δημιουργών στατικών ιστότοπων
Γνωρίστε το Volt, ένα πολλά υποσχόμενο Ruby Framework για δυναμικές εφαρμογές
Γνωρίστε το Volt, ένα πολλά υποσχόμενο Ruby Framework για δυναμικές εφαρμογές
 
Οι μεγάλες ερωτήσεις οδηγούν σε εξαιρετικό σχεδιασμό - Ένας οδηγός για τη διαδικασία σκέψης σχεδιασμού
Οι μεγάλες ερωτήσεις οδηγούν σε εξαιρετικό σχεδιασμό - Ένας οδηγός για τη διαδικασία σκέψης σχεδιασμού
Η Ψυχολογία του Σχεδιασμού και η Νευροεπιστήμη του Amazing UX
Η Ψυχολογία του Σχεδιασμού και η Νευροεπιστήμη του Amazing UX
APIs στα κοινωνικά δίκτυα: Η διαδικτυακή πύλη στον πραγματικό κόσμο
APIs στα κοινωνικά δίκτυα: Η διαδικτυακή πύλη στον πραγματικό κόσμο
Οδηγός επένδυσης Family Office: Μια εναλλακτική λύση στο επιχειρηματικό κεφάλαιο
Οδηγός επένδυσης Family Office: Μια εναλλακτική λύση στο επιχειρηματικό κεφάλαιο
Αρχές Σχεδιασμού - Εισαγωγή στην Οπτική Ιεραρχία
Αρχές Σχεδιασμού - Εισαγωγή στην Οπτική Ιεραρχία
Δημοφιλείς Αναρτήσεις
  • προγραμματισμός c και c++
  • πώς να δοκιμάσετε μια μέθοδο σε java
  • στοιχεία και αρχές των παραδειγμάτων σχεδιασμού
  • Υπολογιστής μισθών εργολάβων εναντίον εργαζομένων
  • Ο καλός σχεδιασμός της βάσης δεδομένων δεν περιλαμβάνει:
  • πώς να προετοιμάσετε την τεκμηρίωση για ένα έργο λογισμικού
  • Μόντε Κάρλο κατανομή πιθανοτήτων προσομοίωσης
Κατηγορίες
  • Επενδυτές & Χρηματοδότηση
  • Σχεδιασμός Διεπαφής Χρήστη
  • Τεχνολογία
  • Διαχείριση Έργου
  • © 2022 | Ολα Τα Δικαιώματα Διατηρούνται

    portaldacalheta.pt