Προσανατολισμένο σε δεδομένα αντικειμενοστραφής σχεδιασμός

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

Επομένως, τι είναι ο Σχεδιασμός με Δεδομένα, πώς διαφέρει από το OOP και ποιοι είναι οι κανόνες που περιβάλλουν τον τρόπο σκέψης για το γράψιμο του κώδικα DOP;

Πώς διαφέρει από το OOP;

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

  1. Καθορίστε ποια αντικείμενα είναι.
  2. Προσδιορίστε ποιοι τύποι δεδομένων ανήκουν σε ένα αντικείμενο.
  3. Περιγράψτε τη λειτουργικότητα ενός αντικειμένου.

Αυτά τα αντικείμενα αλληλεπιδρούν με άλλα αντικείμενα μέσω των λειτουργιών που διαθέτει κάθε αντικείμενο.

Πώς λειτουργούν τα αντικείμενα στα OOP

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

Από αυτή την έννοια έχουμε επίσης το πλεονέκτημα του Πολυμορφισμού (Poly - Many, Morph - Forms) περιγράφει ένα πρότυπο στο αντικείμενο προσανατολισμένο προγραμματισμό στο οποίο οι κλάσεις έχουν διαφορετική λειτουργικότητα ενώ μοιράζονται μια κοινή διεπαφή. Αν σκέφτεστε για την ταξινόμηση των ζώων, γνωρίζοντας ότι μια γάτα και μια τίγρη είναι μέρος της κατηγορίας "αιλουροειδών", γνωρίζω αυτόματα μια καλή συμφωνία για καθένα από αυτά χωρίς να καταδύεστε σε συγκεκριμένα χαρακτηριστικά των συγκεκριμένων τάξεων τους. Και οι δύο "κληρονομήσουν" ορισμένα χαρακτηριστικά και δεδομένα από την ανώτερη κατηγορία αιλουροειδών.

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

Ένα παράδειγμα της εργασίας που μπορεί να έχει ένας επεξεργαστής σε ένα σύστημα OOP.

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

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

Γιατί DOP;

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

Ένα άλλο πλεονέκτημα της DOP είναι η αποτελεσματική χρήση της μνήμης cacheing. Επειδή το DOP χρησιμοποιεί τις ίδιες λειτουργίες ξανά και ξανά, η μνήμη cache δεν αναγκάζεται να αποθηκεύει όλο και περισσότερα καινούργια αλλά όχι πραγματικά νέα μπλοκ διδασκαλίας.

Πηγές

https://www.danielsefton.com/2016/05/developing-a-data-oriented-game-engine-part-1/

https://www.packtpub.com/books/content/what-difference-between-function-and-object-oriented-programming

https://www.gamasutra.com/view/news/126498/Opinion_What_You_Need_To_Give_Up_When_Going_Data_Oriented.php

https://prateekvjoshi.com/2013/11/30/programming-paradigms-object-oriented-vs-data-oriented/

http://gamesfromwithin.com/data-oriented-design