Escolar Documentos
Profissional Documentos
Cultura Documentos
Facilidade de uso
Splash Screen
Backup
Sem dvidas, este item indispensvel! Manter cpias do banco de dados garante maior
confiabilidade no sistema quando for necessrio recuperar informaes. Porm, de nada adianta criar
backups no prprio computador do cliente quando existir a possibilidade do disco rgido local ser
danificado. Neste caso, o banco de dados e todos os seus backups sero perdidos, ao menos que exista
uma cpia em outro computador. Portanto, procure disponibilizar no sistema a opo para criar
backups em locais remotos, como discos externos ou em outro computador na rede local. Outra opo
bastante segura salvar o backup em um diretrio virtual na internet, popularmente conhecido como
nuvem. Mesmo que acontea uma falha geral na rede e nos dispositivos mveis do cliente, o backup
estar armazenado na internet e poder ser recuperado atravs de um simples download.
Embora este recurso esteja disponvel, provvel que o usurio esquea de salvar backups do
banco de dados periodicamente. A soluo criar caixas de dilogo para avis-lo do backup ou realizar a
cpia silenciosamente, sem a interveno do usurio. Um bom exemplo disso configurar o sistema
para salvar o backup todas as vezes que o sistema for finalizado ao final do dia.
Visual da aplicao
Este item no obrigatrio, mas com certeza um diferencial importante em uma aplicao. Um
visual agradvel, com letras ntidas e cores leves gera comodidade para o usurio. A aplicao fica ainda
mais rica quando dispe de opes para personalizao do visual, como aplicao de cores e temas.
Atualmente comum encontrar componentes na web com a finalidade de aperfeioar o visual de uma
aplicao. Por exemplo, a interface Ribbon, presente nas verses 2007 e 2010 do pacote Microsoft
Office, uma das opes para modernizar a tela principal do sistema. O Ribbon pode ser utilizado no
Visual Studio com o componente Elegant UI ou no Delphi com o pacote TMS Component Pack.
Procure tambm utilizar imagens bem definidas em menus e botes, de preferncia no formato
PNG. Na internet h dezenas de sites com pacotes de cones e imagens para serem utilizadas em
aplicaes desktop e pginas web, como o Icon Archive. Utilize imagens sugestivas de acordo com a
funo e procure padroniz-las nas telas em comum. Por exemplo, atribua a mesma imagem para os
botes de relatrios e a mesma imagem para os botes de Salvar, Alterar e Excluir, respectivamente.
Essa prtica permite que o usurio associe a imagem funcionalidade do boto, minimizando a
complexidade do sistema.
Dicas para o desenvolvimento de um software Parte 2
Em continuidade ao artigo anterior, esta segunda parte abrange mais
algumas boas prticas para o desenvolvimento de um sistema com qualidade.
Provavelmente a maioria dessas prticas j so adotadas pelos desenvolvedores,
mas vale ressalt-las aqui como contedo para base de conhecimento. Sintam-se
vontade para postar comentrios ou crticas sobre o artigo!
Exportao de relatrios
Criar relatrios bem elaborados fundamental, mas importante que exista opes para
export-lo em formatos tradicionais, caso o usurio queira salv-lo no computador ou envi-lo por e-
mail. O formato PDF um dos mais utilizados entre as opes de exportao, principalmente por ser um
tipo de arquivo com tamanho pequeno e no permitir modificaes aps ser criado. A maioria dos
componentes atuais para elaborao de relatrios j possuem mtodos que permitem a exportao
para os formatos mais comuns, mas caso esta opo no exista, basta utilizar o software CutePDF
Writer, que adiciona uma impressora virtual no computador para criar arquivos PDF a partir da
impresso de qualquer documento.
Exportar dados de uma tabela ou de uma grade de registros tambm pode ser de grande
utilidade para o usurio, como uma tabela de preos em formato XLS (Microsoft Excel) ou a ficha
completa de um cliente em formato DOC (Microsoft Word). Esse tipo de recurso garante versatilidade
do sistema por meio da integrao com aplicaes externas tambm utilizadas pelo cliente.
Teclas de Atalho
Quando um menu acessado com bastante frequncia, pode ser interessante associar teclas de
atalho para acess-lo com mais agilidade. Quem utiliza o Microsoft Windows j deve conhecer algumas
combinaes de teclas disponveis para abrir as janelas mais comuns do sistema, como o Windows + E
para abrir o Windows Explorer e o Windows + F que abre a janela para pesquisa de arquivos. O
mesmo pode ser adaptado a um sistema, por exemplo, para abrir a tela de cadastro de clientes e a tela
de consulta de vendas. As teclas de atalho tambm podem ser atribudas a determinados eventos do
sistema, como recalcular a soma de valores ou preencher um campo automaticamente. Usurios mais
experientes geralmente preferem utilizar teclas de atalho ao invs de acessar as funes do sistema
utilizando o mouse, principalmente por agilizar as operaes rotineiras.
Exemplo de teclas de atalho em um menu
Utilitrios
Quanto mais recursos teis o sistema possuir, mais ele atender as necessidades eventuais do
usurio. A ideia incluir calendrio, calculadora, campo de anotaes e telas informativas dentro do
sistema, para evitar que o usurio tenha que recorrer a outros aplicativos com essas funes. Uma boa
prtica associar teclas de atalho globais essas funcionalidades, como o F6 para Calculadora e F7 para
Calendrio, por exemplo.
Outra utilidade importante permitir que o usurio configure o sistema conforme o seu perfil,
ou seja, o sistema pode apresentar uma tela de configurao e armazenar as preferncias do usurio em
um arquivo do tipo INI. Todas as vezes que o sistema for inicializado, as preferncias contidas neste
arquivo so carregadas e aplicadas ao sistema. O arquivo de configurao pode conter o diretrio do
banco de dados, ordenao padro dos registros de uma tabela, agendamento de backup e outras
configuraes internas do sistema.
Este arquivo se torna ainda mais til quando existe mais de um usurio utilizando o sistema e
cada um possui preferncias diferentes. Assim, no preciso criar uma verso exclusiva para cada
usurio, basta apenas guardar as configuraes em um arquivo INI.
Aqui no SubRotina h um artigo sobre como trabalhar com arquivos INI pelo Delphi.
Algumas operaes do sistema podem demorar um certo tempo para serem processadas,
principalmente instrues SQL complexas que envolvam clculos ou consultas em tabelas com vrios
registros. Quando isso ocorre, normalmente o sistema congela ou pra de responder durante o
processamento at que a operao seja finalizada. Porm, o usurio pode imaginar que a aplicao
parou de funcionar e forar o encerramento do processo, comprometendo a instruo em execuo.
Para evitar este tipo de transtorno, conveniente criar telas de espera para informar o usurio de que
um processamento est em execuo. Essa tela fica ainda mais intuitiva quando h alguma imagem
animada (GIF) ou uma barra de progresso indicando o processamento. Entretanto, como a tela de
espera e a instruo SQL compartilham o mesmo processo na memria, provvel que a aplicao fique
travada da mesma forma, sem resposta. A soluo implementar unidades chamadas Threads, capazes
de criar fluxos paralelos ao processo principal para executar uma operao em segundo plano. Basta
ento exibir uma tela de espera e transferir o processamento (como uma instruo SQL) dentro de uma
Thread para que o sistema no se torne instvel.
Padronizao de cdigo
Este item bastante importante quando o projeto desenvolvido por mais de uma pessoa, ou melhor,
por uma equipe de desenvolvimento. Definir uma padronizao do cdigo auxilia na legibilidade e na
compreenso do que est sendo executado na aplicao. Identar o cdigo nos blocos de condio if-else
e nos laos de repetio so uma das prticas que ajudam os desenvolvedores a identificar facilmente a
execuo de um mtodo. Identao significa estruturar as linhas do cdigo em tabulaes de acordo
com o nvel da instruo. A figura abaixo exemplifica um cdigo bem identado utilizando a linguagem
C++:
As variveis, classes, objetos e mtodos tambm devem possuir nomes sugestivos de acordo
com o seu objetivo. Portanto, uma varivel com o nome SomaTotalPedidos bem mais fcil de ser
assimilada do que uma varivel chamada vSTotPed. O cdigo fica mais legvel quando se trabalha com
esse tipo de nomenclatura, mesmo que o nome fique ligeiramente maior.
Tratamento de excees
Por mais que o desenvolvedor faa testes na aplicao antes de liberar a verso, natural que
alguns erros ainda possam ocorrer inesperadamente para o usurio. Estes erros so decorrentes de
problemas de semntica, gravao de dados inconsistentes, falhas de acesso memria ou at mesmo
eventos inesperados do sistema operacional. No ambiente de programao, os erros so conhecidos
tecnicamente como excees. Uma boa prtica de programao exige que exista um tratamento de
excees em todos os pontos mais sensveis do cdigo. Inseres e atualizaes no banco de dados so
exemplos de operaes que possivelmente podem retornar algum erro para o usurio. A recomendao
envolver este cdigo em um bloco de tratamento de exceo e executar uma operao de rollback
(desfazer as alteraes no banco de dados) caso algum erro seja encontrado. Ao utilizar tratamento de
excees, tambm possvel criar mensagens mais significativas para reportar a exceo ao usurio.
Dessa forma, faz mais sentido exibir a mensagem Ocorreu um erro. Verifique os dados. ao invs de An
error occurred. Access violation at address 004068EC.. Estes tipos de mensagens em ingls tcnico
geralmente so desconhecidas para o usurio e no trazem nenhum tipo de informao para auxili-lo.
Atualizao do sistema
Normalizao de dados
Consultas compostas
Boa parte dos sistemas atuais possuem uma padronizao para consultas de dados, normalmente pelos
campos mais comuns da tabela. Por exemplo, em um cadastro de clientes, a consulta pode ser realizada
por nome, cidade ou CPF. No entanto, h situaes em que pode ser necessrio consultar clientes por
endereo, telefone, estado, profisso ou estado civil. Ok, basta ento adicionar estes campos s opes
de consulta, correto? Bem, uma alternativa, mas imagine que o usurio tambm queira pesquisar os
clientes que moram no estado de So Paulo, so do sexo masculino e tambm trabalhem como
motorista. Neste caso, a soluo criar uma consulta composta, que consiste em uma busca por vrios
campos ao mesmo tempo. Uma ideia para implementar essa funcionalidade seria utilizar os mesmos
campos de cadastro para a consulta de dados, ou seja, o usurio pode preencher quaisquer campos por
quais deseja consultar, e ao clicar no boto de pesquisa o sistema verifica os campos preenchidos e
concatena uma SQL internamente para enviar ao banco de dados. uma funcionalidade bem
interessante, mas caso for utiliz-la, atente-se s clusulas where e and, e confira se a busca realmente
corresponde ao que foi solicitado pelo usurio.
Exemplo de SQL Composta
Com o crescimento da internet e de recursos online, tornou-se comum a integrao de sistemas desktop
com servios web para facilitar ou agilizar operaes. Um exemplo bem prtico o envio de arquivos de
Nota Fiscal Eletrnica. Nos primrdios de sua utilizao, os usurios geravam um arquivo XML pelo
sistema, acessavam outro aplicativo para envio do arquivo, validavam o XML e por fim imprimiam a
DANFE. Todo este processo era trabalhoso e gerava dificuldades para os usurios. Felizmente, a
integrao dos sistemas desktop com os chamados WebServices possibilitou que este procedimento
fosse realizado diretamente pela aplicao principal, sem a interveno do usurio para manipular os
arquivos XML. Alm deste exemplo, outros servios web tambm podem ser agregados aplicao,
como consulta de endereos por CEP, mapas de localizao (Google Maps), feed de notcias e outros
tipos de informaes online. Os desenvolvedores podem ainda disponibilizar um mdulo do sistema na
web interligado com o sistema desktop, permitindo, por exemplo, que os usurios tenham acesso aos
dados do sistema pela internet, sem necessariamente utilizarem o sistema desktop. A imagem abaixo
ilustra o funcionamento do WebService da Serasa para consulta de CPF:
H muito que ser abordado neste ltimo item, por tratar-se de uma questo mais voltada para
anlise do que desenvolvimento. Normalmente, os usurios que operam o sistema no dia-a-dia sentem
necessidade de novos campos nas telas, botes para novas funcionalidades ou atalhos para agilizar as
operaes. muito comum ouvirmos frases como:
var
objeto: TClasse;
begin
objeto := TClasse.Create;
try
// operaes com o objeto
finally
FreeAndNil(objeto); // libera o objeto da memria
end;
end;
Criao de componentes
Se o seu objetivo reduzir cdigo e padronizar a aplicao, criar componentes uma tima prtica.
Suponha que em determinado projeto decidimos modificar os campos de texto da seguinte forma:
- ao receber o foco, ele mudar de cor
- o campo no pode possuir contedo em branco
- ao sair do campo, se o valor for uma data, a aplicao deve valid-la
Para que essas funcionalidades tenham efeito, necessrio codificar cada campo de texto em
toda a aplicao, no ? Oras, por qu no criar um componente com essas caractersticas? Dessa
forma, utilizaramos esse componente ao invs do campo de texto nativo da ferramenta e no
precisaramos codificar cada um deles, j que as funcionalidades estariam implcitas no componente
criado. Alm disso, se futuramente for necessrio adicionar uma caracterstica (por exemplo, trocar a
fonte de texto), basta modificar o componente e a alterao ser refletida em todos as instncias do
componente inseridas na aplicao. Quando o desenvolvedor cria vrios componentes personalizados,
pode-ser dizer que ele est definindo um Framework de desenvolvimento.
Implementar algumas regras de negcio no banco de dados pode trazer grandes vantagens para
a aplicao, tanto no sentido de automao de operaes como no desempenho. Na verdade, Triggers e
Stored Procedures nunca deixaram de ser recursos essenciais no desenvolvimento de um software. Vou
citar apenas uma das vantagens: em uma aplicao Cliente/Servidor ou Multicamadas, criar Triggers e
Stored Procedures no banco de dados evita que vrias chamadas sejam feitas ao servidor. Imagine que,
ao excluir um pedido, seja necessrio tambm excluir os itens do pedido (no sentido master/detail). Pela
aplicao, faramos duas solicitaes ao banco de dados: uma para excluir os itens e outra pra excluir o
pedido em questo, certo? Pois bem, se centralizarmos essa operao em uma Trigger no banco de
dados, apenas uma solicitao ser feita, ou seja, a Trigger se encarregar de excluir os itens antes de
excluir o pedido, tornando-se um processo automatizado. Para aplicaes de pequeno porte pode no
surtir tanta diferena, mas em uma aplicao com vrios usurios conectados simultaneamente a
vantagem notvel, inclusive pelo motivo de reduo de trfego na rede.
S para efeito de conhecimento, segue o exemplo da criao de uma Trigger no Firebird:
Essa dica bem interessante, embora a implementao dessa funcionalidade seja complexa.
Antes de continuar, vale lembrar que um fonema, grosso modo, a unidade de som produzida ao
pronunciar uma determinada letra. Por exemplo, na lngua portuguesa, as letras i e y possuem o
mesmo som (mesmo fonema), e isso causa alguns problemas na busca de dados em um aplicativo. Sabe
por qu?
Imagine que o sistema tenha vrios clientes cadastrados, e trs deles tenham o nome de rica,
Erica e rika, respectivamente. Ao atender a ligao de uma dessas clientes, o usurio solicita o nome,
ouve, e digita Erica (sem acento) no campo de dados para localizar o registro. Obviamente, apenas um
dos nomes aparecer na tela. Porm, a cliente que ligou a rika (com acento e com k)! J que o
resultado no apareceu na busca, o usurio ir informar que ela no est cadastrada no sistema. Bom, a
voc j viu, rsrs.
Busca por fonema consiste em agrupar letras que tenham o mesmo som em uma mesma
consulta. No exemplo acima, ao digitar Erica, os trs registos seriam exibidos na tela, j que o acento e
os fonemas de c e k, neste caso, produzem o mesmo som. Como disse anteriormente, a
implementao complexa e portanto leva muitos desenvolvedores a procurarem por solues j
codificadas.
Dicas para o desenvolvimento de um software Parte 6
Prezar pela usabilidade e funcionalidade do software sempre foi um
aspecto importante a ser considerado. A sexta parte sobre dicas de
desenvolvimento traz alguns conceitos mais bsicos em comparao com as
outras partes dessa srie. As quatro dicas a seguir envolvem caractersticas
visuais, mas que no deixam de ser importantes para a usabilidade. Confira
tambm as outras partes no final deste artigo!
Dicas de tela
As dicas de tela, tambm conhecidas como Hints, so textos que aparecem quando voc
posiciona o cursor do mouse em um componente da tela, como um campo ou boto. Esses textos
trazem uma breve definio da funo do componente, extremamente til para barras de ferramentas
que possuem apenas imagens nos botes.
O problema que s vezes esses hints no esto disponveis. Eu j fui vtima de colocar o cursor
em um boto e ficar um bom tempo esperando o hint aparecer, rsrs. Por isso, procure adicionar hints
bem explicativos na maioria dos componentes visuais da tela. Uma dica dessas pode evitar que o
usurio execute uma operao incorreta ou entre em contato com o suporte para questionar sobre a
funcionalidade.
Enfim, a terceira soluo, que em minha opinio bem interessante, consiste em dividir o
formulrio em duas abas: uma que exiba a Grid somente com as colunas que identifiquem o registro
(como cdigo e nome, por exemplo) e ao clicar no registro, todos os dados so carregados em campos
de texto na outra aba. Em outras palavras, em uma aba o usurio navega entre os registros e na outra
aba ele visualiza os dados do registro selecionado.
S para fazer um teste, crie um papel de parede verde fluorescente e coloque como imagem de
fundo na sua aplicao. Eu aposto que em dois dias a maioria dos usurios iro marcar uma consulta
com o oftalmologista, rsrs. Para os desenvolvedores que eventualmente rodam a aplicao pode no
parecer to cansativo, mas, para os usurios que convivem com o sistema praticamente o dia todo,
desagradvel.
A dica utilizar cores leves dispensando grficos avanados, talvez apenas com o nome do
sistema bem pequeno no canto da imagem.
Outra dica manter a imagem de fundo dinmica, ou seja, permitir que o prprio usurio
selecione um arquivo no computador, assim como acontece com o papel de parede do Windows.
Ordem de tabulao
No primeiro artigo, mencionei a importncia da ordem de tabulao dos campos no tpico sobre
facilidade de uso. Imagine que o usurio est no primeiro campo de uma tela e ao pressionar TAB o foco
vai para o ltimo? Ruim, no ? Neste caso, nem possvel adivinhar a ordem infelizmente a soluo
utilizar o mouse. Bom, eu mesmo devo assumir que muitas vezes j esqueci de ajustar a ordem de
tabulao dos campos, rsrs. Portanto, aqui eu reforo essa dica: a tabulao deve ocorrer de cima para
baixo sem pular campos, ao menos que estejam desabilitados ou sejam read-only.
Submenus infinitos
Imagine que o usurio tenha que acessar 5 submenus para emitir um relatrio?
At ele chegar no ltimo submenu j acabou o expediente, rsrs. Recomenda-se que um menu
tenha, no mximo, 2 submenus. Mais do que isso pode atrapalhar o acesso tela ou funcionalidade,
alm de confundir as opes em meio a tantos itens. comum encontrar tambm submenus
desnecessrios, como a seleo da impressora para imprimir um relatrio. No meu ponto de vista, essa
opo pode ser adequadamente includa na prpria tela de visualizao do relatrio ou no dilogo de
impresso.
Uma alternativa criar uma barra de ferramentas com botes de acesso para as telas mais
utilizadas, evitando que o usurio tenha que percorrer vrios submenus para abri-las. Essa alternativa
torna-se ainda melhor se a barra de ferramentas for personalizvel, ou seja, permitir que o prprio
usurio escolha os botes que ficaro disponveis na barra. Estes atalhos so muito teis em sistemas
que integram dois ou mais departamentos de uma empresa, j que em cada departamento as telas
acessadas com mais frequncia so diferentes.
Assim como comentei na primeira parte dessa srie de artigos, alguns softwares mais modernos
apresentam menus do tipo Ribbon, parecidos com as verses mais recentes do Microsoft Office. Esse
tipo de menu, por possuir abas e botes de opo, podem facilmente substituir os menus tradicionais
de um sistema e apresentar uma navegao mais intuitiva.
Essa clssica! H muitos softwares por a que exibem datas no formato americano
(ms/dia/ano) e confundem a cabea do pobre cidado. Quando o usurio encontra a data
12/15/2013, alm de tentar interpret-la, normalmente ele toma uma atitude: reclama do sistema ou
liga para o suporte.
H um grande risco quando a data se parece comum, como, por exemplo, o dia 03/06/2013 ser
exibido como 06/03/2013. Embora esteja errada, o usurio pode interpret-la como o dia 06 de
maro. Se o sistema trabalhar com histricos, movimentaes ou agendamentos, essas datas podem
trazer srios problemas!
Isso tambm vale para formatos de valores monetrios. Procure sempre manter o ponto como
separador de milhares e a vrgula como separador decimal. Caso o banco de dados exija que o
armazenamento seja no formato americano, cabe ao software realizar a converso necessria para
gravar e exibir corretamente os valores.
No Delphi, pode-se adicionar as linhas abaixo no arquivo DPROJ (ou DPR, nas verses antigas)
para garantir essa padronizao em qualquer ambiente Windows em que o software for executado:
FormatSettings.ThousandSeparator := '.';
FormatSettings.CurrencyFormat := 2;
FormatSettings.DecimalSeparator := ',';
FormatSettings.ShortDateFormat := 'dd/mm/yyyy';
FormatSettings.DateSeparator := '/';
Mensagens em excesso
As mensagens acima so irnicas, mas na realidade alguns sistemas parecem fazer uma
entrevista com o usurio: para qualquer operao existe uma tela de confirmao, at para as
operaes mais rotineiras. Mensagens so necessrias, mas no em excesso. H operaes que so
bvias, e no precisam ter uma mensagem de informao ou confirmao para serem realizadas. claro
que isso no ir afetar o desempenho do software, mas j me deparei com muitos usurios que
solicitaram a remoo de algumas mensagens pelo motivo de atrapalhar a usabilidade.
Se a inteno exibir uma mensagem informativa, considere exibi-la no formulrio de forma esttica,
utilizando uma Label, por exemplo. Mensagens de validao tambm podem ser substitudas por bales
com hints (hint balloons) que, alm de no exigir interao do usurio (para pressionar o OK), tambm
so bem modernos.
S para complementar, j trabalhei com sistemas que no exibem mensagem alguma ao gravar
um registro, apenas limpam os campos para a insero de novos dados. Se for uma tela que permite
inseres sucessivas, essa modalidade pode ser bem adequada. Basta orientar o usurio de que, se o
sistema limpar o contedo dos campos ao gravar o registro, significa que foi gravado com sucesso.
Gravao de imagens no banco de dados
Oras, basta controlar o tamanho da imagem a ser carregada, como por exemplo, somente imagens JPG
com tamanho menor que 50KB!
Certo, essa uma alternativa, mas mesmo assim ainda tenho trs argumentos:
1) No deixa de ser uma imagem, ento ela ter que ser gravada em um campo de um tipo especial na
tabela, como o BLOB do Firebird;
2) Voc ter que implementar um cdigo especfico tanto para a gravao quanto para a leitura da
imagem;
3) E o mais impactante: o usurio ter que utilizar um aplicativo externo para redimensionar e converter
a imagem para que atenda os requisitos da sua aplicao. Para muitos, isso pode se tornar entediante.
Simples! Durante a cpia, voc pode renomear o arquivo conforme algum dado que identifique o
cliente, como o prprio cdigo. Por exemplo, no cadastro do cliente n 10, o usurio ir carregar o
arquivo Andre.jpg na aplicao, mas este arquivo ser salvo como 00010.jpg dentro da pasta de
imagens. Bom, ento j deu pra perceber que pra fazer a leitura ser bem fcil, no ? Basta carregar a
imagem que tenha o nome igual ao cdigo do cliente selecionado.
No Delphi, possvel copiar o arquivo da seguinte forma:
var
ImagemOrigem: string;
ImagemDestino: string;
begin
// este arquivo pode ser selecionado com um TOpenDialog
ImagemOrigem := 'C:\Clientes\Fotos\Andre.jpg';
Image1.Picture.LoadFromFile('C:\Aplicativo\Imagens\' + CodigoCliente +
'.jpg');
Dicas para o desenvolvimento de um software Parte 8
A qualidade de software sempre foi um tema imensamente discutido na rea
profissional e acadmica, alm de ser um dos maiores focos das empresas de
desenvolvimento. Leitores, convido-os para conferir o oitavo artigo da srie sobre dicas
para desenvolvimento de um software, no qual destaco mais quatro tpicos relevantes
sobre o assunto. Aproveitando, gostaria tambm de agradecer os feedbacks!
Estatsticas
Embora o software seja importante para armazenar informaes, interessante que ele tambm
possua boas rotinas de minerao de dados (Data Mining) para compor estatsticas e apresentar dados
histricos. Essas funcionalidades so bastante apreciadas pelos stakeholders principalmente por
contribuir para a definio de estratgias de negcio da empresa. Entre essas informaes, o software
pode apresentar os clientes potenciais, produtos emergentes, clculo de variaes e faturamento por
perodo, alm de grficos e relatrios bem elaborados. Bons profissionais ressaltam que um software
deve trazer valor agregado ao negcio do cliente, e no apenas servir como um continer de
informaes. Portanto, programe o seu software para ser capaz de transformar os dados armazenados
em informaes estratgicas para o negcio.
Mas vale ressaltar: para que isso seja possvel, o banco de dados deve estar bem modelado e com
relacionamentos corretamente definidos. Caso contrrio, os dados levaro uma eternidade para serem
compostos e exibidos, ou, no pior dos casos, no ser possvel interligar as tabelas de modo a trazer
dados relacionados consulta solicitada.
Formulrios integrados
Vamos supor que, aps aplicar a normalizao de dados, voc criou um cadastro de cidades no
software com o objetivo de registrar as cidades utilizadas em outras tabelas, como clientes,
fornecedores e funcionrios. Assim sendo, no cadastro de clientes, por exemplo, haver uma lista de
opes (combobox) para que o usurio selecione a cidade do cliente, correto?
Pois bem, imagine que o usurio est preenchendo os dados de um novo cliente e ao selecionar a
cidade ops, a cidade no est cadastrada!
Opcionalmente, para manter o visual mais enxuto, muitos desenvolvedores adicionam essa
opo na prpria combobox, conforme a imagem abaixo:
Porm, atente-se que se houver muitas cidades cadastradas pode no ser vivel exibi-las em uma
lista de opes, j que, alm da demora para carregar todas as cidades na lista, levaria um tempo para o
usurio encontrar a cidade desejada. Uma alternativa exibir uma tela de pesquisa ao invs de utilizar
uma lista, para que o usurio possa procurar a cidade diretamente pelo nome. Essa opo fica ainda
mais interessante quando h uma tecla de atalho para abrir a tela de pesquisa, como uma das teclas de
funo (F1 a F12).
claro, essa dica vale para qualquer situao que envolva relacionamento entre tabelas.
Validaes
Uma validao a funo de evitar que um dado invlido, inconsistente ou incorreto seja
processado ou gravado no banco de dados. Considere a validao como um firewall que analisa os
dados digitados pelo usurio: se alguma informao no estiver condizente com os padres ou regras do
sistema, ento no processada. Quanto mais validaes voc programar no software, maior ser o
nvel de confiabilidade.
Para exemplificar, imagine uma regra de negcio que envolva perodos de vigncia sobre um
determinado requisito funcional. O perodo de vigncia exige que a data de incio de um registro deve
ser imediatamente a sequncia da data de trmino do registro anterior. Por exemplo, se a data de
trmino for 20/07/2013, a data de incio do registro seguinte deve ser 21/07/2013. Alm disso, no
permitida a sobreposio de datas, ou seja, dois registros diferentes no podem compreender o mesmo
perodo. Para controlar a complexidade dessa regra de negcio, imprescindvel que haja uma
validao de datas a cada novo registro inserido, evitando que perodos incorretos sejam armazenados
no banco de dados. A validao ter que comparar as datas para encontrar possveis sobreposies e
identificar furos entre vigncias de dois registros consecutivos. Tradicionalmente, a implementao
pode ser uma funo que retorne um valor booleano como resultado dessas verificaes.
Validaes geralmente so realizadas antes da insero do registro de modo que, se os dados no
estiverem corretos, a aplicao cancele a operao em transao e permita que o usurio corrija os
dados. Porm, existem ainda outras validaes que dizem respeito ao comportamento dos controles na
tela, como a quantidade de caracteres permitida em um componente ou campos que obrigatoriamente
devem aceitar somente nmeros. E volto a repetir: quanto mais voc cobrir o sistema com validaes,
menos haver brechas para falhas, garantindo confiabilidade e integridade dos dados armazenados.
E por falar em validaes, necessrio test-las, concorda? Talvez essa seja uma das fases mais
importantes no desenvolvimento de um software: testar as funcionalidades, validaes e operaes de
forma intensa, desafiando o seu prprio software a manipular corretamente cada caminho de execuo.
Teste de software pode ser definido como o acompanhamento da execuo de um software em um
ambiente controlado para verificar se as sadas e o desempenho correspondem ao esperado.
Acredito que voc j tenha recebido algum erro reportado pelo usurio e logo pensou: Caramba, eu
testei essa tela vrias vezes, como esse erro aconteceu?. Isso natural. A causa deste problema que
ns, desenvolvedores, temos um probleminha conhecido como vcio de programao. Esse vcio faz
com que nossos testes sejam bvios, uma vez que, como ns mesmos fizemos a programao, j
conhecemos o comportamento do software e no testamos todas as condies que podem ocorrer. Em
outras palavras, o desenvolvedor no consegue pensar com a cabea do usurio, ao menos que ele j
tenha experincia com testes ou realmente saiba interpretar o papel de quem est utilizando o
software.
Para contornar esse tipo de vcio, desenvolvedores autnomos colocam uma pessoa no
relacionada rea desenvolvimento para testar o software. Alm de identificar os erros, o
desenvolvedor pode ainda observar as dvidas que surgem quando um novo usurio comea a utilizar o
sistema pelas primeiras vezes.
Contratar analistas de testes para elaborar roteiros que descrevem as possveis condies que podem
ocorrer na tela ou no mdulo desenvolvido. Dessa forma, estes analistas podem cobrir as possibilidades
de falhas a partir do conhecimento que j tm do sistema e das tcnicas de elaborao de testes;
Orientar os desenvolvedores a implementar testes automatizados para cobrir o cdigo-fonte. Os testes
automatizados so bastante teis para executar uma bateria de testes pr-definidos de modo rpido e
sequencial, sem a interveno de um usurio para a entrada de dados. Uma vez implementados os testes,
a vantagem a possibilidade de execut-los sempre quando a unidade de cdigo for modificada.
Design Patterns
Este ano, por exemplo, acompanhei a implementao dos padres de projeto Strategy, Observer,
Builder e Factory Method em um projeto na empresa em que trabalho e pude observar as vantagens
que estes padres trouxeram ao cdigo-fonte, bem como a facilidade para compreender e documentar
o software.
Apesar de existir 23 padres de projeto, praticamente invivel implementar todos eles em uma
nica soluo, afinal, utilizar padres de projeto sem um propsito uma m prtica. preciso haver
um motivo real para a implementao, ou seja, uma situao em que se pode comprovar de que o
padro de projeto ser uma soluo adequada para o problema. Caso contrrio, a implementao pode
aumentar a complexidade do cdigo-fonte e afetar tambm o desempenho da aplicao.
Uma das dvidas mais frequentes relacionadas a padres de projeto saber onde, quando e como
utiliz-los. Em primeiro lugar, o engenheiro de software deve ter slidos conhecimentos em
Programao Orientada a Objetos e um bom nvel de abstrao, ou seja, a Orientao a Objetos a base
essencial para compreender os padres de projeto. Em segundo lugar, necessrio conhecer o objetivo
principal de cada padro de projeto para que seja possvel fazer um estudo da viabilidade buscando
solucionar um problema no software. Porm, mesmo com esse conhecimento tcnico, comum alguns
engenheiros no conseguirem identificar as situaes ou os mdulos que devem receber a
implementao dos padres. Portanto, em terceiro lugar, o profissional tambm deve ter um domnio
satisfatrio da regra de negcio do cliente. A consolidao de todas essas experincias o que permite a
seleo e a aplicao consciente dos padres de projeto no desenvolvimento do software.
Padro de arquitetura
Deixo aqui a minha recomendao: procurem estudar e conhecer melhor sobre estes padres de
arquitetura. Os conceitos so bastante interessantes e a implementao definitivamente traz bons
resultados!
Clean Code
Francamente, no concordo com essa frase. Se todos os programadores pensarem dessa forma,
teremos tanto cdigo ruim nos softwares que, em certo momento, ser impossvel compreend-los.
Analogicamente, o mesmo que misturar um ingrediente vencido na receita de um bolo: o sabor no
ser o mesmo, alm do risco de fazer mal sade. Que analogia sem sentido, no? Rsrs
Para evitar o cdigo ruim, existe um conceito conhecido como Clean Code. Em linhas gerais, como o
prprio nome sugere, Clean Code significa cdigo limpo e orienta a como escrever um cdigo
estruturado, organizado e compreensvel.
O conceito de Clean Code envolve vrias prticas que podem ser aplicadas por qualquer
desenvolvedor para escrever um cdigo melhor. Entre essas prticas, h recomendaes sobre como
definir nomes de funes, nomes de variveis, responsabilidades de mtodos (um mtodo deve ter uma
e somente uma responsabilidade), indentao de cdigo, parmetros e at mesmo orientaes de como
comentar (e tambm anotar) o cdigo-fonte.
H um timo livro escrito por Robert C. Martin chamado Clean Code A Handbook of Agile
Software Craftsmanship que aborda todas essas prticas de forma bem detalhada e didtica, inclusive
com bastantes exemplos. Ainda no tive a oportunidade de l-lo por completo, mas j consultei algumas
pginas para estudar melhores formas de aprimorar alguns pontos do meu cdigo e me identifiquei com
o contedo. Na verdade, depois de conhecer este livro e ler vrios artigos na internet sobre este
assunto, pude perceber o quanto o comprometimento na escrita do cdigo-fonte importante para o
desenvolvimento de software.
Isso nos leva a refletir sobre aquela famosa frase: Voc responsvel pelo seu cdigo!.
Interfaces
Interface o nome que se d a um recurso para trabalhar com abstraes. O objetivo das
Interfaces prover flexibilidade na estrutura de software de modo que resulte em um baixo
acoplamento (dependncia) entre classes. Ao invs de trabalhar com implementaes concretas, as
Interfaces podem ser utilizadas para representar as abstraes no projeto de software em nvel de
modelagem.
Neste artigo, vou abordar o conceito de Interfaces no sentido de padronizao de mtodos entre
classes, mas gostaria de ressaltar que o contexto de Interfaces envolve mais do que isso, ok?
Pois bem, uma Interface nos permite determinar comportamentos em comum entre classes que
a implementam. Por meio de sua utilizao, possvel estabelecer um padro na implementao de
mtodos como se houvesse um tipo de contrato. Em outras palavras, as classes que implementam
uma determinada Interface deve obedecer todos os mtodos assinados por ela, garantindo um nvel
adequado de padronizao.
Alinhar os componentes na tela significa fix-los em determinadas reas. Por exemplo, o painel
de pesquisa pode ser alinhado no topo da tela, a Grid de dados no centro e o painel de botes na parte
inferior. Ao alterar o tamanho da tela, os componentes acompanharo o redimensionamento de forma
que continuem corretamente distribudos, sem necessariamente sofrer alteraes no prprio tamanho.
Em outras palavras, se o painel de botes est alinhado parte inferior central (bottom-center), ele
continuar no centro independente do tamanho da tela. No Delphi, geralmente trabalha-se com a
propriedade Align em conjunto com a propriedade Anchors, til para ancorar um componente em
algum ponto da tela. Vale ressaltar que, para que isso seja possvel, necessrio que os componentes
estejam agrupados em um container, como um painel, um frame ou uma barra de ferramentas.
Por outro lado, nada impede que voc limite o redimensionamento das telas da aplicao,
configurando os parmetros mnimo e mximo de altura e largura. Essa configurao evita que o visual
de uma tela fique comprometido quando houver um redimensionamento fora do padro.
Espaos em branco
Voc conhece aquele tipo de usurio que coloca um, dois ou at trs espaos em branco antes
de comear a digitar? Eu j conheci! Pode parecer que no, mas os espaos em branco no incio de um
valor em um registro podem trazer algumas consequncias. A primeira delas a questo da consulta:
em uma instruo SQL, se voc utilizar uma condio LIKE com o caractere curinga somente direita
(por exemplo, where Campo like Texto%'), a busca no funcionar para os registros que tm espaos
no incio. Esse tipo de consulta considera o incio do valor exato, portanto, para que a consulta retorne
os dados, o usurio ter que digitar os espaos em branco no incio, assim como fez ao gravar o registro.
Ruim, no?
A segunda consequncia o alinhamento em Grids e relatrios. Se h espaos esquerda em
alguns registros, surgir um efeito de desalinhamento, como se a tela ou o relatrio estivesse com uma
falha visual:
Para resolver este problema, as linguagens de programao geralmente trazem uma funo para
retirar espaos em branco esquerda e direita de uma string, chamada Trim. Essa funo pode ser
utilizada antes de um registro ser gravado, de modo que os valores sejam persistidos no banco de dados
j sem os espaos desnecessrios. Porm, importante destacar que o Trim no retira espaos em
excesso dentro de uma string. Para isso, necessrio desenvolver uma funo especfica que percorra
todas as letras de uma string removendo os espaos repetidos.
Dica bsica, bem bsica, mas que muitas vezes passa por entre os dedos dos desenvolvedores.
Quando voc deixa de configurar o tamanho mximo em um campo e o usurio digita um valor maior
do que o permitido, podem ocorrer duas situaes: o valor cortado e gravado pela metade no banco
de dados, ou o usurio recebe uma exceo semelhante ao string truncation do Firebird. Erros dessa
natureza so bastante comuns, j que o usurio no sabe o limite de caracteres que podem ser
digitados em um campo. A definio do nmero mximo de caracteres pode ser realizada atravs das
propriedades dos prprios componentes em tempo de projeto ou execuo. No Delphi e C#, a
propriedade se chama MaxLength. No Java, uma das alternativas utilizar um Document personalizado,
sobrescrevendo o mtodo insertString.
Para valores numricos a situao pode ser um pouco diferente. Suponha que voc tenha um
campo que represente a porcentagem de desconto em uma venda e esqueceu de estabelecer o
intervalo entre 0% e 100%. Por um golpe de distrao, o usurio digita 250% e grava os dados. Mesmo
que seja um valor aceitvel pelo banco de dados, no faz sentido que exista um desconto de 250%,
concorda? Na verdade, o estabelecimento sairia no prejuzo se isso acontecesse, rsrs. Quando a
porcentagem envolve clculos importantes, fundamental ter uma restrio da faixa de valores.
Constantes
var
ValorIPI: real;
begin
ValorIPI := 0.10; // 10%
// operaes com a varivel ValorIPI
end;
Agora imagine que no ms seguinte o valor do IPI baixou para 5%. Espere isso significa que os
desenvolvedores tero que alterar este valor em cada ponto do software que o utiliza? E se esquecerem
de alter-lo no formulrio de pedidos? Bom, se isso ocorrer, o oramento ser emitido com acrscimo
de 5% e o pedido ser faturado com acrscimo de 10%. Nem preciso dizer o problema que vai dar, no
?
Constantes so teis para casos como este. Basta concentrar o valor em um nico local e utilizar
a constante que o representa. Utilizando o mesmo exemplo acima, poderamos modific-lo da seguinte
maneira:
const
CONSTANTE_VALOR_IPI = 0.10; // 10%
var
ValorIPI: real;
begin
ValorIPI := CONSTANTE_VALOR_IPI;
// operaes com a varivel ValorIPI
end;
Sim, seria, mas utilizar constantes garante que o valor nunca ser alterado. Ao utilizar variveis,
corre-se o risco do seu contedo ser modificado por uma rotina qualquer e afetar os clculos no
software. Outra vantagem a opo de criar uma classe exclusiva para guardar todas as suas
constantes, facilitando a manuteno e compartilhando-as entre mdulos. Em algumas empresas, os
desenvolvedores criam constantes at para as mensagens de aviso e de confirmao que so exibidas
na tela. Dessa forma, sempre haver uma padronizao das mensagens apresentadas ao usurio.
Interessante!
Maisculas ou minsculas?
Certa vez, recebi um e-mail de um desenvolvedor com uma dvida sobre pesquisa de nomes. No
e-mail, ele explicava que, na aplicao, o usurio digitava o nome do cliente como estava no banco de
dados, mas o retorno era nulo. Aps trocarmos alguns e-mails, identificamos que o problema ocorria em
funo das letras. No banco de dados, os registros estavam sendo armazenados em maisculas, e na
aplicao, a consulta era realizada em minsculas.
No meu ponto de vista, h duas solues para essa situao. A primeira delas padronizar toda a
aplicao para trabalhar com letras maisculas, tanto na gravao dos dados quanto nas consultas e
exibio das informaes. Este padro evita equvocos na busca de dados e garante que todos os
registros estejam armazenados em um formato nico. Alm disso, imagine o quo estranho seria se, em
uma Grid de dados, uma parte estivesse em maisculas, outra parte em minsculas, e o resto
misturado? Na prtica, torna-se at desconfortvel para visualizar os dados!
Porm, h desenvolvedores que preferem gravar os dados no formato caixa mista, ou seja, com
as iniciais de cada palavra em maiscula, como Andr Luis Celestino, por exemplo. Sem dvidas,
uma forma mais elegante de armazenar e exibir os dados quando comparada com o texto todo em
maisculo. Este o caso do desenvolvedor que me enviou o e-mail. Ele gostaria de armazenar os
registros em caixa mista, mas, ao mesmo tempo, permitir que o usurio consulte os dados sem
necessariamente digitar neste formato. No exemplo do meu nome, se o usurio digitasse andr ou
ANDR, o registro no seria encontrado. Portanto, a segunda soluo converter internamente os
dois lados para uma nica forma (maisculas ou minsculas). Caso o registro esteja gravado como
Andr e o usurio digitar andr, basta converter ambos os dados para maisculas, resultando em
ANDR e ANDR, logicamente. Dessa forma, possvel fazer as comparaes necessrias e retornar
corretamente as consultas.
Entretanto, cabe ressaltar que para cada pesquisa ser necessrio realizar uma converso de
caracteres nos registros do banco de dados utilizando o UPPER na instruo SQL. Logo, se houver muitos
registros, a engine do banco de dados ir realizar a converso em cada um, causando quedas de
desempenho. Se possvel, procure realizar as converses a nvel de aplicao, poupando o
processamento no banco de dados. Outras prticas de otimizao podem ser encontradas neste artigo
do SubRotina.
Informaes no final da Grid
Na parte 6 dessa srie de artigos, citei a importncia da exibio correta dos dados em uma Grid.
Porm, tambm mencionei que talvez seja necessrio ativar a barra de rolagem horizontal para que o
usurio veja todas as colunas visveis. Em algumas ocasies, essa barra de rolagem pode se tornar
algo inconveniente, principalmente se a coluna for bastante utilizada pelo usurio.
Imagine que h 10 colunas em uma Grid e, ao abrir a tela, somente 4 delas so exibidas para visualizar
as outras, deve-se mover a barra de rolagem. Se estas forem colunas importantes, bem provvel que o
usurio ir visualiz-las na maioria das vezes que abrir a tela, no ? Ento, por que no facilitar essa
visualizao?
Uma das formas fixar um painel com caixas de texto ou Labels logo abaixo da Grid, exibindo as
informaes importantes. Conforme o usurio navegar entre os registros, o texto destes componentes
iro receber os dados do registro atual. Veja a imagem de exemplo abaixo:
Outra forma permitir que o usurio reposicione e redimensione as colunas, ou seja, arraste as
colunas desejadas para a rea visvel da Grid. Em seguida, a aplicao armazena a posio dessas
colunas em um arquivo de configurao. Dessa forma, todas as vezes que o usurio abrir a tela, basta ler
o arquivo e ajustar a posio e tamanho das colunas conforme configurados previamente pelo usurio.
Barra de status
E por falar em informaes relevantes, barras de status so grandes aliadas para essa finalidade. Na
verdade, este componente to comum que muitos desenvolvedores apenas se limitam a exibir a data
e hora atual. No entanto, barras de status tambm so adequadas para manter o usurio informado. Em
uma tela de emisso de pedidos, por exemplo, a barra de status pode exibir a quantidade de itens
adicionados ao pedido, o total corrente, descontos concedidos e o login do usurio.
Por outro lado, verifique se as informaes exibidas na barra de status so realmente relevantes
para o usurio. Um visual limpo e minimalista bem melhor do que uma tela poluda com informaes
dispensveis.
Menu pop-up
Voc j notou que, ao clicar com o boto direito na maioria dos aplicativos, mostrado um menu
suspenso com funes genricas? Normalmente so funes de uso frequente, como o Copiar, Colar,
Recortar e Selecionar Tudo. Podemos empregar essa mesma diretriz e disponibilizar algumas operaes
corriqueiras em um menu pop-up (suspenso) em nosso software.
Certa vez, em um software que desenvolvi, notei que para gerar um relatrio detalhado de um
cliente, os usurios precisavam acessar uma tela especfica, consultar o registro, selecionar alguns
parmetros e clicar em um boto. Na busca por melhorar a usabilidade, associei um menu pop-up Grid
de dados no cadastro de clientes. Dessa forma, ao clicar com o boto direito no registro selecionado, o
usurio no apenas tinha acesso direto ao relatrio, mas tambm s funes de edio, excluso e cpia
de dados sem a necessidade de acessar outras telas.
Menus pop-up so como atalhos que evitam a necessidade de realizar acessos intermedirios.
Considere a prpria ferramenta de desenvolvimento que voc utiliza como um exemplo. Clique com o
boto direito no editor de cdigo e confira a srie de recursos disponibilizados para elevar a
produtividade e reduzir o tempo de implementao. Eu, particularmente, uso bastante! Sendo assim,
pense tambm na facilidade que estes menus proporcionariam nas telas do seu software e faa com
que a produtividade dos seus usurios tambm seja aprimorada!