Linea guida: Interfaccia utente (Generale)
Questa guida fornisce le regole generali per lo sviluppo di interfacce utente basate su finestre
Relazioni
Descrizione principale

Principi fondamentali della finestra: Impostazione del contesto

Questa sezione fornisce una panoramica dell'anatomia di un'interfaccia utente basata su finestre. Questa panoramica è necessaria per comprendere il resto della guida.

Un'interfaccia utente basata su finestre è suddivisa in pannelli. Le finestre possono essere spostate sullo schermo, sovrapposte una sull'altra e rese a icona. In genere un sistema dispone di una finestra primaria e di un determinato numero di finestre secondarie. La finestra primaria gestisce l'interazione maggiore con l'utente e spesso contiene un numero arbitrario di oggetti. Le finestre secondarie vengono utilizzate per supportare le interazioni con le finestre primarie, fornendo i dettagli relativi agli oggetti e alle operazioni correlate a quegli oggetti.

Finestre primarie

La finestra principale spesso contiene un numero arbitrario di oggetti con i quali interagisce l'utente. L'utente di solito interagisce con il sistema selezionando prima uno o diversi oggetti, ad esempio facendo clic su di essi, e quindi scegliendo un'operazione (ad esempio, tramite un menu) che viene eseguita su tutti gli oggetti selezionati. Operazioni comuni sono Taglia, Copia, Incolla, Elimina e Visualizza proprietà.

La finestra principale normalmente contiene una barra menu, dalla quale gli utenti possono scegliere le operazioni. Gli utenti possono anche scegliere le operazioni tramite i menu a comparsa (facendo clic con il tasto destro del mouse sull'oggetto) e tramite manipolazione diretta (selezionando e trascinando l'oggetto). Poiché all'interno della finestra principale potrebbero non essere visualizzati completamente tutti gli oggetti, gli utenti possono spesso scorrerli con la barra di scorrimento o possono modificare le dimensioni della finestra. Inoltre, la finestra principale spesso può essere suddivisa in pannelli (definendo delle aree secondarie nella finestra); l'utente può modificare la dimensione anche dei pannelli.

Composti

Un oggetto composto in un'interfaccia utente è un oggetto visivamente composto da altri oggetti. Ad esempio, un paragrafo è composto da caratteri oppure un oggetto di disegno complesso è formato da più oggetti primitivi di disegno.

Finestre secondarie

Le finestre secondarie supportano le finestre primarie fornendo i dettagli (ad esempio le proprietà) relativi ai propri oggetti e le operazioni effettuate su quegli oggetti. Di solito nella finestra principale vengono visualizzate solo alcune delle proprietà degli oggetti. Le proprietà di un oggetto possono essere visualizzate aprendo una finestra di proprietà (si tratta di una finestra secondaria) che mostra tutti gli attributi di un oggetto. L'utente può spesso modificare gli attributi tramite i controlli, ad esempio i pulsanti di opzione e di attivazione/disattivazione, le scale, le caselle combinate ed i campi di testo.

Esiste una linea sottile, e a volte abbastanza fittizia, fra le finestre primarie e quelle secondarie; possono visualizzare gli stessi livelli di complessità. Tuttavia esistono due importanti differenze fra le finestre principale e secondaria:

  • Le finestre primarie sono spesso considerate più importanti per l'applicazione, in quanto devono fornire un'ampia utilizzabilità. Quindi l'impegno lavorativo dello sviluppo tende ad essere più incentrato sulle finestre primarie.
  • Le finestre secondarie vengono spesso visualizzate tramite l'esplorazione nelle finestre primarie e non viceversa.

Oltre alle finestre di proprietà, esistono altri tipi di finestre secondarie, ad esempio le finestre di dialogo, le finestre di messaggi, le tavolozze e le finestre a comparsa.

Molte applicazioni si basano sui file. Gli utenti possono avviare queste applicazioni con l'operazione Apri su un oggetto file (ad esempio, facendo doppio clic sull'icona di un file in una cartella). La relativa finestra principale mostra gli oggetti memorizzati in quel file. Le operazioni comuni sui file sono Salva, Salva con nome, Apri e Nuovo, in genere selezionabili tramite il menu File nella finestra principale. La finestra principale di solito è anche in grado di visualizzare più file (denominata anche MDI, Multiple Document Interface), consentendo quindi all'utente di passare da un file all'altro.

Dimensioni visive

La chiave per ottenere delle finestre primarie utilizzabili è di usare le dimensioni visive quando si visualizzano gli oggetti ed i relativi attributi. I vantaggi nel presentare più attributi di quanti non ne siano necessari per l'identificazione sono:

  • L'utente evita un eccesso di esplorazione di finestre, poiché si diminuisce il numero di finestre da visualizzare (quando l'utente deve visionare un attributo presentato nella finestra principale).
  • L'utente può vedere i diversi aspetti (di oggetti differenti) contemporaneamente, spesso utile per i confronti e per iniziare a riconoscere i pattern (modelli). Un buon utilizzo delle dimensioni visive può incoraggiare gli utenti a sviluppare un approccio interamente nuovo per il proprio lavoro.

Le dimensioni visive sono:

Queste dimensioni vengono presentate di seguito. Tuttavia, durante la progettazione della visualizzazione di oggetti tenere presente l'area disponibile dello schermo. Quando si utilizza l'area dello schermo, è necessario tentare di mantenere al minimo l'eccesso e valutare se l'utilizzo di diverse dimensioni visive valga l'ulteriore espansione dell'area dello schermo. Forse all'utente è sufficiente un semplice elenco di nomi, poiché quello di cui ha realmente bisogno è di visualizzare quanti più oggetti possibile.

E' importante utilizzare le dimensioni visive, o estenderle, se si desidera identificare gli oggetti in maniera univoca. Di seguito viene trattato ancora l'argomento (consultare la sezione "Identificazione" riportata più avanti).

Le dimensioni visive, inoltre, possono essere utilizzate in correlazione con la dimensione temporale, ad esempio spostando gli oggetti (la loro posizione viene modificata nel tempo), o modificando la forma o il colore degli oggetti (il loro stato viene modificato nel tempo); quest'ultimo caso è trattato nella sezione "Forma" riportata più avanti.

Posizione

L'aspetto più intuitivo che la posizione possa presentare è la posizione nella realtà. Esempi:

  • I GIS (Geographical Information System) che visualizzano una mappa su cui vengono presentati gli oggetti alla stessa longitudine e latitudine in cui si trovano realmente.
  • I programmi CAD (Computer Aided Design) che presentano gli oggetti ed il relativo ambiente esattamente secondo le reali coordinate.
  • Gli editor WYSIWYG (What You See Is What You Get) che visualizzano gli oggetti (caratteri) nella finestra nello stesso posto in cui apparirebbero su una stampa.

Alle volte è importante mostrare la dimensione reale (gli esempi del programma CAD e dell'editor WYSIWYG) e altre volte no (ad esempio, quando la dimensione degli oggetti è molto più piccola della distanza fra gli oggetti).

Per esempio, si supponga di disporre di un sistema di prenotazione voli in cui è necessario immettere le destinazioni. Una possibile presentazione potrebbe essere la visualizzazione di una mappa che contiene i diversi aeroporti (dove un aeroporto è un oggetto). Naturalmente, poiché le dimensioni reali degli aeroporti sono irrilevanti (oltre che troppo piccole per essere visualizzate), tutti gli aeroporti vengono mostrati come icone della stessa misura.

Questo esempio mostra inoltre che le posizioni reali possono essere utilizzate anche se non sono rilevanti, purché utili all'utente per identificare gli oggetti. Nell'esempio l'utente non ha bisogno di conoscere la posizione di un aeroporto. Ma se ha nozioni di geografia, può essere più facile trovare le destinazioni su una mappa, piuttosto che in un elenco.

È anche possibile utilizzare la posizione per rappresentare posizioni reali "virtuali". Ad esempio, si immagini un sistema di acquisti in cui gli utenti possono comprare gli articoli da negozi diversi. Una possibile presentazione potrebbe essere la visualizzazione di un'immagine schematica di un centro commerciale (virtuale) in cui sono collocati i diversi negozi (dove ogni negozio è un oggetto). L'immagine schematica non ha nulla a che vedere con le vere sedi dei negozi, sfrutta semplicemente la memoria spaziale dell'utente: è più facile ricordare una posizione x-y piuttosto che una voce in un elenco o in una gerarchia.

Un ulteriore utilizzo della posizione è di mostrare le associazioni fra gli oggetti: tutti gli oggetti che hanno la stessa posizione verticale sono associati in un modo e tutti gli oggetti con la stessa posizione orizzontale sono associati in un altro modo. I fogli elettronici ne sono un esempio.

Un'alternativa simile è di consentire che un asse rappresenti la scala di valori di un attributo. Ad esempio, in un sistema di prenotazione viaggi, i voli prenotati (dove ogni volo è un oggetto) potrebbero essere presentati lungo un asse temporale orizzontale, mostrando la loro relazione nel tempo, quanto durano ed il periodo di tempo che l'utente trascorre in ciascuna destinazione. Queste sono tutte cose che l'utente non ha bisogno di sapere ma che sono piacevoli da vedere, se possono essere presentate con discrezione.

Se non si desidera utilizzare una così ampia area dello schermo presentando l'intera scala dei valori, è possibile comprimere le distanze fra gli oggetti. Nell'esempio delle prenotazioni di viaggi, ciò vorrebbe dire che tutti i voli prenotati vengono distribuiti orizzontalmente senza spazi in mezzo, con il primo volo a sinistra, il secondo immediatamente dopo, a destra del primo volo, e così via. Gli utenti non vedrebbero il periodo di tempo in cui possono stare in ciascuna destinazione ma potrebbero vedere la durata dei voli.

Dimensione

In molti casi la "dimensione" deve rappresentare la stessa cosa della posizione. In un sistema CAD, per esempio, la dimensione deve rappresentare l'ampiezza reale. A volte, tuttavia, si è liberi di scegliere cosa deve rappresentare la dimensione, ad esempio gli aeroporti sulla mappa che supportava la scelta della destinazione.

In questi casi la dimensione deve rappresentare quello che viene percepito più intuitivamente come dimensione reale dell'oggetto. Per un file, la dimensione dell'oggetto dovrebbe rappresentare la quantità di spazio su disco occupata. Per un conto in banca, la dimensione dell'oggetto verrebbe rappresentata dal saldo. Per la maggior parte delle dimensioni, una scala logaritmica è meglio di quella proporzionale, poiché una scala proporzionale in genere utilizza troppo spazio sullo schermo.

La dimensione in realtà è così intuitiva che si può considerare di visualizzarla anche se non è rilevante. Dopo tutto, nella realtà, cose diverse (oggetti) occupano proporzioni differenti del nostro campo visuale, a causa della loro dimensione diversa. E non è inopportuna; facilita semplicemente la differenziazione delle cose. In modo simile, l'utilizzo di dimensioni diverse nell'interfaccia utente spesso facilita la distinzione fra oggetti differenti.

La dimensione normalmente deve essere utilizzata per presentare un solo attributo, anche se sarebbe possibile consentire all'estensione orizzontale la presentazione di un attributo e a quella verticale la presentazione di un altro (che potrebbe risultare non intuitivo e potrebbe confondere l'utente).

L'estensione orizzontale o verticale deve essere proporzionale (logaritmicamente) all'attributo che la dimensione deve presentare; l'altra estensione deve essere fissa (o deve dipendere dalla lunghezza del nome, ad esempio). Se l'estensione orizzontale e quella verticale sono entrambe proporzionali allo stesso attributo, raramente è un valore aggiunto: è ridondante ed utilizza semplicemente maggiore spazio sullo schermo.

Forma

Le forme in genere vengono rappresentate da icone in un'interfaccia utente grafica; la forma viene utilizzata al meglio per rappresentare il tipo, poiché è più intuitivo delineare una differenza nell'aspetto che delinearla nel tipo. Nel mondo reale, oggetti diversi dello stesso tipo in genere si assomigliano, mentre oggetti di tipo diversi hanno un aspetto differente. Ad esempio, i diversi oggetti di una sedia sembrano simili (hanno tutte quattro gambe, una seduta e uno schienale), mentre un'automobile è molto diversa da una sedia.

Quindi, quali sono i criteri da considerare quando oggetti diversi sono di tipo diverso? Classi differenti devono certamente essere considerate come tipi diversi. Inoltre, alcuni attributi sono del genere "tipo". Tali attributi devono avere una serie limitata di possibili valori ed il loro valore normalmente determina cosa può essere eseguito con l'oggetto (in termini di operazioni e possibili valori di altri attributi). E' come nel mondo reale: la differenza più importante fra la sedia e l'automobile è come vengono utilizzate: una sedia viene usata per riposare ed un'automobile per il trasporto.

Tuttavia, quando si analizza cosa deve essere considerato come tipo diverso, è necessario ricordare che la cosa più importante è quale attributo l'utente percepirà più probabilmente come tipo.

Se non si dispone di più classi o di nessun attributo del genere "tipo", è possibile utilizzare le icone per rappresentare i diversi valori per altri attributi dal valore limitato, ma solo se quell'attributo è di interesse focale per l'utente.

Le icone vengono spesso utilizzate anche per mostrare i diversi stati dell'oggetto (oltre a visualizzarne il tipo). Quando un oggetto viene selezionato, in genere viene visualizzato in uno dei due seguenti modi: il colore diventa il nero o viene visualizzato un rettangolo intorno all'oggetto. Un altro possibile stato è quando si apre una finestra di proprietà dell'oggetto. In genere esistono altri stati specifici dell'applicazione che possono essere visualizzati, ad esempio se una e-mail è stata letta o meno. Accertarsi però che la presentazione dello stato non renda più difficile per l'utente la percezione del tipo e viceversa.

Colore

Il colore può essere diviso in tre componenti, in base alla percezione visiva. Sono: la tonalità (cioè rosso, blu, marrone, ecc.), la saturazione e l'oscurità. Non utilizzare dei componenti diversi per rappresentare degli attributi differenti, perché sarebbe troppo difficile da percepire per l'utente.

La tonalità può essere utilizzata per rappresentare il tipo o gli attributi con una serie limitata di possibili valori. Tuttavia, è meglio utilizzare un'icona, perché può essere progettata in modo tale che l'utente possa comprendere il valore che rappresenta, mentre non esiste un delineamento intuitivo fra contenuto del colore e (la maggior parte dei) valori. La tonalità quindi può essere utilizzata al posto delle icone, se non sono disponibili delle icone intuitive. Se si dispone di molte icone per il tipo, un'alternativa è l'utilizzo della tonalità per classificare in categorie le icone (così le icone con significato simile possono essere rosse, quelle con un altro significato blu, ecc.).

La saturazione potrebbe essere usata per rappresentare un attributo con una scala di valori, ma questo porta ad un'interfaccia utente piuttosto spiacevole e ridondante; l'utilizzo di una saturazione diversa è destabilizzante per l'occhio e un'alta saturazione è piuttosto appariscente.

L'oscurità è il componente più utilizzabile del colore. Può essere utilizzato per rappresentare un attributo con una scala di valori ed è talmente discreto che può essere usato anche per gli attributi di importanza secondaria. Perché l'oscurità sia discreta non si deve passare da nessuna oscurità (bianco) a completa oscurità (nero) ma solo da bassa oscurità (grigio chiaro) ad alta oscurità (grigio scuro). Per molti sistemi in cui gli utenti creano la maggior parte degli oggetti, è molto utile presentare gli oggetti in base al tempo; ad esempio, il periodo di tempo trascorso dall'ultima modifica. Questo facilita agli utenti l'identificazione dell'oggetto che desiderano utilizzare (spesso si tratta dell'oggetto con il più breve "periodo di tempo dall'ultima modifica"). Perciò, se non si dispone di un attributo del genere scala di valori la cui presentazione all'utente è davvero necessaria, considerare di presentare invece l'età dell'oggetto.

Spesso il colore viene utilizzato per rendere le icone esteticamente più piacevoli e anche questo è utile per utente per effettuare rapidamente una distinzione fra le icone. Se si forniscono delle icone a più colori, probabilmente è meglio non utilizzare il colore per altri scopi.

Poiché alcune persone non vedono i colori e poiché non tutti gli schermi supportano il colore, non utilizzare il colore come unico mezzo per visualizzare delle informazioni fondamentali. D'altra parte, un utilizzo ben pianificato e non appariscente del colore rende l'interfaccia utente più piacevole, da un punto di vista estetico.

Identificazione

L'utente deve essere in grado di identificare in modo univoco ciascun oggetto. A volte le altre dimensioni visive sono sufficienti per l'identificazione ma spesso non lo sono. La visualizzazione di un nome in un'icona o accanto ad essa è la tecnica più comune per consentire l'identificazione. Il vantaggio dei nomi è che un'area molto piccola dello schermo può visualizzare un grande numero di nomi distintamente differenti.

E' meglio quando un nome può essere generato da un valore di attributo (in genere testuale). L'alternativa è di consentire agli utenti di specificare i nomi quando creano gli oggetti, ma questo richiede del tempo e quindi ne riduce l'utilizzabilità.

A volte è possibile modellare l'icona in modo da potervi includere il nome. Questo risparmia spazio dello schermo e fornisce una indicazione più forte della relazione fra l'icona ed il nome. Tuttavia possono verificarsi i seguenti problemi:

  • L'icona deve essere vuota nel mezzo (dove viene visualizzato il nome).
  • I nomi hanno delle lunghezze variabili, il che significa che l'estensione orizzontale dell'icona deve dipendere dalla lunghezza del nome oppure che alcun nomi devono essere troncati.
  • L'icona deve essere molto più larga che alta, poiché tutto il testo di lunghezza ragionevole è più lungo di quanto non sia ampio.

Come risultato spesso si deve visualizzare il nome sotto l'icona o alla sua destra, che ha come vantaggio un minor utilizzo di spazio sullo schermo e come svantaggio l'oggetto (icona + nome) diventa ancora più largo di quanto non sia alto. Se non si dispone di spazio a sufficienza per visualizzare il nome (cosa possibile, poiché di solito un'icona la si identifica senza denominarla), è possibile farlo tramite le finestre a comparsa che vengono visualizzate quando il cursore è posizionato sull'icona.

Il tipo di carattere del nome può essere utilizzato per visualizzare un attributo a scelta limitata, se si riesce ad individuare una corrispondenza intuitiva fra il tipo di carattere ed i valori dell'attributo; ad esempio, si potrebbe utilizzare il grassetto o il corsivo per distinguere l'oggetto o enfatizzarne l'importanza. Nella maggior parte dei casi, tuttavia, non è appropriato utilizzare il tipo di carattere perché è piuttosto appariscente e raramente intuitivo.

Se si mostra il nome (oppure, per quel caso, qualsiasi altro testo modificabile dall'utente), è necessario consentire la modifica del nome direttamente nella finestra primaria. In alternativa l'utente deve richiedere un'operazione di ridenominazione ed immette il nuovo nome, oppure aprire la finestra delle proprietà e modificare lì il nome. Non solo è più rapido modificare il nome direttamente nella finestra principale, ma supporta il principio "dove lo si visualizza lo si modifica."

Implementazione di Trova e Seleziona

Se il gruppo di oggetti da modificare o da utilizzare è composto in modo tale che l'utente può esprimere dei criteri di selezione che li identifica, il tool di ricerca della finestra principale può risolvere il problema selezionando sempre tutte le corrispondenze ai criteri.

Esistono due possibili metodi per gestire la ricerca:

  • Nella finestra principale vengono selezionati tutti gli oggetti che soddisfano i criteri di ricerca. Se non si può garantire che tutti gli oggetti trovati verranno visualizzati contemporaneamente nella finestra principale (potrebbero essere troppo distanti), è anche possibile visualizzare un elenco di risultati nella finestra della ricerca. Dopo una ricerca, l'utente può specificare degli ulteriori criteri o eseguire un'operazione sugli oggetti selezionati. Il vantaggio di questo tipo di approccio è che consente all'utente di ordinare un'operazione su tutti gli oggetti che soddisfano i criteri di ricerca.
  • Nella finestra di ricerca si fornisce un pulsante Cerca che seleziona il successivo oggetto che soddisfa i criteri di ricerca e scorre il contenuto della finestra principale in modo da visualizzare l'oggetto. Dopo una ricerca, l'utente può eseguire un'operazione sull'oggetto selezionato e continuare ad effettuare la ricerca in modo sequenziale negli oggetti che soddisfano i criteri di ricerca. Il vantaggio di questo approccio è che l'utente può visualizzare nel suo ambiente ogni oggetto trovato (nella finestra principale piuttosto che in un elenco di risultati).

In molti casi, si può voler combinare i due metodi, ad esempio includendo un pulsante Seleziona tutto nella finestra di ricerca sequenziale o il pulsante Visualizza successivo nella finestra di ricerca parallela.

Ordinamento

Un esempio di ordinamento può essere quando il sistema dispone tutti gli oggetti verticalmente, in ordine alfabetico per nome o secondo il valore di un attributo. L'utente quindi esamina gli oggetti scorrendoli. Questo è il tipo di supporto all'esplorazione più semplice possibile, nel rispetto sia dell'implementazione che dell'operazione dell'utente. L'ordinamento è più efficace quando l'utente conosce il nome (o l'attributo in base al quale è stato effettuato l'ordinamento) dell'oggetto desiderato. Un esempio di sistema che dovrebbe essere implementato con questo metodo è un elenco telefonico. La finestra principale deve spesso disporre di un'operazione per il cambio del tipo di ordinamento e/o dei criteri.

Ereditarietà controllata dall'utente

Un esempio di ereditarietà controllata dall'utente sono gli editor WYSIWYG, in cui l'utente definisce a quale "stile" appartiene ciascun paragrafo e come questo stile (cioè, ogni carattere che appartiene allo stile) deve essere distribuito.

In confronto al tool di ricerca uno svantaggio è che l'ereditarietà controllata dall'utente supporta solo la modifica degli attributi (e possibili associazioni) per più oggetti, ma non l'esecuzione delle operazioni. L'ereditarietà controllata dall'utente aggiunge anche un compito in più, cioè che l'utente deve esplicitamente definire e gestire i gruppi (vale a dire gli stili disponibili). Si tratta, inoltre, di un concetto più complicato.

Tuttavia, se non è possibile specificare i criteri di ricerca per gli oggetti o se l'utente deve apportare delle modifiche relative ai valori degli attributi (ad esempio aumentare di due), in quel caso fornire l'ereditarietà controllata dall'utente potrebbe essere una soluzione.

Perché l'ereditarietà controllata dall'utente sia utile, la natura della classe deve essere tale da poter classificare gli oggetti in gruppi di categorie (con un significato logico per l'utente) in cui la maggior parte dei valori degli attributi sono uguali.

Un vantaggio rispetto al tool di ricerca è che l'ereditarietà controllata dall'utente supporta la sostituzione; ad esempio, modifica il valore dell'attributo ma solo se non è stato definito esplicitamente nell'oggetto. Inoltre l'ereditarietà controllata dall'utente può abilitare l'utente ad effettuare le definizioni più generiche (e quindi potenti) dei valori degli attributi; ad esempio, ereditare il tipo di carattere dallo stile ma ingrandirlo di due pixel. L'ereditarietà controllata dall'utente è particolarmente utile quando i gruppi non dispongono di criteri di ricerca facili da specificare.

La classe per la quale supportare l'ereditarietà controllata dall'utente può ereditare sé stessa oppure si può creare una nuova classe da cui ereditare lo scopo. Far sì che la classe erediti sé stessa è un po' più efficace, poiché lo stesso oggetto può essere utilizzato sia per ereditare che per eseguire le cose che originariamente erano state previste per l'oggetto, come essere una fattura, un conto e così via. Questo comporta meno classi da gestire per l'utente (ed il sistema). D'altro canto, la creazione di una nuova classe da cui ereditare ha il vantaggio di essere di più facile comprensione, poiché l'ereditarietà è chiaramente separata dalla normale operazione della classe. La creazione di una nuova classe è la soluzione migliore nella maggior parte dei casi, specialmente se gli utenti non dispongono di una grande esperienza in informatica e nei modelli orientati sugli oggetti. La nuova classe creata di preferenza deve ereditare sé stessa, per supportare più livelli di ereditarietà.

Per la maggior parte dei sistemi l'utente spesso deve modificare il gruppo di ereditarietà di particolari oggetti, poiché l'utente non sa in anticipo esattamente come devono essere strutturati i gruppi di ereditarietà. Fornire un'operazione per questa attività.

Se si decide di supportare nel sistema l'ereditarietà controllata dall'utente, analizzare cosa deve essere ereditato (attributi, associazioni, classe) e consentire l'ereditarietà solo per quelle caratteristiche. Questo porta ad un metodo meno generico ma più semplice (sia per gli utenti che per gli sviluppatori) di gestire la funzionalità. Modellare le caratteristiche che devono essere ereditate nella nuova nuova classe. Molti attributi verranno quindi modellati sia nella classe che eredita che in quella ereditata. Tenere presente che l'ereditarietà controllata dall'utente è intesa a risparmiare del tempo all'utente, non al programmatore. Se la classe eredita sé stessa, ciò implica che tutto è ereditabile.

Decidere se l'utente ha davvero bisogno di creare dei nuovi oggetti della classe ereditata o se il sistema può fornire un numero sufficiente di oggetti dall'inizio. Impedire all'utente la creazione di nuovi oggetti da una parte diminuisce notevolmente la flessibilità dell'ereditarietà ma dall'altra renderà più facili le operazioni.

Decidere inoltre se le modifiche agli attributi numerici negli oggetti che si ereditano devono essere interpretate come relative al valore ereditato o fisse. Ad esempio, si supponga che un oggetto erediti un carattere con dimensione 12 e l'utente la cambi in 14. Per interpretazione relativa il sistema ricorderà la dimensione del carattere dell'oggetto come valore ereditato +2; vale a dire, se la dimensione del carattere dell'oggetto ereditato modifica la dimensione del carattere, anche l'oggetto ereditato modificherà la dimensione del carattere. Se si supporta l'interpretazione relativa, deve essere annotato sull'attributo dell'oggetto ereditato (perché è lì che si guarda quando si desidera esaminare l'ereditarietà). E' importante che l'interpretazione relativa venga presentata all'utente (ad es., "dimensione carattere: 12+2=14," piuttosto che semplicemente "dimensione carattere: 14"). Esaminare gli scenari per individuare delle situazioni favorevoli all'interpretazione relativa o fissa. Potrebbe essere necessario dover supportare entrambe.

Poiché l'ereditarietà controllata dall'utente è adatta solo ad utenti abbastanza esperti o molto esperti, è necessario progettarla in modo tale che non interferisca con il normale utilizzo (ad esempio, quando l'utente non usa l'ereditarietà); altrimenti gli utenti inesperti verranno intimoriti.

Tenere presente che l'ereditarietà controllata dall'utente è diretta a facilitare le attività dell'utente; non deve essere generica o pura, ma utilizzabile.

Una gerarchia di esplorazione consente all'utente (o anche al sistema) di classificare in categorie gli oggetti contenuti nelle finestre primarie o composte, che sono organizzate gerarchicamente. Le gerarchie di esplorazione fanno sì che l'utente debba effettuare la ricerca in soltanto una categoria (o poche categorie). Ciò riduce il numero di oggetti da visualizzare in un dato memento. Lo svantaggio è che l'utente (di solito) deve gestire la classificazione in categorie. Un esempio di questa tecnica sono i browser di file: il motivo dell'esistenza delle directory o delle cartelle è di aiutare l'utente a trovare i file.

Gestione della finestra

La dimensione e la posizione della finestra in genere sono controllate totalmente dall'utente. È possibile, tuttavia, considerare di ridurre un eccesso di finestre consentendo al sistema di gestire la dimensione e la posizione delle finestre.

Tanto più grande è la finestra primaria, tanti più oggetti possono essere visualizzati, ma viene anche utilizzata più area dello schermo. Una finestra primaria in genere deve mostrare il più ampio numero di oggetti possibile ma senza incorrere in un'inutile utilizzo di area dello schermo.

  • Creare ciascuna finestra primaria in modo che sia abbastanza ampia da visualizzare tutti gli oggetti, ma non più grande dello schermo. Far sì che ogni finestra primaria sia sufficientemente grande da visualizzare gli oggetti interi ma evitare le aree che non mostrano nulla di utile, come i margini di un desktop publisher. Anche se si dispone dello spazio per visualizzare queste aree vuote, potrebbero oscurare altre applicazioni.
  • Ricordare che un utente effettua la modifica delle dimensioni fra una sessione e l'altra. Se il numero di oggetti aumenta, aumentare le dimensioni della finestra in modo che siano visibili tutti gli oggetti, a meno che non sia già grande quanto lo schermo o se l'utente ha scelto una misura inferiore a quella predefinita. Se il numero di oggetti diminuisce, diminuire le dimensioni, a meno che l'utente non abbia scelto una dimensione superiore a quella predefinita. Questa regola garantisce che venga seguita l'intenzione delle operazioni di modifica delle dimensioni da parte dell'utente.

Un'ulteriore possibile limitazione sulle dimensioni di una finestra primaria si verifica se si deve utilizzare spesso l'applicazione in parallelo con altre applicazioni. In quel caso si potrebbe rendere metà schermo come dimensione massima predefinita per la finestra (invece di uno schermo intero).

Assegnare la posizione predefinita di una finestra primaria in modo tale che oscuri il meno possibile altre applicazioni. Nel caso sia necessario oscurare alcune finestre, scegliere quelle che non sono state utilizzate da più tempo e tentare di lasciare visibile almeno una piccola parte delle finestre, in modo che l'utente possa facilmente attivarle.

Uno svantaggio nell'applicare le regole appena menzionate è che una parte di controllo viene portata via all'utente (il sistema modificherà le dimensioni di una finestra senza una richiesta specifica e non ricorderà il riposizionamento dell'utente fra le sessioni). Quindi, se si applicano queste regole si deve consentire all'utente di disattivarle (tramite un controllo).

Per le finestre secondarie, la loro dimensione e posizione devono essere tali da non oscurare la finestra da cui sono state richiamate e possibilmente nemmeno le altre finestre secondarie. Se devono oscurare la finestra da cui sono state richiamate, tentare di far sì che non oscurino gli oggetti selezionati. L'oscuramento di cose vitali, come gli oggetti selezionati, è un punto debole comune dell'utilizzabilità delle finestre secondarie.

Per le finestre primarie che non sono la finestra primaria principale, è necessario applicare anche la regola di modifica dimensioni dell'ultimo paragrafo.

Le caselle di dialogo, invece, devono essere collocate in modo tale da oscurare la finestra attiva. Poiché in genere si tratta di finestre temporanee e piccole, l'utente di solito non ha bisogno di vedere la finestra attiva quando la finestra di dialogo è aperta. Il posizionamento delle caselle di dialogo sulla finestra attiva assicura l'attenzione dell'utente e diminuisce il necessario spostamento del mouse, poiché il cursore normalmente è già sulla finestra attiva.

Per le finestre di proprietà, il numero di attributi ne determina le dimensioni. Se le dimensioni sono troppo grandi (approssimativamente 1/4 dello schermo), è necessario utilizzare più schede.

Informazioni sulla sessione

Tutte le configurazioni dell'applicazione devono essere salvate fra le sessioni (senza che l'utente debba specificarlo). Devono essere salvate anche la dimensione e la posizione delle finestre, quale vista è selezionata e le posizioni delle barre di scorrimento. Quando gli utenti riavviano un'applicazione, deve essere esattamente uguale a quando è stata chiusa l'ultima volta. Il motivo di ciò è che di solito la prima cosa che gli utenti fanno quando avviano una sessione è di tornare al punto in cui si trovavano quando sono usciti dall'ultima sessione.

Guida in linea

La guida in linea è una parte molto importante del sistema. Un sistema della Guida ben progettato deve essere in grado persino di sostituire i manuali utente per la maggior parte dei sistemi. La maggior parte dei progetti impiega considerevoli risorse nella creazione e nella produzione di manuali, quando è un dato certo che molti utenti non li utilizzano mai. Questi sforzi potrebbero essere investiti invece in un buon sistema della guida.

Esistono diversi possibili tool per le guide:

  • La Guida per argomento (Help-on-subject) è il tool di guida più importante. Consente all'utente di immettere un argomento o esplorare un argomento esistente e fornisce la guida relativa a quegli argomenti. La chiave è fornire un ampio indice della guida con molti sinonimi. Ricordare: l'utente potrebbe non conoscere il termine corretto, quando ha bisogno della relativa guida.
  • La Guida per oggetto (Help-on-object) è una guida sensibile al contesto. Visualizza un testo che spiega una parte specifica (oggetto) dell'interfaccia utente. L'utente richiede la guida sensibile al contesto e seleziona la parte di interfaccia utente per la quale è necessario un aiuto. Questo tipo di guida deve essere supportata per ogni parte dell'interfaccia utente, se è utilizzabile. Un'altra alternativa è di fornire una guida implicita in finestre a comparsa (una forma condensata di guida sensibile al contesto che il sistema presenta accanto al cursore quando l'utente indugia per qualche secondo). L'utilizzo di una guida implicita in finestre a comparsa ha il vantaggio che non interferisce con la normale operazione dell'interfaccia utente.
  • L'Area messaggi è un'area (di solito nella finestra principale) in cui il sistema visualizza dei "commenti" non richiesti sulle azioni dell'utente. Se viene fornito, deve essere facoltativo.
  • Le Procedure guidate sono una tecnica piuttosto comune, da fornire quando l'utente richiede aiuto su come effettuare un'operazione. Una procedura guidata conduce l'utente attraverso un'attività (non rilevante) utilizzando la tecnica del "condurre per mano". Visualizza del testo descrittivo insieme alle operazioni (pulsanti) che consentono all'utente di portare avanti le parti di attività spiegate nel testo. In alternativa, una procedura guidata porrà delle domande e, in base alle risposte dell'utente, continuerà automaticamente l'attività. Le procedure guidate sono eccellenti per attività non superficiali e utilizzate raramente.

La necessità di una guida sensibile al contesto e delle procedure guidate viene individuata con tutta probabilità durante la verifica dell'utilizzo. Se durante la verifica di utilizzo, gli utenti non capiscono quali sono le diverse porzioni dell'interfaccia utente, è un'indicazione che la guida sensibile al contesto è necessaria. Se hanno difficoltà nell'esecuzione di determinate attività, è un'indicazione che sono necessarie le procedure guidate.

Il problema di molti sistemi di guide è che vengono scritti o per i principianti (impiegando un'enorme quantità di testo per spiegare cose ovvie) o per gli esperti (manuali di riferimento che anticipano che l'utente conosce la materia quasi quanto il programmatore che ha creato l'applicazione). Per la maggior parte dei sistemi, molti utenti sono "mediamente esperti in fase di miglioramento". Scrivere la guida in base a questo tipo di utenti.

Annulla

'Annulla' è una funzione molto utile, anche se difficile da ottenere (implementare) in generale. Consente agli utenti di imparare più velocemente, poiché non temono di danneggiare qualcosa. Riduce anche il rischio di perdere informazioni. Una soluzione alternativa per evitare di perdere informazioni è di richiedere che l'utente confermi tutte le operazioni che come risultato potrebbero avere una perdita di informazioni. Di solito si tratta di una pessima soluzione, perché aggiunge un considerevole eccesso di interazione e gli utenti imparano presto a confermare inconsciamente, rendendo quindi inadeguata questa soluzione.

Un'opzione ambiziosa è di fornire la funzione 'ripeti (redo)' e possibilmente più livelli di 'annulla (undo)' e 'ripeti (redo)'. Tuttavia il primo livello di 'annulla' da solo ottiene già la gran parte dell'utilizzabilità aumentata.

Agente di macro

Se vengono fornite delle macro, potrebbe essere molto utile impiegare un agente che controlla continuamente le azioni degli utenti, cercando le sequenze di interazione ripetute. Quando viene rilevata una sequenza d'interazione ripetuta, l'agente ne crea una macro (dopo averne chiesto l'autorizzazione all'utente). Si supponga che l'utente abbia ordinato la "sottolineatura" per due paragrafi di testo ed entrambe le volte abbia anche cambiato il colore del testo in blu subito dopo aver ordinato la "sottolineatura." L'agente chiede all'utente se desidera una macro che esegua sia la sottolineatura che l'impostazione del colore su blu per il paragrafo di testo selezionato. In caso affermativo l'agente crea la macro ed un pulsante (o una voce di menu) che la esegue.

Se l'utente seleziona un oggetto durante la registrazione, verrebbe interpretato come una specifica "delta", vale a dire che l'ggetto è stato selezionato in relazione alla selezione precedente (come "seleziona successivo", "seleziona primo child" e così via).

Non è così ovvio se interpretare come specifica delta la modifica degli attributi di un oggetto (ad esempio, interpretare la modifica di un valore di attributo da 12 a 14 come un aumento di 2, piuttosto che un'impostazione su 14). Interpretarlo come una specifica delta in genere è più efficace, poiché la modifica di un attributo in un valore fisso per più oggetti può essere spesso ottenuta selezionando più oggetti ed aprendo una relativa finestra di attributi, nella quale impostare l'attributo (su 14) una volta sola per tutti.

Evidenziazione dinamica

Spesso le associazioni fra le classi sono bidirezionali, cioè nella vera interfaccia utente l'associazione viene mostrata su entrambi gli oggetti. Se un utente, evidenziando l'oggetto A, è in grado di vedere che A è associato all'oggetto B, allora in genere è interessato anche all'inverso (cioè, quando evidenzia l'oggetto B, l'utente può vedere che B è associato ad A). L'associazione di solito viene visualizzata nelle finestre delle proprietà degli oggetti, identificando l'oggetto associato per nome.

In genere la visualizzazione delle associazioni fra gli oggetti in una finestra primaria è complicata. La visualizzazione delle associazioni sotto forma di frecce o linee spesso porta ad una "fossa dei serpenti" piuttosto appariscente e poco piacevole. Un modo corretto di visualizzare le associazioni è di evidenziare tutti gli oggetti associati quando il cursore è posizionato su un oggetto che presenta delle associazioni. Un esempio è quando le note a piè di pagina sono associate a dei caratteri in un editor di documenti e vengono evidenziate quando il cursore si posiziona sul carattere associato.