# Ανάδραση

## Χαρακτηριστικά απαντητικών εφαρμογών

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

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

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

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

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

- Αφήνουν τους χρήστες να γνωρίζουν πότε η διαδικασία εξελίσσεται.

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

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

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

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

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

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

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

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

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

## Αποδεκτοί χρόνοι απόκρισης

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

### Μέγιστοι αποδεκτοί χρόνοι απόκρισης για τυπικά συμβάντα

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

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

### Κατευθυντήριες γραμμές

- Επιβεβαιώστε ότι η εφαρμογή σας παρέχει ανάδραση μέσα σε 100 ms (0,1 δεύτερα) μετά από κάθε πάτημα πλήκτρου, κίνηση του ποντικιού, ή άλλη φυσική καταχώριση από τον χρήστη.

- Επιβεβαιώστε ότι η εφαρμογή σας παρέχει ανάδραση μέσα σε 100 ms (0,1 δεύτερα) μετά από κάθε αλλαγή στην κατάσταση των ελέγχων που αντιδρούν στην εισαγωγή από τον χρήστη - για παράδειγμα, εμφάνιση μενού ή ένδειξη απόθεσης στόχων.

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

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

## Απόκριση στα αιτήματα του χρήστη

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

### Κατευθυντήριες γραμμές

- Εμφανίστε την ανάδραση όσο πιο σύντομα γίνεται.

- Αν δεν μπορείτε να εμφανίσετε όλες τις πληροφορίες που ο χρήστης έχει ζητήσει, εμφανίστε πρώτα τις πιο σημαντικές από αυτές.

- Κερδίστε χρόνο εμφανίζοντας προσεγγιστικά αποτελέσματα κατά τον υπολογισμό των τελικών αποτελεσμάτων.

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

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

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

- Καθυστερήστε τις εργασίες που δεν επείγουν. Εκτελέστε τις αργότερα, όταν υπάρχει περισσότερος διαθέσιμος χρόνος.

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

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

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

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

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

## Τύποι οπτικής ανάδρασης

Μπορείτε να χρησιμοποιήσετε δύο τύπους οπτικής ανάδρασης για λειτουργίες στην ανάδραση του δείκτη της εφαρμογή σας και κινήσεις προόδου.

### Ανάδραση δείκτη

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

#### Απασχολημένος δείκτης (αριστερά) και διαδραστικά απασχολημένος δείκτης (δεξιά)

Απασχολημένος δείκτης (αριστερά) και απασχολημένος διαδραστικός δείκτης (δεξιά)

### Κινήσεις προόδου

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

#### Κατευθυντήριες γραμμές

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

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

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

#### Γραμμές προόδου

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

##### Παράθυρα προόδου - γραμμή κατάστασης

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

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

- Τα παράθυρα προόδου μπορούν να μεταφέρουν περισσότερες πληροφορίες.

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

- Τα παράθυρα προόδου παρέχουν ένα κουμπί ακύρωσης.

#### Παράθυρα λίστας ελέγχου

Ένα παράθυρο λίστας ελέγχων εμφανίζει τη σειρά των σταδίων σε μια λειτουργία. Δείτε .

##### Ένα παράθυρο λίστας ελέγχου

Ένα παράθυρο λίστας ελέγχων που εμφανίζει μια σειρά βημάτων

## Επιλογή κατάλληλης ανάδρασης

Για τον προσδιορισμό του τύπου της οπτικής ανάδρασης για μια συγκεκριμένη λειτουργία, σκεφτείτε αυτούς τους συντελεστές:

- Εάν η εφαρμογή σας μπορεί να δώσει μια εκτίμηση της προόδου της λειτουργίας.

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

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

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

### Οπτικοί τύποι ανάδρασης για λειτουργίες που διαρκούν τουλάχιστον 1 δευτερόλεπτο

Τυπική διάρκεια > 5 δευτερόλεπτα; | Να εμποδίζεται ο χρήστης να συντάσσει επιπρόσθετες εντολές; | Η εφαρμογή έχει αποκλειστική περιοχή κατάστασης; | Κατάλληλη ανάδραση
--- | --- | --- | ---
Ναι | Ναι | Ναι | Εσωτερική κίνηση και ανάδραση δείκτη
Ναι | Ναι | Όχι | Ανάδραση δείκτη
Ναι | Όχι | Ναι | Εσωτερική κίνηση
Όχι | Ναι | Ναι | Εσωτερική κίνηση και ανάδραση δείκτη
Όχι | Ναι | Όχι | Εξωτερική κίνηση και ανάδραση δείκτη
Όχι | Όχι | Ναι | Εσωτερική κίνηση
Όχι | Όχι | Όχι | Εξωτερική κίνηση

### Κατευθυντήριες γραμμές

- Χρησιμοποιήστε έναν απασχολημένο δείκτη όποτε οι χρήστες εμποδίζονται από αλληλεπίδραση με την εφαρμογή σας για 1 δευτερόλεπτο ή περισσότερο. Εμφανίστε τον απασχολημένο δείκτη λιγότερο από 1 δευτερόλεπτο μετά την έναρξη της λειτουργίας.

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

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

## Να επιτρέπονται οι διακοπές

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

### Κατευθυντήριες γραμμές

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

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

- Ονομάστε το κουμπί στάση εάν η εντολή μπορεί να διακοπεί, αλλά τα αποτελέσματά της μέχρι αυτό το σημείο δεν μπορούν (ή δεν πρέπει) να αντιστραφούν. Όταν ο χρήστης πατά αυτό το κουμπί, ανοίξτε ένα πλαίσιο ειδοποίησης που προειδοποιεί για τις ενδεχόμενες παρενέργειες παύσης της εντολής. Το πλαίσιο ειδοποίησης πρέπει να έχει μόνο δύο κουμπιά: ένα για συνέχιση της διεργασίας της εντολής και ένα για άμεσο τερματισμό της.

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

- Δεν υπάρχει καμιά κίνηση προόδου για την εντολή, ή

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

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

    Να συνεχιστεί η διαγραφή αρχείων; [Συνέχιση διαγραφής]
        [Παύση διαγραφής]

αντί για

    Η λειτουργία διακόπηκε, να συνεχιστεί; [Ναι]
        [Όχι]

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