Page 1 of 1
Αλγόριθμος Undo
Posted: Sun Jul 12, 2009 5:27 pm
by S.a.kiss.007
Καλησπέραααα
Γνωρίζει κανείς τι αλγόριθμος τρέχει από πίσω όταν πατάω σε ένα πρόγραμμα "Undo"?
Κρατάει 2 (ή παραπάνω) "status" του project και γυρίζει πίσω?
Κρατάει την τελευταία (ή παραπάνω) εντολή που δώθηκε από τον χρήστη και ενεργεί αντίστροφα?
Κάτι άλλο?

Re: Αλγόριθμος Undo
Posted: Sun Jul 12, 2009 5:51 pm
by gasparosoft
Για τα παρακάτω δεν είμαι 100% σίγουρος.
Βασικά ό,τι κάνεις μπαίνουν σε μια stack. Όταν κάνεις undo τότε γίνεται pop από την stack η τελευταία ενέργεια που εκτελέστηκε. Τώρα πόσες ενέργειες και ποιες είναι δικό σου ζήτημα. Ανάλογα πάντα με το μέγεθος της stack και τις ενέργειες.
Re: Αλγόριθμος Undo
Posted: Sun Jul 12, 2009 6:40 pm
by necrofear_13
Οπως τα λεει ο γιαννης.Το ποσες ενεργειες εξαρταται απο την υλοποιηση και το μεγεθος της stack.
Re: Αλγόριθμος Undo
Posted: Sun Jul 12, 2009 6:45 pm
by S.a.kiss.007
Ναι οκ όπως τα λέει... Νομίζω όλοι έχουμε ακούσει πως το undo υλοιποιείται με στοίβα, αλλά τπτ άλλο...
π.χ. όπως ξαναείπα, κρατούνται οι ενέργειες οι διαφορετικές "καταστάσεις" του προγράμματος?
Επίσης πως κρατάς ενέργειες σε μια στοίβα?

Εννοώ σε τι μορφή?
Re: Αλγόριθμος Undo
Posted: Sun Jul 12, 2009 7:52 pm
by cyberpython
Εξαρτάται από την εφαρμογή π.χ. αν γράφεις σε Java έναν text editor τότε κάθε φορά που συμβαίνει ένα γεγονός (π.χ. πάτημα πλήκτρου στο πληκτρολόγιο, paste από το clipbaord κλπ.) αν αυτό το γεγονός είναι undoableEdit τότε προστίθεται στη στοίβα (βασικά στο συγκεκριμένο παράδειγμα δεν είναι ορατό γιατί απλά ειδοποιείται ένας UndoManager). Αντίστοιχα σε μία στοίβα μπαίνουν και τα γεγονότα που κάναμε undo ώστε να μπορεί να γίνει επανάληψή τους.
Re: Αλγόριθμος Undo
Posted: Sun Jul 12, 2009 9:13 pm
by SeniorCarbone
Η στοίβα καταστάσεων είναι μια λύση. Μια άλλη λύση λιγότερο απαιτητική στην μνήμη - περισσότερο στην επεξεργασία θα ήταν να γράφεις σε στοίβα τα operations που γίνονται σε κάθε βήμα και για να πας σε κάποια προηγούμενη κατάσταση αρκεί να εκτελείς το αντίστροφο operation ανά βήμα που βγάζεις από την στοίβα. Αυτό προϋποθέτει τα operations που χρησιμοποιείς να είναι αντιστρέψιμα φυσικά. Απλά σαν εναλλακτική το αναφέρω εάν ταιριάζει με την υλοποίηση που θες. Δεν αξίζει πάντα κάτι τέτοιο, πχ για διανυσματικές ή υπολογιστικές εφαρμογές το χρησιμοποιούν κ αν.
Είχα χρησιμοποιήσει το undo με αντίστροφα operations σε μια εφαρμογή που είχα φτοιάξει για image processing οπότε αν πχ εφάρμοζες ένα φίλτρο f σε ολόκληρο το image κ ήθελες να κάνεις undo να μην χρειαζόταν να κράταγες πληροφορίες για όλα τα pixels κτλπ αλλά μόνο το f ώστε μετά εύκολα να εφάρμοζες το f' .
Re: Αλγόριθμος Undo
Posted: Sun Jul 12, 2009 9:52 pm
by mikem4600
SeniorCarbone wrote:Μια άλλη λύση λιγότερο απαιτητική στην μνήμη - περισσότερο στην επεξεργασία θα ήταν να γράφεις σε στοίβα τα operations που γίνονται σε κάθε βήμα και για να πας σε κάποια προηγούμενη κατάσταση αρκεί να εκτελείς το αντίστροφο operation ανά βήμα που βγάζεις από την στοίβα.
Έτσι όπως το περιγράφεις δουλεύει στο undo σε σχεδόν όλα τα προγράμματα. Χρησιμοποιούν μάλιστα το
command pattern για να αποθηκεύουν τις εντολές του χρήστη.
Re: Αλγόριθμος Undo
Posted: Mon Jul 13, 2009 9:51 am
by shodanjr_gr
gasparosoft wrote:Για τα παρακάτω δεν είμαι 100% σίγουρος.
Βασικά ό,τι κάνεις μπαίνουν σε μια stack. Όταν κάνεις undo τότε γίνεται pop από την stack η τελευταία ενέργεια που εκτελέστηκε. Τώρα πόσες ενέργειες και ποιες είναι δικό σου ζήτημα. Ανάλογα πάντα με το μέγεθος της stack και τις ενέργειες.
Όπως το λένε τα παιδιά είναι. Κρατάς ένα μία στοίβα με τα operations και δύο states. Το state που αντιστοιχεί στην βάση της στοίβας και το "τρέχον" state. Όταν κάνεις pop (undo) μία command, κάνεις iterate τα περιεχόμενα της στοίβας και ξανακατασκευάζεις το state από την κατάσταση της βάσης (ή μπορείς να εφαρμόζεις το "αντίστροφο" operation πάνω στο state της κορυφής).
Αν τα operations που κάνεις είναι βαριά (πχ. εφαρμογή ενός ακριβού φίλτρου σε μία εικόνα, ένα μεγάλο refractoring κώδικα κλπ) ίσως έχει και νόημα όταν κάνεις push ένα operation στη στοίβα να κρατάς και ένα αντίγραφο του state πριν την εντολή ώστε να μπορείς να κάνεις γρήγορα revert.