Você está na página 1de 32

Dicas para o desenvolvimento de um software Parte 1

Andr Luis Celestino

Embora a internet esteja repleta de tutoriais e dicas sobre


desenvolvimento, sempre surge a dvida de como um sistema deve ser
devidamente desenvolvido dentro de padres. Na verdade, no h uma regra
geral ou um processo nico para o desenvolvimento de um sistema, mas existem
boas prticas que, quando adotadas, podem trazer grandes vantagens em um
software, tanto para o cliente quanto para o prprio desenvolvedor. Em muitas
empresas de software, tais prticas so consideradas como uma metodologia de desenvolvimento,
principalmente por facilitar a manuteno e atualizao, alm de garantir uma personalidade nica para
o sistema. Este o primeiro de vrios artigos sobre este assunto, onde o objetivo transmitir um base
slida sobre alguns pontos importantes para o desenvolvimento de um software envolvendo a
implementao do cdigo e o visual da aplicao.

Facilidade de uso

Colocar vrios botes e informaes em excesso em uma janela pode comprometer a


usabilidade da aplicao. Simplicidade e objetividade devem estar casados com a funcionalidade do
sistema para proporcionar um maior conforto ao usurio. Procure simplificar o visual das janelas,
adicionando somente os componentes necessrios que o usurio de fato ir utilizar. Estruture a janela
de forma que os campos fiquem em uma sequncia objetiva, agrupados por assunto ou categoria. Em
um cadastro de clientes, por exemplo, divida os campos por sees, como dados pessoais, dados
profissionais, contato e informaes adicionais. Assim a localizao de informaes fica bem mais fcil e
evita que o usurio fique confuso em meio a tantos campos. Procure tambm organizar a ordem de
tabulao, para que a digitao de dados se torne mais rpida atravs do TAB ou ENTER para avanar o
cursor entre os campos. A questo do padro visual das janelas deve ser discutida na fase inicial do
projeto durante a anlise de requisitos. Para garantir que o visual fique conforme a expectativa do
usurio, os projetistas utilizam uma tcnica conhecida como Prototipao, que consiste em elaborar
uma prvia da tela desenhando-a em um documento. Este desenho apresentado ao cliente para
avaliao, e aps a aprovao finalmente o visual passa a ser desenvolvido.

Splash Screen

Durante o desenvolvimento de um software, natural que haja a necessidade de executar uma


srie de instrues e validaes durante a inicializao do sistema, como verificar o caminho do banco
de dados, criar backups, carregar mdulos e abrir tabelas. Essas instrues podem atrasar a inicializao
e a exibio do sistema para o usurio. Consequentemente, o usurio pode pensar que o sistema no foi
aberto e tentar abri-lo novamente, criando duas instncias distintas do sistema na memria. Para evitar
este problema, desenvolvedores criam telas de inicializao, tambm conhecidas como Splash Screen.
Essa tela geralmente contm o nome do software e uma barra de progresso indicando o andamento da
inicializao enquanto todas as instrues necessrias so executadas em segundo plano.
Splash Screen do NetBeans 7

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.

Exemplo de tela para backup

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.

Exemplo de menu com interface Ribbon

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.

Exemplo de opes para exportao de relatrios

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

Porm, atribuir teclas de atalho em todos os menus e sub-menus no sistema desnecessrio,


alm de confundir a memria do usurio. Procure atribu-las somente nas principais funes do sistema
e utilizar combinaes de teclas simples para facilitar a memorizao.

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.

Exemplo de configuraes em um arquivo INI


Threads e telas de espera

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.

A verificao automtica de ortografia no Microsoft Word um exemplo de Thread. Repare que


o programa no trava enquanto a verificao realizada paraa cada palavra digitada. No Microsoft
Outlook, observe tambm que possvel utilizar normalmente o software ao mesmo tempo que novos
e-mails so baixados na caixa de entrada. Portanto, Threads no servem apenas para desenvolver telas
de espera, mas sempre quando for necessrio executar instrues em paralelo sem afetar o
desempenho do sistema. A figura abaixo (em ingls) apresenta uma breve demonstrao de como as
Threads se comportam dentro de um processo:

Ilustrao do funcionamento de uma Thread


Dicas para o desenvolvimento de um software Parte 3

Este o terceiro artigo sobre algumas dicas para o desenvolvimento de um


software com qualidade e uma funcionalidade. Aproveito a oportunidade para
agradecer a todos que leram e compartilharam o primeiro e o segundo artigo
sobre este assunto. Espero que as dicas neste artigo tragam um pouco mais de
conhecimento aos leitores e, mais uma vez, sintam-se vontade para expressar
qualquer opinio sobre este texto.

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++:

Exemplo de identao de cdigo

Quando h uma grande quantidade de aninhamento de blocos no cdigo-fonte, a identao se


torna ainda mais importante para associar o incio e o fim de cada bloco aninhado. Algumas ferramentas
de desenvolvimento, como o NetBeans e o Visual Studio, possuem o recurso de destacar o aninhamento
quando o cursor do mouse posicionado na chave que abre ou fecha o bloco. Desenvolvedores em
Delphi tambm podem adquirir essa funcionalidade com os addons cnPack ou GExperts, ambos
gratuitos.

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

A cada atualizao do sistema, normalmente necessrio substituir o executvel no computador


do cliente, rodar scripts SQL e alterar parmetros de configurao. Sendo assim, preciso ir at o cliente
e fazer todo o processo manualmente no computador local. Para evitar a viagem, uma alternativa
realizar a atualizao remotamente atravs de softwares como o TeamViewer, LogMeIn ou VNC. Porm,
bastante inconveniente quando h dezenas ou at centenas de computadores para serem atualizados.
Se a atualizao for feita em um computador por vez, pode demorar dias para terminar a atualizao em
todos as mquinas.

Portanto, ao invs de realizar a atualizao manualmente, crie um mdulo exclusivo para


automatizar este processo. O objetivo permitir que o prprio sistema verifique novas verses, baixe o
arquivo de atualizao e realize todo o processo automaticamente, sem a interveno do usurio.
Observe que a atualizao automtica est presente na maioria dos softwares atuais, como
navegadores e antivrus. Este tipo de mdulo no simples de ser desenvolvido, mas plenamente
funcional e reduz o trabalho de atualizar vrios computadores simultaneamente.

Exemplo de tela de atualizao


Programao Orientada a Objetos

No mundo da programao, a maioria dos mtodos e componentes so modelados em classes


para proporcionar a reutilizao de cdigo e a manipulao de objetos. A princpio, trabalhar com
classes e objetos pode ser relativamente complexo, mas sem dvida garante maior controle de tudo o
que acontece dentro da aplicao. Atravs da Programao Orientada a Objetos (POO), possvel
reaproveitar ou reduzir vrias linhas de cdigo por meio de tcnicas como abstrao, herana e
polimorfismo. Alm disso, definir a visibilidade dos atributos de uma classe e criar mtodos privados
para manipulao de valores permitem que a estrutura interna da aplicao no seja exposta a outros
nveis. H muito o que se falar sobre Programao Orientada a Objetos, visto que o seu conceito bem
abrangente diante do ponto de vista da Engenharia de Software.

Principais elementos da P.O.O.

Durante a fase de projeto, a Programao Orientada a Objetos amplamente praticada por


projetistas e analistas de sistemas atravs da linguagem UML para modelagem de dados. O Diagrama de
Classes, por exemplo, fornece um grande detalhamento de informaes para simplificar a modelagem
das classes e das tabelas do banco de dados. Em concluso, pode-se dizer que a utilizao da POO evita
que o sistema sofra considerveis alteraes e adaptaes aps a implantao, reduzindo o tempo de
desenvolvimento e minimizando os erros de implementao.
Dicas para o desenvolvimento de um software Parte 4
O quarto artigo sobre dicas para desenvolver um software funcional
abrange alguns conceitos ligeiramente mais avanados. Aps as doze dicas
abordadas nos trs primeiros artigos, este envolve aspectos relacionados ao
aperfeioamento das funcionalidades de um sistema. Agradeo novamente a
todos os leitores que esto acompanhando os artigos, e espero que de alguma
forma essas dicas tenham agregado um pouco mais de conhecimento.

Normalizao de dados

Na maioria dos cursos relacionados a desenvolvimento de sistemas, comum encontrar uma


disciplina que mencione a Normalizao de Dados, fundamental para a formao de analistas e
programadores. Este assunto sugere uma srie de procedimentos aplicados modelagem de dados para
garantir a boa estruturao de um banco de dados. Essa modelagem responsvel pela integridade,
confiabilidade e desempenho das operaes realizadas nas tabelas. Alguns dos pontos mais importantes
abordados pela normalizao de dados envolve a utilizao imprescindvel de chaves primrias, chaves
estrangeiras, criao de tabelas intermedirias para relacionamentos muitos-para-muitos (N:N) e
criao de tabelas para campos multivalorados, como e-mails e telefones. Alm de ser uma prtica
essencial para o projeto de um sistema, a normalizao de dados tambm garante a motivao dos
relacionamentos entre as tabelas e facilita futuras manutenes na estrutura. A modelagem do banco
de dados de um sistema devem passar basicamente por trs formas normais da normalizao de dados,
que consistem em eliminar campos repetitivos entre tabelas, impedir valores redundantes e relacionar
as tabelas por meio de chaves estrangeiras. muito importante estudar a aplicar este conceito dentro
do desenvolvimento de um sistema.

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

Integrao com servios web

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:

Exemplo de integrao com WebService (Clique para ampliar)


Fonte: http://www.consultacpf.com/integracao.aspx

Cuidado com o que o seu cliente pede

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:

H possibilidade de colocar um botozinho aqui?


Eu precisava de um campo aqui para digitar tal informao
Preciso de uma tela nesse menu pra ficar mais fcil
claro, bons analistas e desenvolvedores devem prestar o mximo de suporte, visando suprir
qualquer necessidade do cliente. Mas h casos em que preciso rejeitar a sugesto do cliente para
garantir a integridade e simplicidade do software. Quando o cliente pede um novo campo na tela, deve-
se fazer um estudo da real utilidade de sua incluso, e se este tambm ser til para outros clientes que
operam o mesmo sistema. possvel tambm que o campo j exista, mas no de conhecimento do
usurio. Neste ponto vale ressaltar a importncia dos treinamentos do sistema para os usurios, alm
da capacitao da equipe de suporte para identificar esse tipo de situao. Uma simples orientao
fornecida ao cliente pode evitar que a equipe de desenvolvimento adicione uma nova funcionalidade
sem objetivo algum. Alm disso, adicionar um novo campo, boto ou funcionalidade no sistema pode
comprometer o visual, trazer inconsistncias no cadastro ou causar redundncia de informaes.
Analisar detalhadamente as sugestes de clientes sempre ser uma atividade essencial durante o ciclo
de vida de um software.
Dicas para o desenvolvimento de um software Parte 5
Alguns leitores do blog me perguntaram sobre a continuao dos artigos
sobre boas prticas de desenvolvimento de software. Na verdade, a inteno
inicial era elaborar apenas quatro artigos sobre este assunto, mas logo notei que
no seriam suficientes para abranger todas as dicas. Agradeo a todos os leitores
que acompanharam e divulgaram essa srie de artigos, me motivando a escrever
os prximos. Bom, essa a quinta parte dessa srie, abordando mais algumas
prticas avanadas de desenvolvimento. Voil!

Liberao de objetos da memria

Quando um aplicativo iniciado, o sistema operacional se encarrega de alocar o espao necessrio na


memria para a sua execuo. Esse espao varivel, e depende da quantidade de recursos que o
aplicativo possui. Ao abrir uma tela do aplicativo, todos os campos de edio, botes e rtulos (labels)
so criados na memria em runtime (tempo de execuo), e permanessem nela at que sejam
liberados. O problema surge quando o desenvolvedor esquece ou deixa de liberar esses objetos,
acumulando recursos desnecessrios na memria do computador. Por exemplo, supe-se que
instanciamos um objeto chamado objCliente da classe Cliente na inicializao de um formulrio. Ao
terminar de manipul-lo, necessrio desaloc-lo da memria, j que ele no estar mais em uso. Caso
no o fizer, o objeto permanecer alocado na memria, muitas vezes sem o consenso do desenvolvedor.
E mais: na prxima vez que o formulrio for inicializado, uma nova instncia do objeto ser criada em
outro endereo de memria. Ento imagine: ao abrir o formulrio 10 vezes, teramos 10 objetos
objCliente criados, ao passo de que somente um seria necessrio. por isso que alguns usurios
reclamam que o aplicativo comea a ficar lento aps um tempo de uso.
Cada linguagem de programao tem uma forma distinta de liberar objetos da memria. No Delphi,
basta utilizar o comando FreeAndNil para essa finalidade:

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.

Triggers e Stored Procedures

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:

CREATE OR ALTER TRIGGER EXCLUIR_PEDIDO FOR PEDIDOS


ACTIVE BEFORE DELETE POSITION 0
AS
BEGIN
DELETE FROM ITENSPEDIDO WHERE NUMPEDIDO = OLD.NUMERO;
END

Busca por fonema

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.

Exibio dos dados na Grid

Quem j no visualizou uma Grid dessa forma?

Cortar informaes na Grid desconfortvel para o usurio, que normalmente precisa


redimensionar as colunas para visualizar todo o contedo. Porm, qual a melhor soluo quando h
vrias colunas para serem exibidas?
Na verdade, h 3 solues. A primeira fixar o tamanho das colunas em tempo de projeto, de
modo que todos os valores possveis da tabela sejam exibidos na ntegra. Em contrapartida, isso pode
gerar a necessidade de uma barra de rolagem horizontal para visualizar todas as colunas.
A segunda soluo criar uma funo que redimensione automaticamente as colunas em tempo de
execuo com base no maior valor de cada campo. Portanto, os tamanhos sero variveis conforme os
valores que forem exibidos na Grid. Assim como a soluo anterior, provavelmente ser necessrio
ativar a barra de rolagem horizontal tambm.

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.

Imagem de fundo da aplicao

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.

E sobre a questo de utilizar o ENTER ao invs do TAB?


Bem, eis que chegamos a mais um dilema entre programadores

Em minha opinio, o ENTER uma tecla de confirmao, e no de entrada de dados. Partindo


deste raciocnio, eu sempre configuro o ENTER para simular o clique de um boto, confirmar uma
mensagem ou selecionar um registro, enquanto o TAB avana entre os campos. Observe que a tecla TAB
j possui essa funcionalidade de modo tradicional, utilizada em vrios outros sistemas, como o prprio
Windows. Inclusive, para retroceder um campo, basta pressionar SHIFT + TAB, o que no possvel com
o ENTER. Alm disso, reflita: no campo de observaes em uma tela de cadastro, o ENTER dever pular a
linha ou avanar para o prximo campo? Bom, essa apenas minha opinio, ok?
Dicas para o desenvolvimento de um software Parte 7
Opa! Estou de volta com a stima parte sobre dicas de desenvolvimento
de software! Nesse artigo, continuo tratando de alguns pequenos ajustes no
software, mas que fazem diferena para o usurio. Afinal, ele quem convive
diariamente com o produto do nosso trabalho. Lembre-se de que um bom
desenvolvimento certamente garante uma boa satisfao.

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.

Formato da data e valores

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

Nos fruns de programao comum encontrar dvidas relacionadas gravao de imagens em


tabelas no banco de dados. Bom, antes de implementar essa funo no seu sistema, lembre-se de que
os dados binrios das imagens so extensos e podem sobrecarregar o banco de dados. Para
compreender melhor, acompanhe a prtica: imagine que voc tenha um cadastro de clientes que
permita associar uma foto do cliente ao registro. Em um dos cadastros, o usurio carrega uma imagem
no formato BMP de 2MB. Imagem grande, no ? Pois bem, ao grav-la no banco de dados, significa que
estes 2MB sero inseridos na tabela. Portanto, se o usurio repetir essa operao para os prximos 100
clientes, o banco de dados armazenar 200MB somente com as imagens! Alm de pesar o banco de
dados, isso pode afetar o tempo de retorno dos dados ao consultar o registro, j que o banco de dados
ir selecionar todo o conjunto binrio referente imagem e trazer para a aplicao. Considere tambm
que no caso de uma aplicao cliente/servidor, essa consulta pode ainda congestionar o trfego na
rede.

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.

O que voc sugere ento, infeliz?

Na verdade, eu j me deparei com a necessidade de armazenar imagens no banco de dados e


realmente fui infeliz, rsrs. A soluo que encontrei (na qual a soluo que muitos desenvolvedores
adotam) copiar a imagem para uma subpasta dentro do diretrio da aplicao. Por exemplo, pode-se
criar uma pasta chamada Imagens e ao carregar uma foto do cliente na aplicao, voc simplesmente
copia o arquivo para dentro dessa pasta ao invs de gravar a imagem no banco de dados. Para ler a
imagem ainda mais simples: basta carregar o arquivo que est na pasta!

Mas e se o arquivo j existir nessa pasta?

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';

// o nome da imagem de destino ser "00010.jpg"


ImagemDestino := 'C:\Aplicativo\Imagens\' + CodigoCliente + '.jpg';

CopyFile(PChar(ImagemOrigem), PChar(ImagemDestino), False);


end;

E por fim, para carregar:

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.

Apenas para efeito de conhecimento, este conjunto de procedimentos em um software est


intimamente ligado a conceitos na rea de negcios, como Business Intelligence, OLAP, ETL e Data
Warehouse. Vale a pena conhecer estes conceitos e a sua importncia no apoio tomada de deciso do
cliente.

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!

Como so telas diferentes, o usurio ter que:

Fechar a tela de cadastro de clientes;


Abrir a tela de cadastro de cidades;
Cadastrar a cidade;
Voltar na tela de clientes;
Preencher os dados novamente.
Chato, no?

Para simplificar este procedimento, procure integrar os cadastros, adicionando um boto


prximo ao campo para abrir a tela quando necessrio. No exemplo acima, adicionaramos um atalho
ao lado do campo Cidade, permitindo o cadastro de uma nova cidade sem necessariamente sair do
cadastro de clientes.

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.

Testes, testes a mais testes!

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.

J no mbito de empresas de desenvolvimento, h outras solues mais slidas:

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.

H vrios frameworks funcionais para apoiar desenvolvedores na criao de testes automatizados,


como o DUnit para Delphi e o JUnit para Java, assim como outras ferramentas especializadas, como o
TestComplete, TestLink e o Mantis.
Dicas para o desenvolvimento de um software Parte 9
Ol, leitores! Nos artigos anteriores sobre dicas de desenvolvimento,
foquei bastante em aspectos tcnicos, visuais e comportamentais de um
software. Neste artigo, vou abordar assuntos mais conceituais que fazem parte
da minha paixo por TI: Engenharia e Arquitetura de Software. A partir do
momento que tomei conhecimento e comecei a praticar os conceitos citados
neste artigo, notei uma grande diferena na minha produtividade.
Provavelmente estes conceitos no sero novidade para muitos, mas interessante deix-los
registrados aqui no SubRotina como parte dessa srie de artigos.

Design Patterns

Os Design Patterns, ou Padres de Projeto, como so conhecidos, so conceitos ou modelos


orientados a objetos visando solucionar problemas no desenvolvimento de softwares. Estes padres
possuem finalidades particulares que podem ser aplicadas para controlar a estrutura, a criao e o
comportamento das classes e dos objetos em uma aplicao. Dependendo da situao em que esses
projetos forem aplicados, possvel notar uma reduo considervel na complexidade do software em
virtude da reutilizao de cdigo-fonte e de componentes.

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

Um bom software deve proporcionar flexibilidade e facilidade de manuteno. So inmeros os


casos de softwares que foram desenvolvidos sem uma estrutura bem definida e, aps algum tempo,
apresentaram complicaes nas atividades de manuteno. Por conta disso, os padres de arquitetura
so modelos que surgiram para definir a estrutura do software visando no somente a facilidade da
manuteno, mas tambm outros aspectos, como a modularizao, desempenho, agilidade no build e a
diviso de responsabilidades em camadas.
S para efeito de conhecimento, j publiquei dois artigos aqui no SubRotina sobre o MVC
(Model-View-Controller), um dos padres de arquitetura disponveis no mercado no qual me identifiquei
bastante. Alm do MVC, h tambm outros padres populares, como o MVP (Model-View-Presenter) e o
MVVM (Model-View-View-Model). Apesar da diferena nas nomenclaturas, a ideia central desses trs
padres de arquitetura basicamente a mesma: separar a lgica e a apresentao dos dados em
camadas (ou nveis) diferentes. Enquanto a camada Model representa a modelagem dos dados (classes,
mtodos, persistncia), a camada View responsvel por exibir estes dados ao usurio. Por fim, a
camada intermediria, diferente para cada padro (Controller, Presenter ou View-Model), tem a funo
de gerenciar a comunicao entre a Model e a View.

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

Uma vez li a seguinte frase em um frum de programao:

Cdigo ruim no ruim, apenas mal compreendido.

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

Se voc tem conhecimento ou experincia com Programao Orientada a Objetos,


provavelmente j ouviu falar ou trabalhou com Interfaces. Na verdade, essa palavra tem uma
ambiguidade na rea de TI e pode confundir o profissional que trabalha com programao. A palavra
Interface pode ser usada para se referir ao visual de uma aplicao, um componente de hardware (por
exemplo, interface de rede), como tambm um recurso na Orientao a Objetos, no qual o objetivo
deste tpico.

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.

J sei, ficou complicado, no ? Vamos para um exemplo terico!


Suponha que criamos uma Interface e definimos duas assinaturas de mtodos que sero utilizados no
formulrio de clientes: DescontarValor e ValidarDocumento. Vale ressaltar que na Interface no h
implementao destes mtodos, apenas a assinatura. Pois bem, em seguida, criamos as classes
ClienteFisico e ClienteJuridico que implementam a Interface que acabamos de criar. Por conveno,
essas duas classes devem obrigatoriamente implementar os mtodos DescontarValor e
ValidarDocumento, j que elas possuem um contrato com a Interface. Porm, como as classes so
diferentes, a implementao destes mtodos ser diferente para cada uma delas. Para a pessoa fsica, o
desconto do valor ser de 2% e a validao do documento dever ocorrer pelo CPF da pessoa. Por outro
lado, para a pessoa jurdica, o desconto ser de 4% e a validao ir verificar a veracidade do CNPJ da
empresa. Mesmo que sejam finalidades diferentes, os nomes dos mtodos so os mesmos e a
implementao obrigatria. Se futuramente for necessrio incluir um novo mtodo na Interface,
como, por exemplo, VerificarCredito, este dever ser codificado em cada classe que implementa a
Interface. Bacana, no?

As vantagens de se utilizar Interfaces se resumem essencialmente na organizao e nivelamento


de classes, na reutilizao de componentes do software e na facilidade de manuteno (em virtude da
flexibilidade). O conceito de Interfaces utilizado com bastante frequncia na implementao de Design
Patterns e de padres de arquitetura, portanto, muito importante conhec-lo. Assim como disse em
outro artigo, estes conceitos esto estritamente ligados um ao outro, o que facilita a compreenso e
expande a linha de raciocnio para profissionais que trabalham com Orientao a Objetos.
Dicas para o desenvolvimento de um software Parte 10
Ol, leitores. Quando iniciei a elaborao dessa srie de artigos sobre
dicas de desenvolvimento de um software, a inteno, na verdade, era produzir
apenas quatro artigos. No entanto, com a sugesto de alguns leitores e com o
aprendizado do dia-a-dia, volto com a dcima parte dessa srie abordando mais
algumas recomendaes tcnicas. Here we go!

Alinhamento dos componentes da tela

Recentemente, recebi um e-mail de um desenvolvedor que encontrou problemas ao executar o


software em computadores com diferentes resolues. Segundo ele, quando a resoluo era mais alta,
os componentes ficavam todos bagunados na tela do usurio. Para que eu pudesse ajud-lo, ele
tambm me enviou um cdigo que realizava o redimensionamento automtico dos componentes da
tela conforme a resoluo do computador. Essa uma opo, mas, no meu ponto de vista, optar pelo
alinhamento melhor.

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.

Propriedades de alinhamento do Delphi

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:

A terceira consequncia envolve a soma da quantidade de caracteres. Talvez o desenvolver


queira calcular a quantidade de caracteres de um nome para inseri-lo adequadamente em um cupom
fiscal ou aplicar regras de abreviao. Mesmo no perceptvel aos nossos olhos, os espaos em branco
so contveis, rsrs.

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.

Nmero mximo de caracteres e intervalo numricos

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

Algumas vezes fui questionado sobre a finalidade de se utilizar constantes no cdigo-fonte. Em


uma delas, o desenvolvedor disse que sempre usou variveis, pois a nica diferena que as constantes
no permitem que o seu contedo seja alterado, e este no era o seu caso. Sim, ele est correto. Mas a
questo que as constantes tm um motivo por no aceitarem a alterao de valores, ou seja, serem
read only (somente leitura).

Considere um software desenvolvido para uma indstria de mveis. Ns sabemos que em


determinadas pocas do ano h uma variao do valor do IPI, certo? Tambm sabemos que o IPI
utilizado em vrios pontos do software, como pedidos, vendas, oramentos, clculo de preos e
margens de lucro. Para controlar isso, suponha que os desenvolvedores decidiram colocar o valor do IPI
manualmente em todos esses pontos do software da seguinte forma:

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;

E por qu no posso utilizar uma varivel? No seria a mesma coisa?

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!

S para efeito de conhecimento, comum encontrar constantes declaradas todas em


maisculas. Essa uma conveno utilizada normalmente por programadores Delphi.
Dicas para o desenvolvimento de um software Parte 11
Boa noite, pessoal! Aps algum tempo sem publicar novas dicas de
desenvolvimento, finalmente volto com a 11 parte dessa srie de artigos. Assim
como a maioria das publicaes anteriores, as dicas deste artigo envolvem
aspectos visuais do software e algumas recomendaes de praticidade. Sem
mais delongas, vamos ao que interessa!

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.

Em outras ocasies, tambm pode-se apresentar:

Total de registros encontrados em uma consulta;


Operao em andamento (insero, edio, consulta);
Informaes sobre o registro atual (situao, ltima compra/venda, estoque, etc);
Verso da aplicao;
Nome ou IP do usurio conectado.
Existem tambm alguns componentes de terceiros que permitem adicionar botes ou menus na
barra de status, facilitando o acesso funes relacionadas.

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!

Obrigado pela visita, leitores!

Você também pode gostar