Conceitos Básicos de Janela: Configurando o Contexto
Esta seção oferece uma visão geral da anatomia de uma interface do usuário baseada em janelas. Essa visão geral é
necessária para compreender o restante destas diretrizes.
Uma interface do usuário baseada em janelas divide-se em janelas. As janelas podem ser movidas por toda a tela,
empilhadas umas sobre as outras e transformadas em ícones. Um sistema geralmente apresenta uma janela principal e
várias janelas secundárias. A janela principal trata da interação principal com o usuário e costuma conter um número
arbitrário de objetos. As janelas secundárias são usadas para suportar as interações com as janelas principais,
fornecendo detalhes sobre seus objetos e as operações neles realizadas.
Janelas Principais
A janela principal geralmente contém um número arbitrário de objetos com os quais o usuário interage. Normalmente, o
usuário interage com o sistema selecionando primeiro um ou vários objetos, por exemplo clicando neles, e escolhendo uma
operação (por exemplo, utilizando um menu) que é executada em todos os objetos selecionados. As operações comuns são
Recortar, Copiar, Colar, Excluir e Visualizar Propriedades.
A janela principal geralmente contém uma barra de menu, na qual os usuários podem escolher as operações. Os usuários
também podem escolher operações através de menus pop-up (clicando com o botão direito do mouse sobre o próprio objeto)
e por manipulação direta (clicando e arrastando o objeto). Como o total de objetos pode não caber na janela principal,
geralmente os usuários podem rolar pelos objetos usando uma barra de rolagem ou redimensionar a janela. Além disso, a
janela principal pode ser dividida em painéis (definindo subáreas da janela), que também podem ser redimensionados pelo
usuário.
Composições
Um objeto composto em uma interface de usuário é aquele que é visualmente composto por outros objetos. Por exemplo, um
parágrafo é um conjunto de caracteres ou um objeto de desenho complexo é um conjunto de objetos
de desenho mais primitivos.
Janelas Secundárias
As janelas secundárias suportam as janelas principais fornecendo detalhes (como propriedades, por exemplo) sobre seus
objetos e as operações neles realizadas. Somente algumas propriedades dos objetos aparecem normalmente na janela
principal. As propriedades de um objeto são exibidas quando uma janela de propriedades é aberta (janela secundária),
mostrando todos os atributos de um objeto. Em geral, o usuário pode alterar os atributos através de controles, como os
botões de alternância e de opções, as escalas, as caixas de combinação e os campos de texto.
Observe que há uma linha fina - e às vezes bem artificial - entre as janelas principais e as secundárias. Elas podem
exibir os mesmos níveis de complexidade. Entretanto, existem duas diferenças principais entre as janelas principais e
secundárias:
-
As janelas principais geralmente são consideradas mais importantes para o aplicativo, já que precisam fornecer
usabilidade extensiva. Por isso, os esforços de desenvolvimento tendem a ser mais concentrados nas janelas
principais.
-
As janelas secundárias costumam ser exibidas através da navegação em janelas principais, e não vice-versa.
Além das janelas de propriedades, existem outros tipos de janelas secundárias, como as caixas de diálogo, as caixas de
mensagem, as paletas e as janelas pop-up.
Muitos aplicativos se baseiam em arquivos. Os usuários podem iniciar esses aplicativos com a operação Abrir em
um objeto de arquivo (por exemplo, clicando duas vezes no ícone de um arquivo em uma pasta). A janela principal desses
aplicativos mostra os objetos armazenados nesse arquivo. Operações comuns em arquivos são Salvar, Salvar
como, Abrir e Novo, que geralmente podem ser selecionadas por meio de um menu de arquivo na janela
principal. Além disso, a janela principal pode exibir vários arquivos (também chamada de Interface de Documentos
Múltiplos ou MDI), permitindo que o usuário alterne entre diferentes arquivos.
Dimensões Visuais
O segredo para obter janelas principais com usabilidade é utilizar as dimensões visuais quando visualizar os objetos
contidos e seus atributos. Eis algumas das vantagens de apresentar mais atributos do que os necessários para
identificação:
-
O usuário evita a sobrecarga na navegação de janelas, já que diminui o número de janelas a serem exibidas (quando o
usuário precisa ver um atributo que é apresentado na janela principal).
-
O usuário pode ver os aspectos distintos (de diferentes objetos) ao mesmo tempo, que são geralmente úteis para
comparações e para começar a reconhecer padrões. Um bom uso das dimensões visuais pode estimular os usuários a
desenvolver um senso totalmente novo e aguçado em seu trabalho.
As dimensões visuais são:
Essas dimensões são apresentadas a seguir. Entretanto, tenha cuidado com a área de tela disponível quando estiver
projetando a visualização dos objetos. Tente diminuir ao máximo a sobrecarga ao explorar a área da tela e avalie se o
uso de várias dimensões visuais justifica o consumo extra da área da tela. É provável que o usuário já fique bastante
satisfeito apenas com uma lista de nomes, pois o que ele realmente precisa é ver o maior número de objetos possível.
Observe que é importante usar essas dimensões visuais (ou estendê-las) para conseguir identificar os objetos de forma
exclusiva. Incluímos também a seguir uma discussão sobre esse assunto (consulte a seção "Identificação" a seguir).
Observe também que as dimensões visuais podem ser utilizadas em conjunto com a dimensão de tempo, por exemplo, movendo
objetos (sua posição é alterada ao longo do tempo) ou alterando a forma ou a cor de objetos (seu estado é alterado ao
longo do tempo). Esse último caso é abordado na seção "Forma" a seguir.
Posição
Os aspectos mais intuitivos que a posição pode apresentar são as posições do mundo real. Como exemplos, podemos citar:
-
GIS (Geographical Information Systems), que exibe um mapa no qual é possível apresentar objetos nas mesmas
longitude e latitude do mundo real.
-
Programas CAD (Computer Aided Design), que apresentam os objetos e seu ambiente exatamente de acordo com as
coordenadas do mundo real.
-
Editores WYSIWYG (What You See Is What You Get, O Que Se Vê É o Que Será Impresso), que exibem os objetos
(caracteres) no mesmo local da janela em que aparecerão em uma cópia impressa.
Às vezes, é relevante mostrar o tamanho real (exemplos de programa CAD e de editor WYSIWYG); outras vezes, isso não é
tão relevante assim; por exemplo, quando o tamanho dos objetos é muito menor que a distância entre os objetos.
Por exemplo, imagine que nós temos um sistema de cadastro de vôos em que o usuário deve inserir os destinos. Uma
possível apresentação disso seria exibir um mapa contendo os diferentes aeroportos (onde um aeroporto seria um objeto).
Naturalmente, como os tamanhos reais dos aeroportos são irrelevantes (muito pequenos para serem vistos), todos os
aeroportos são mostrados como ícones do mesmo tamanho.
Esse exemplo também ilustra que as posições do mundo real podem ser usadas mesmo que elas não sejam relevantes,
contanto que ajudem o usuário a identificar os objetos. No exemplo, o usuário não precisa saber a localização de um
aeroporto. Porém, se ele estiver familiarizado com geografia, pode ser mais fácil para ele localizar os destinos em um
mapa do que em uma lista.
Você também pode utilizar a posição para representar posições "virtuais" do mundo real. Por exemplo, imagine um sistema
de compras à distância, onde os usuários podem comprar itens de diferentes lojas. Uma possível apresentação disso seria
exibir um diagrama esquemático de uma alameda (virtual) com as diferentes lojas em suas devidas posições (onde uma loja
seria um objeto). Esse diagrama esquemático nada tem a ver com os locais reais dessas lojas. Ele apenas explora a
memória espacial do usuário, já que é mais fácil memorizar uma posição x-y do que um item em uma lista ou hierarquia.
Um outro uso alternativo para posição é mostrar associações entre objetos: todos os objetos que possuem a mesma posição
vertical são associados de uma maneira, enquanto todos os objetos que possuem a mesma posição horizontal são associados
de outra maneira. As planilhas são um exemplo disso.
Uma alternativa semelhante é permitir que um eixo represente o intervalo de valores de algum atributo. Por exemplo, em
um sistema de cadastro de viagens, os vôos cadastrados (onde um vôo seria um objeto) poderiam ser apresentados ao longo
de um eixo de tempo horizontal, mostrando sua relação no tempo, sua duração e o período de tempo em que o usuário
ficaria em cada destino. Essas são informações que o usuário não precisa saber, mas que ele verá com prazer se elas
forem apresentadas oportunamente.
Se você não quiser usar tanta área da tela para apresentar todo o intervalo de valores, poderá reduzir as distâncias
entre os objetos. No exemplo do cadastro de viagens, isso significaria que todos os vôos cadastrados seriam
apresentados horizontalmente e sem espaço entre eles, mas o primeiro vôo ficaria à esquerda, o segundo ficaria
imediatamente à direita do primeiro, e assim por diante. Os usuários não veriam o período de tempo em que poderiam
ficar em cada destino, mas poderiam ver a duração dos vôos.
Tamanho
Em muitos casos, "tamanho" deve representar o mesmo que posição. Em um sistema CAD, por exemplo, o tamanho deve
representar naturalmente a extensão do mundo real. Às vezes, porém, ficamos à vontade para escolher que tamanho deveria
representar os aeroportos, por exemplo, no mapa que permite a seleção de destinos.
Nesses casos, o tamanho deve representar o que é mais intuitivamente percebido como o tamanho real do objeto. No caso
de um arquivo, o tamanho do objeto deve representar a quantidade de espaço em disco ocupado. No caso de uma conta
bancária, o tamanho do objeto deve representar o saldo. Na maioria dos tamanhos, uma escala logarítmica é melhor do que
uma escala proporcional, já que uma escala proporcional geralmente ocupa uma grande parte da área da tela.
O tamanho é, na verdade, tão intuitivo que você pode pensar em mostrá-lo mesmo que isso não seja relevante. Afinal de
contas, no mundo real, objetos diferentes ocupam proporções diferentes de nosso campo visual devido aos seus diferentes
tamanhos. Isso não é inconveniente; apenas nos ajuda a distinguir os vários objetos. Da mesma forma, o uso de
diferentes tamanhos na interface do usuário ajudará os usuários a fazer a distinção entre os vários objetos.
Normalmente, o tamanho deve ser usado para apresentar somente um único atributo, mesmo que fosse possível permitir que
a extensão horizontal apresentasse um atributo e a extensão vertical apresentasse outro (o que acabaria sendo não
intuitivo e poderia confundir o usuário).
A extensão horizontal ou vertical deve ser (logaritmicamente) proporcional ao atributo que o tamanho ilustrará. A outra
extensão deve ser fixa (ou depender do tamanho do nome, por exemplo). Se as extensões horizontal e vertical forem
proporcionais ao mesmo atributo, elas raramente incluirão algum valor: isso parece importuno e apenas consome mais área
de tela.
Forma
As formas são normalmente representadas por ícones em uma interface gráfica do usuário. Ela é melhor usada para
representar o tipo, pois é mais intuitivo mapear uma diferença na aparência do que no tipo. No mundo real, objetos
diferentes do mesmo tipo geralmente têm a mesma aparência, ao passo que objetos de tipos diferentes apresentam
diferença na aparência. Por exemplo, várias cadeiras diferentes possuem uma aparência semelhante (todas elas têm quatro
pernas, um assento e um encosto), enquanto um carro é bastante diferente de uma cadeira.
Portanto, quais são os critérios para os casos em que objetos diferentes apresentam tipos diferentes? Para começar,
classes diferentes devem certamente ser consideradas como tipos diferentes. Além disso, alguns atributos são "tipos
equivalentes". Esses atributos devem ter um conjunto limitado de possíveis valores e seu valor normalmente determina o
que pode ser feito com o objeto (em termos de operações e possíveis valores de outros atributos). Isso é o mesmo que
acontece no mundo real. A diferença mais importante entre uma cadeira e um carro é o modo como eles são utilizados: uma
cadeira é utilizada para descansar e um carro é utilizado para transportar.
No entanto, quando você analisar o que deve ser considerado como tipos diferentes, lembre-se de que o mais importante
é: qual atributo apresenta uma probabilidade maior de ser conhecido pelo usuário como um tipo.
Se você não tiver classes múltiplas ou nenhum atributo de "tipo equivalente", poderá utilizar ícones para representar
os diferentes valores de algum outro atributo de valor limitado, mas somente se esse atributo for muito interessante
para o usuário.
Os ícones também costumam ser usados para mostrar diferentes estados do objeto (além de mostrar o tipo). Quando você
seleciona um objeto, ele geralmente é exibido de duas maneiras: a cor é alterada para preto ou ele aparece com um
retângulo em torno dele. Outro possível estado é que uma janela de propriedades tenha sido aberta para o objeto.
Normalmente, também há outros estados específicos de aplicativo que podem ser exibidos, como, por exemplo, se uma
mensagem eletrônica foi lida ou não. Apenas certifique-se de que a apresentação do estado não está dificultando a
identificação do tipo por parte do usuário e vice-versa.
Cor
A cor pode ser dividida em três componentes, tendo como base a percepção visual. Eles são: matiz (ou seja, vermelho,
azul, marro e assim por diante), saturação e intensidade. No entanto, não use componentes diferentes para representar
diferentes atributos, pois isso dificultará a percepção por parte do usuário.
O matiz pode ser usado para representar tipos ou atributos com um conjunto limitado de possíveis valores. Entretanto, é
melhor usar um ícone nesse caso, pois o ícone pode ser projetado para que o usuário compreenda qual valor ele
representa, embora não haja nenhum mapeamento intuitivo como esse entre conteúdo de cores e (a maioria dos tipos de)
valores. Sendo assim, caso nenhum ícone intuitivo seja encontrado, o matiz pode ser usado no lugar dos ícones. Se você
tiver muitos ícones de tipo, outra alternativa é utilizar o matiz para categorizar esses ícones (de forma que alguns
ícones com significado semelhante apareçam em vermelho, alguns com outro significado apareçam em azul e assim por
diante).
A saturação pode ser usada para representar um atributo com um intervalo de valores, mas isso resultará em uma
interface de usuário não-amigável e inoportuna. O uso de uma saturação diferente confundirá a visão e o uso de uma
saturação alta é ainda mais inconveniente.
A intensidade é o componente de cor mais usável. Esse componente pode ser usado para representar um atributo com um
intervalo de valores e é tão oportuno que pode ser usado também para atributos de importância secundária. Para que a
intensidade seja conveniente, você não deve partir da intensidade zero (branco) para a intensidade completa (preto),
mas apenas da intensidade baixa (cinza claro) para a intensidade alta (cinza escuro). Nos sistemas em que os usuários
criam a maioria dos objetos, é muito útil apresentar os objetos de acordo com a validade; por exemplo, o período de
tempo desde a última alteração). Isso ajuda os usuários a identificar o objeto com o qual desejam trabalhar (que
geralmente é o objeto que apresenta o menor "tempo desde a última alteração"). Portanto, se você não tiver um atributo
de intervalo de valores que realmente precise ser apresentado ao usuário, apresente o atributo validade.
Geralmente, a cor é usada para tornar os ícones esteticamente mais atrativos. Isso ajuda o usuário a fazer rapidamente
a distinção entre os ícones. Se você fornecer ícones com várias cores, provavelmente não usará a cor para outras
finalidades.
Como algumas pessoas não conseguem identificar as cores e nem todas as telas as aceitam, não use a cor como único meio
de mostrar informações essenciais. Por outro lado, o uso bem planejado e oportuno das cores torna a interface
esteticamente mais atrativa.
Identificação
O usuário deve ser capaz de identificar cada objeto de forma exclusiva. Às vezes, as outras dimensões visuais são
suficientes para a identificação, mas nem sempre. Exibir um nome dentro do ícone ou próximo a ele é a técnica mais
popular de suporte à identificação. A vantagem dos nomes é que uma área muito pequena da tela pode exibir um grande
número de nomes diferentes.
É melhor se um nome puder ser gerado a partir de um valor de atributo (que normalmente é textual). A alternativa é
deixar que os usuários especifiquem os nomes ao criarem os objetos. Porém, isso leva tempo e, portanto, reduz a
usabilidade.
Às vezes, você pode modelar o ícone para que o nome possa ser inserido dentro dele. Isso economiza área da tela e
fornece uma indicação mais forte do relacionamento entre o ícone e o nome. No entanto, isso pode gerar os seguintes
problemas:
-
O ícone precisa estar vazio no meio (no local onde o nome aparece).
-
Os nomes possuem comprimentos variáveis, o que significa que a extensão horizontal do ícone dependerá do
comprimento do nome ou que alguns nomes aparecerão truncados.
-
A largura do ícone deve ser muito maior que a altura, já que todo texto de tamanho razoável é muito mais longo que
largo.
Conseqüentemente, é mais comum que o nome seja exibido abaixo ou à direita do ícone. A vantagem é que isso ocupa menos
área na tela, mas a desvantagem é que o objeto (ícone + nome) se torna mais largo do que alto. Se você não tiver espaço
suficiente para exibir o nome por completo (o que pode acontecer, pois você geralmente identifica um ícone sem
nomeá-lo), poderá exibi-lo através de janelas pop-up que só aparecerão quando o cursor estiver acima do ícone.
A fonte do nome pode ser utilizada para exibir um atributo de escolha limitada, caso você possa localizar um mapeamento
intuitivo entre os valores de fonte e de atributo; por exemplo, é possível utilizar negrito ou itálico para distinguir
o objeto ou enfatizar sua importância). Na maioria dos casos, porém, não é apropriado usar a fonte, pois isso é
inoportuno e raramente intuitivo.
Se você mostrar o nome (ou qualquer outro texto que o usuário tenha permissão para alterar), ofereça suporte à edição
do nome diretamente na janela principal. A alternativa seria o usuário solicitar uma operação de renomeação e inserir o
novo nome, ou abrir a janela de propriedades e editar nela o nome. Editar o nome diretamente na janela principal não só
é mais rápido, como também suporta o princípio "o local onde você o vê é onde você o altera".
Localizar e Selecionar Ativados
Se o grupo de objetos que deve ser alterado ou operado for composto de modo que o usuário possa expressar critérios de
seleção identificando-os, a ferramenta de procura da janela principal poderá resolver o problema selecionando sempre
todas as correspondências de critério.
Existem duas maneiras possíveis de gerenciar a pesquisa:
-
Todos os objetos aos quais os critérios de pesquisa se aplicam são selecionados na janela principal. Se você não
puder garantir que todos os objetos localizados serão mostrados simultaneamente na janela principal (porque eles
podem estar muito distantes), poderá exibir uma lista de acertos na janela de pesquisa. Após uma pesquisa, o
usuário especifica critérios de pesquisa adicionais ou executa uma operação nos objetos selecionados. A vantagem
dessa abordagem é que ela permite que o usuário solicite uma determinada operação em todos os objetos, de acordo
com os critérios de pesquisa.
-
Você fornece um botão Procurar na janela de procura que seleciona o próximo objeto de acordo com os
critérios de procura e rola o conteúdo da janela principal para que esse objeto fique visível. Após uma pesquisa, o
usuário pode executar uma operação no objeto selecionado e, em seguida, continuar a pesquisa seqüencialmente pelos
objetos de acordo com os critérios de pesquisa. A vantagem dessa abordagem é que o usuário pode ver cada objeto
localizado que esteja próximo a ele (na janela principal, e não em uma lista de acertos separada).
Em muitos casos, você precisará combinar os dois casos, por exemplo, incluindo um botão Selecionar Tudo na
janela de procura seqüencial ou um botão Visualizar Próximo na janela de procura paralela.
Classificação
Um exemplo de classificação pode ser o modo como o sistema organiza todos os objetos: verticalmente, em ordem
alfabética por nome ou de acordo com o valor de um atributo. Em seguida, o usuário procura os objetos através da
rolagem. Esse é o suporte mais simples à navegação, no que diz respeito à implementação e à operação do usuário. A
classificação funciona melhor quando o usuário sabe o nome do objeto (ou o atributo que classificamos de acordo com
esse objeto). Um exemplo de um sistema que deve ser implementado dessa maneira é um catálogo telefônico. Em geral, a
janela principal deve ter uma operação para alterar a ordem de classificação e/ou os critérios.
Herança Controlada pelo Usuário
Um exemplo de herança controlada por usuário são os editores WYSIWYG, nos quais você define a qual "estilo" pertence
cada parágrafo e como esse estilo (ou seja, cada caractere pertencente a esse estilo) deve ser apresentado.
Uma desvantagem, se compararmos a uma ferramenta de pesquisa, é que a herança controlada por usuário suporta apenas a
mudança de atributos (e, provavelmente, associações) para objetos múltiplos, mas não a execução de operações. Além
disso, a herança controlada por usuário gera uma sobrecarga, pois o usuário deve definir e manter explicitamente os
grupos (ou seja, os estilos disponíveis). Ela é também um conceito mais complicado.
No entanto, se os critérios de pesquisa não puderem ser especificados para os objetos ou se o usuário precisar fazer
mudanças relativas nos valores de atributo (como duplicar esse valor, por exemplo), a herança controlada por usuário
pode ser uma solução.
Para que a herança controlada por usuário seja útil, a natureza da classe deve permitir que os objetos sejam
categorizados em grupos (com o mesmo significado lógico para o usuário) nos quais a maioria dos valores de atributo
seja idêntica.
Uma vantagem, se compararmos com uma ferramenta de procura, é que a herança controlada por usuário suporta a
substituição; por exemplo, alterar o valor de atributo, mas somente se ele não tiver sido explicitamente definido no
objeto. Além disso, a herança controlada por usuário pode permitir que o usuário crie definições de valor de atributo
mais genéricas (e, portanto, sofisticadas); por exemplo, herdar a fonte desse estilo, mas aumentá-la em dois pixels. A
herança controlada por usuário é particularmente útil quando os grupos não possuem critérios de pesquisa de fácil
especificação.
A classe para a qual você suportará a herança controlada por usuário pode herdar a si própria, ou você pode criar uma
nova classe cuja finalidade seja ser herdada. Fazer com que a classe herde a si própria é um pouco mais eficaz, pois o
mesmo objeto pode ser utilizado tanto para herdar como para fazer o que foi originalmente planejado para o objeto, como
ser uma fatura, ser uma conta, etc. Isso resulta em menos classes para serem gerenciadas pelo (e pelo sistema). Por
outro lado, a criação de uma nova classe da qual herdar tem a vantagem de ser mais fácil de compreender, pois a herança
é claramente separada da operação normal da classe. A criação de uma nova classe é a melhor solução na maioria dos
casos, especialmente se os usuários não tiverem muita experiência com computadores e modelos orientados a objetos. A
nova classe criada deve herdar preferencialmente a si própria, a fim de suportar os vários níveis de herança.
Na maioria dos sistemas, como o usuário não sabe com antecedência exatamente como os grupos de herança devem ser
estruturados, é comum que ele tenha de alterar o grupo de herança de determinados objetos. Crie uma operação para isso.
Se você decidir suportar a herança controlada por usuário no sistema, analise quais elementos (atributos, associações,
classe) precisam ser herdados e suporte a herança somente para esses elementos. Isso resultará em uma forma mais fácil,
embora menos genérica de gerenciar a funcionalidade, tanto para usuários como para desenvolvedores. Modele os elementos
que devem ser herdados em sua nova classe. Muitos atributos serão modelados tanto na classe herdante como na classe
herdada. Lembre-se de que a herança controlada por usuário tem como objetivo economizar o tempo do usuário, e não o
seu. Se a classe herdar a si própria, isso quer dizer que tudo será herdável.
Decida se o usuário realmente precisa criar novos objetos da classe herdada ou se o sistema pode fornecer um número
suficiente de objetos. Proibir o usuário de criar novos objetos diminuirá significativamente a flexibilidade da
herança, mas, por outro lado, facilitará sua operação.
Além disso, decida se as mudanças em atributos numéricos nos objetos herdantes devem ser interpretadas como referentes
ao valor herdado ou como fixas. Supomos, por exemplo, que um objeto herde o tamanho de fonte 12 e o usuário o altere
para 14. Por interpretação relativa, o sistema memorizará o tamanho da fonte do objeto como valor herdado +2; ou seja,
se o tamanho da fonte do objeto herdado for alterado, o tamanho da fonte do objeto herdante também será alterado. Se
você suportar interpretação relativa, isso deve ser anotado no atributo do objeto herdado (pois esse é o local que você
consultará quando quiser examinar a herança). É importante que a interpretação relativa seja apresentada ao usuário
(por exemplo, "tamanho da fonte: 12+2=14", em vez de apenas "tamanho da fonte: 14"). Você pode explorar os cenários
para localizar situações em favor da interpretação relativa ou fixa. Talvez você precise suportar as duas.
Como a herança controlada por usuário destina-se apenas a usuários intermediários e avançados, você deve projetá-la de
modo que não interfira no uso normal (por exemplo, quando o usuário não utilizar a herança). Caso contrário, os
usuários inexperientes ficarão intimidados.
Lembre-se de que a herança controlada por usuário que você constrói tem como objetivo facilitar a vida do usuário. Ela
não tem de ser genérica ou absoluta, mas sim usável.
Uma hierarquia de navegação permite que o usuário (ou, possivelmente, o sistema) categorize os objetos em janelas
principais ou composições, que são organizadas hierarquicamente. As hierarquias de navegação asseguram que o usuário só
tenha de pesquisar uma ou algumas categorias. Isso reduz o número de objetos a serem exibidos em um determinado
momento. Uma desvantagem é que o usuário (geralmente) tem de gerenciar a categorização. Como exemplo dessa técnica,
podemos citar os navegadores de arquivos: o motivo para a existência de diretórios ou pastas é ajudar o usuário a
localizar arquivos.
Gerenciamento de Janela
O tamanho e a posição da janela geralmente são totalmente controlados pelo usuário. Entretanto, você pode reduzir a
sobrecarga do uso de janelas ao permitir que o sistema influencie no tamanho e na posição das janelas.
Quanto maior for uma janela principal, mais os objetos poderão ser mostrados; em compensação, maior quantidade da área
da tela será ocupada. Normalmente, uma janela principal deve mostrar o maior número de objetos possível, mas sem
utilizar a área da tela desnecessariamente.
-
Aumente cada janela principal o suficiente para que todos os objetos possam ser mostrados, mas não permita que seu
tamanho ultrapasse o da tela. Aumente cada janela principal o suficiente para exibir os objetos por inteiro, mas
evite áreas que não mostrem nada de útil, como as margens em uma editoração eletrônica. Mesmo que você tenha espaço
para exibir essas áreas vazias, elas podem ocultar outros aplicativos.
-
Lembre-se de que um usuário redimensiona entre sessões. Se o número de objetos aumentar, aumente o tamanho da
janela para que todos os objetos fiquem visíveis, a menos que sua altura já ocupe toda a tela ou o usuário tenha
escolhido um tamanho menor que o padrão. Se o número de objetos diminuir, diminua também o tamanho, a menos que o
usuário tenha escolhido um tamanho maior que o padrão. Essa regra garante que você seguirá o conceito das operações
de redimensionamento do usuário.
Uma possível limitação em relação ao tamanho de uma janela principal surgirá se você precisar utilizar o aplicativo em
paralelo com outros. Nesse caso, maximize o tamanho padrão da janela para metade da tela (em oposição à tela cheia).
Defina a posição padrão de uma janela principal de modo que ela oculte os outros aplicativos o mínimo possível. Se você
tiver de ocultar algumas janelas, escolha as que não são utilizadas há mais tempo e tente deixar pelo menos uma pequena
parte da janela visível para que o usuário possa ativá-la com facilidade.
Uma desvantagem na aplicação das regras acima é que isso irá tirar parte do controle do usuário (o sistema
redimensionará uma janela sem ser solicitado a fazê-lo e não memorizará o reposicionamento do usuário entre as
sessões). Portanto, se você aplicar essas regras, deve permitir que o usuário as desative (através de um controle).
O tamanho e a posição das janelas secundárias devem ser definidos de forma a não ocultar sua janela principal, nem
outras janelas secundárias. Se for inevitável que elas ocultem a janela principal correspondente, assegure-se de que os
objetos selecionados ficarão visíveis. Ocultar elementos essenciais, como os objetos selecionados, é uma falha comum de
usabilidade em janelas secundárias.
No caso das janelas principais que não sejam as principais, aplique a regra de dimensionamento do último parágrafo.
As caixas de diálogo, no entanto, devem ser dispostas de forma a ocultar a janela ativa. Como elas costumam ser
temporárias e pequenas, o usuário normalmente não precisa ver a janela ativa enquanto a caixa de diálogo está aberta.
Colocar as caixas de diálogo sobre a janela ativa garante que o usuário as reconhece e diminui a necessidade de
movimentação do mouse, visto que normalmente o cursor já está sobre a janela ativa.
No caso das janelas de propriedades, o número de atributos determina o tamanho. Se o tamanho for grande demais
(aproximadamente 1/4 da tela), use mais tabulações.
Informações da Sessão
Todas as configurações de aplicativo devem ser salvas entre as sessões (o usuário não precisa especificá-las). O
tamanho e a posição das janelas, a visão que está selecionada e a posição das barras de rolagem também são
configurações que devem ser salvas. Quando os usuários reiniciam um aplicativo, ele deve apresentar a aparência exata
que tinha quando foi fechado pela última vez. O motivo disso é que, geralmente, ao iniciarem uma sessão, a primeira
ação dos usuários é retornar ao ponto em que estavam quando encerraram a sessão pela última vez.
Ajuda
On-line
A ajuda on-line é uma parte muito importante do sistema. Um sistema de ajuda bem projetado deve ser capaz, até mesmo,
de substituir os manuais do usuário na maioria dos sistemas. A maioria dos projetos despende esforços consideráveis na
elaboração e produção de manuais, quando é de conhecimento de todos que a maioria dos usuários nunca os utiliza. Em vez
disso, é recomendável que esses esforços sejam direcionados para produzir um bom sistema de ajuda.
Existe uma série de possíveis ferramentas de ajuda que você deve levar em consideração:
-
Ajuda por assunto é a ferramenta de ajuda mais importante. Ela permite que o usuário digite um assunto ou
procure um assunto existente e fornece ajuda sobre eles. A solução é criar um índice de ajuda grande, com uma boa
quantidade de sinônimos. Lembre-se: o usuário pode não saber o termo correto quando precisar de ajuda.
-
Ajuda por objeto é a ajuda sensível ao contexto. Ela exibe um texto que explica uma parte (objeto)
específica da interface do usuário. O usuário solicita a ajuda contextual e, em seguida, seleciona a parte da
interface do usuário sobre a qual precisa de ajuda. Este tipo de ajuda deve ser suportado em todas as partes da
interface do usuário, caso isso seja utilizável. Uma outra alternativa é fornecer ajuda implícita em janelas
pop-up, uma forma condensada de ajuda contextual que o sistema apresenta adjacente ao cursor quando o usuário se
detém sobre ele por alguns segundos. A vantagem da ajuda implícita em janelas pop-up é que ela não interfere na
operação normal da interface do usuário.
-
Área de mensagem é uma área (geralmente na janela principal) em que o sistema imprime "comentários" não
solicitados sobre as ações do usuário. Ela deve ser opcional, se fornecida.
-
Assistentes são uma técnica popular que você deve pensar em fornecer quando o usuário solicitar ajuda sobre
como fazer algo. Um assistente conduz o usuário por uma tarefa (não-trivial) utilizando uma técnica "controlada
manualmente". Ele mostra texto descritivo juntamente com operações (botões) que permitem ao usuário realizar as
partes da tarefa explicadas no texto. Outra alternativa utilizada pelo assistente é fazer perguntas e, com base nas
respostas do usuário, realizar automaticamente a tarefa. Os assistentes são excelentes para tarefas não-triviais e
pouco utilizadas.
A necessidade de ajuda contextual e de assistentes provavelmente é identificada durante o teste de uso. Se, durante
esse teste, os usuários não compreenderem as diferentes partes da interface do usuário, é sinal de que há necessidade
de ajuda contextual. Se eles tiverem dificuldades para executar uma determinada tarefa, é sinal de que há necessidade
de assistentes.
O problema de muitos sistemas de ajuda é que eles são escritos para usuários inexperientes (gastando um tempo enorme
para explicar o óbvio) ou para especialistas (manuais de referência que partem do pressuposto que o usuário sabe quase
o mesmo que o programador que desenvolveu o aplicativo). Na maioria dos sistemas, a maioria dos usuário está em um
"nível intermediário". Grave o texto da ajuda para eles.
Desfazer
Este recurso é muito útil, embora geralmente seja difícil implementá-lo. Ele permite que os usuários aprendam mais
rápido, pois não ficam com receio de destruir o trabalho. Este recurso também reduz o risco de perda de informações.
Outra solução para evitar a perda de informações é exigir que o usuário confirme todas as operações que podem resultar
em perda. Essa solução, porém, não costuma ser muito satisfatória, pois gera uma sobrecarga de interação considerável e
os usuários logo se acostumam a realizar a confirmação mecanicamente, tornando-a inadequada.
Uma opção ambiciosa é fornecer também o recurso refazer e possivelmente vários níveis de desfazer e refazer. No
entanto, o primeiro nível de desfazer é o recurso de maior usabilidade.
Agente de
Macro
Se você fornecer macros, pode ser bastante útil utilizar um agente que monitore continuamente as ações do usuário em
busca de seqüências repetitivas de interação. Assim que uma seqüência repetitiva de interação é encontrada, o agente
cria uma macro para ela (depois de solicitar a permissão do usuário). Digamos que o usuário tenha solicitado o recurso
"Sublinhado" em dois parágrafos de texto e, nessas duas vezes, ele também tenha alterado a cor do texto para azul
imediatamente depois de solicitar "sublinhado". Em seguida, o agente deve perguntar ao usuário se ele deseja uma macro
que faça o "Sublinhado" e a "Definição de cor para azul" para o parágrafo de texto selecionado. Em caso afirmativo, o
agente criaria essa macro e um botão (ou item de menu) que executasse a macro.
Se o usuário selecionar um objeto durante o registro, isso normalmente deve ser interpretado como uma especificação
"delta", ou seja, qual objeto foi selecionado em relação à seleção anterior (como "selecionar próximo", "selecionar
primeiro filho" e outros).
Se você deve ou não interpretar a mudança dos atributos de um objeto como uma especificação delta (por exemplo,
interpretando a mudança de um valor de atributo de 12 para 14 como um aumento de 2, em vez de uma definição como 14)
não é uma decisão assim tão óbvia. Interpretá-la como uma especificação delta geralmente é mais eficaz, pois a mudança
de um atributo para um valor fixo em vários objetos pode ser realizada através da seleção de vários objetos e da
abertura de uma janela de atributo para eles, na qual você poderá definir o atributo (como 14) de uma vez por todas.
Realce Dinâmico
As associações entre as classes são quase sempre bidirecionais, o que significa que, na interface real do usuário, a
associação é mostrada nos dois objetos. Se um usuário, com foco no objeto A, puder ver que A está
associado ao objeto B, o inverso também será interessante para o usuário (ou seja, ao se concentrar no objeto
B, o usuário pode ver que B está associado a A). A associação normalmente é mostrada nas janelas
de propriedades dos objetos, identificando o objeto associado pelo nome.
Em geral, é complicado visualizar as associações entre objetos em uma janela principal. Visualizar as associações como
setas ou linhas geralmente leva a um "ninho de serpentes" inapelável e importuno. Uma maneira agradável de visualizar
as associações é realçar todos os objetos associados quando o cursor estiver sobre um objeto da associação. Um exemplo
disso é quando as notas de rodapé são associadas aos caracteres em um editor de documentos e, conseqüentemente, são
realçadas quando o cursor está sobre o caractere associado.
|