Diretriz: Interface com o Usuário (Geral)
Essa diretriz fornece as regras gerais para o desenvolvimento da janela com base na interface com o usuário
Relacionamentos
Descrição Principal

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.