Ένας κυκλικός buffer, ένας επανακυκλούμενος buffer ή ένας buffer δακτυλίου είναι μια δομή δεδομένων που χρησιμοποιεί έναν μόνο buffer σταθερού μεγέθους, σαν να ήταν συνδεδεμένος από άκρη σε άκρη.
Ένας κυκλικός buffer ξεκινάει κενός και με κάποιο προκαθορισμένο μήκος. Για παράδειγμα, αυτός είναι ένας buffer 7 στοιχείων:
[ ][ ][ ][ ][ ][ ][ ]
Ας υποθέσουμε ότι ένα 1 γράφεται στη μέση του buffer (η ακριβής αρχική θέση δεν έχει σημασία σε έναν κυκλικό buffer):
[ ][ ][ ][1][ ][ ][ ]
Έπειτα, ας υποθέσουμε ότι προστίθενται άλλα δύο στοιχεία, το 2 και το 3, τα οποία προσαρτώνται μετά το 1:
[ ][ ][ ][1][2][3][ ]
Αν στη συνέχεια αφαιρεθούν δύο στοιχεία από τον buffer, αφαιρούνται οι παλαιότερες τιμές που υπάρχουν μέσα του. Τα δύο στοιχεία που αφαιρούνται, στην περίπτωση αυτή, είναι το 1 και το 2, αφήνοντας τον buffer με ένα μόνο 3:
[ ][ ][ ][ ][ ][3][ ]
Αν ο buffer έχει 7 στοιχεία, τότε είναι τελείως γεμάτος:
[5][6][7][8][9][3][4]
Όταν ο buffer γεμίσει, πετάγεται ένα σφάλμα, ειδοποιώντας τον client ότι περαιτέρω εγγραφές μπλοκάρονται μέχρι να ελευθερωθεί μια θέση.
Όταν ο buffer είναι γεμάτος, ο client μπορεί να επιλέξει να αντικαταστήσει τα παλαιότερα δεδομένα με μια εξαναγκασμένη εγγραφή. Στην περίπτωση αυτή, προστίθενται άλλα δύο στοιχεία, το A και το B, τα οποία αντικαθιστούν το 3 και το 4:
[5][6][7][8][9][A][B]
Τα 3 και 4 έχουν αντικατασταθεί από τα A και B, κάνοντας το 5 τα παλαιότερα δεδομένα μέσα στον buffer. Τέλος, αν αφαιρεθούν δύο στοιχεία, αυτό που θα επιστραφεί είναι τα 5 και 6, δίνοντας τον buffer:
[ ][ ][7][8][9][A][B]
Επειδή υπάρχει διαθέσιμος χώρος, αν ο client χρησιμοποιήσει ξανά την αντικατάσταση για να αποθηκεύσει το C και το D, τότε θα χρησιμοποιηθεί ο χώρος όπου ήταν αποθηκευμένα προηγουμένως το 5 και το 6, και όχι η θέση του 7 και του 8. Το 7 εξακολουθεί να είναι το παλαιότερο στοιχείο και ο buffer είναι για άλλη μια φορά γεμάτος.
[C][D][7][8][9][A][B]
Αυτή η άσκηση εισάγει μερικές έννοιες που μπορεί να μην έχεις ξαναδεί:
Στη 8th, όλες οι λέξεις ανήκουν σε έναν χώρο ονομάτων, π.χ. το a:new αναφέρεται στη λέξη new του χώρου ονομάτων a.
Μπορείς επίσης να ορίσεις δικούς σου χώρους ονομάτων, κάτι που κάνουμε στην αρχή του αρχείου circular-buffer.8th:
ns: cb
Αυτό σημαίνει ότι όλες οι λέξεις μέσα σε αυτό το αρχείο είναι προσβάσιμες μέσω του cb:<word>, που είναι ένας εξαιρετικός τρόπος να ομαδοποιείς σχετική λειτουργικότητα.
Για περισσότερες πληροφορίες, ρίξε μια ματιά στην τεκμηρίωση για τους χώρους ονομάτων.
Οι λέξεις read και write αναμένεται και οι δύο να πετάξουν μια εξαίρεση όταν κληθούν σε έναν κυκλικό buffer με μη έγκυρη κατάσταση.
Για περισσότερες πληροφορίες, δες την τεκμηρίωση για τις εξαιρέσεις και τον χειρισμό σφαλμάτων.
Παρόλο που είσαι ελεύθερος να υλοποιήσεις τον κυκλικό buffer όπως θέλεις, θα μπορούσες να σκεφτείς να χρησιμοποιήσεις την υποστήριξη για αντικείμενα της 8th.
Γράψου στο Exercism για να μάθεις και να κατακτήσεις 8th με 70 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.
Σε αυτό το βίντεο ρίχνουμε μια ματιά στον κυκλικό buffer, τι είναι, πού χρησιμοποιείται και διάφορες υλοποιήσεις, όπως ουρές, στατικούς και δυναμικούς πίνακες, αμετάβλητες δομές δεδομένων και μια διασκεδαστική υλοποίηση βασισμένη σε agents.