dicas para o desenvolvimento de um software

40
Dicas para o desenvolvimento de um software – Parte 1 Postado por André Luis Celestino Publicado em Artigos , Desenvolvimento , Dicas Embora a internet esteja repleta de tutoriais e dicas sobre desenvolvimento, sempre surge a dúvida de como um sistema deve ser devidamente desenvolvido dentro de padrões. Na verdade, não há uma regra geral ou um processo único para o desenvolvimento de um sistema, mas existem boas práticas que, quando adotadas, podem trazer grandes vantagens em um software, tanto para o cliente quanto para o próprio desenvolvedor. Em muitas empresas de software, tais práticas são consideradas como uma metodologia de desenvolvimento, principalmente por facilitar a manutenção e atualização, além de garantir uma personalidade única para o sistema. Este é o primeiro de vários artigos sobre este assunto, onde o objetivo é transmitir um base sólida sobre alguns pontos importantes para o desenvolvimento de um software envolvendo a implementação do código e o visual da aplicação. Facilidade de uso Colocar vários botões e informações em excesso em uma janela pode comprometer a usabilidade da aplicação. Simplicidade e objetividade devem estar casados com a funcionalidade do sistema para proporcionar um maior “conforto” ao usuário. Procure simplificar o visual das janelas, adicionando somente os componentes necessários que o usuário de fato irá utilizar. Estruture a janela de forma que os campos fiquem em uma sequência objetiva, agrupados por assunto ou categoria. Em um cadastro de clientes, por exemplo, divida os campos por seções, como dados pessoais,

Upload: aureliano-duarte

Post on 30-Nov-2015

62 views

Category:

Documents


8 download

TRANSCRIPT

Page 1: Dicas Para o Desenvolvimento de Um Software

Dicas para o desenvolvimento de um software – Parte 1Postado por André Luis Celestino  Publicado em Artigos, Desenvolvimento, Dicas

Embora a internet esteja repleta de tutoriais e dicas sobre desenvolvimento, sempre surge a dúvida de como um sistema deve ser devidamente desenvolvido dentro de padrões. Na verdade, não há uma regra geral ou um processo único para o desenvolvimento de um sistema, mas existem boas práticas que, quando adotadas, podem trazer grandes vantagens em um software, tanto para o cliente quanto para o próprio desenvolvedor. Em muitas empresas de software, tais práticas são consideradas como uma metodologia de desenvolvimento, principalmente por facilitar a manutenção e atualização, além de garantir uma personalidade única para o sistema. Este é o primeiro de vários artigos sobre este assunto, onde o objetivo é transmitir um base sólida sobre alguns pontos importantes para o desenvolvimento de um software envolvendo a implementação do código e o visual da aplicação.

Facilidade de usoColocar vários botões e informações em excesso em uma janela pode comprometer a usabilidade da aplicação. Simplicidade e objetividade devem estar casados com a funcionalidade do sistema para proporcionar um maior “conforto” ao usuário. Procure simplificar o visual das janelas, adicionando somente os componentes necessários que o usuário de fato irá utilizar. Estruture a janela de forma que os campos fiquem em uma sequência objetiva, agrupados por assunto ou categoria. Em um cadastro de clientes, por exemplo, divida os campos por seções, como dados pessoais, dados profissionais, contato e informações adicionais. Assim a localização de informações fica bem mais fácil e evita que o usuário fique confuso em meio a tantos campos. Procure também organizar a ordem de tabulação, para que a digitação de dados se torne mais rápida através do TAB ou ENTER para avançar o cursor entre os campos.A questão do padrão visual das janelas deve ser discutida na fase inicial do projeto durante a análise de requisitos. Para garantir que o visual fique conforme a expectativa do usuário, os projetistas utilizam uma técnica conhecida como Prototipação, que consiste em elaborar uma prévia da tela desenhando-a em um documento. Este desenho é apresentado ao cliente para avaliação, e após a aprovação finalmente o visual passa a ser desenvolvido.

Splash ScreenDurante o desenvolvimento de um software, é natural que haja a necessidade de executar uma série de instruções e validações durante a inicialização do sistema, como

Page 2: Dicas Para o Desenvolvimento de Um Software

verificar o caminho do banco de dados, criar backups, carregar módulos e abrir tabelas. Essas instruções podem atrasar a inicialização e a exibição do sistema para o usuário. Consequentemente, o usuário pode pensar que o sistema não foi aberto e tentar abri-lo novamente, criando duas instâncias distintas do sistema na memória. Para evitar este problema, desenvolvedores criam telas de inicialização, também conhecidas como Splash Screen. Essa tela geralmente contém o nome do software e uma barra de progresso indicando o andamento da inicialização enquanto todas as instruções necessárias são executadas em segundo plano.

Splash Screen do NetBeans 7

 

BackupSem dúvidas, este item é indispensável! Manter cópias do banco de dados garante maior confiabilidade no sistema quando for necessário recuperar informações. Porém, de nada adianta criar backups no próprio computador do cliente quando existir a possibilidade do disco rígido local ser danificado. Neste caso, o banco de dados e todos os seus backups serão perdidos, ao menos que exista uma cópia em outro computador. Portanto, procure disponibilizar no sistema a opção para criar backups em locais remotos, como discos externos ou em outro computador na rede local. Outra opção bastante segura é salvar o backup em um diretório virtual na internet, popularmente conhecido como “nuvem”. Mesmo que aconteça uma falha geral na rede e nos dispositivos móveis do cliente, o backup estará armazenado na internet e poderá ser recuperado através de um simples download.

Page 3: Dicas Para o Desenvolvimento de Um Software

Exemplo de tela para backup

Embora este recurso esteja disponível, é provável que o usuário esqueça de salvar backups do banco de dados periodicamente. A solução é criar caixas de diálogo para avisá-lo do backup ou realizar a cópia silenciosamente, sem a intervenção do usuário. 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 aplicaçãoEste item não é obrigatório, mas com certeza é um diferencial importante em uma aplicação. Um visual agradável, com letras nítidas e cores leves gera comodidade para o usuário. A aplicação fica ainda mais rica quando dispõe de opções para personalização do visual, como aplicação de cores e temas. Atualmente é comum encontrar componentes na web com a finalidade de aperfeiçoar o visual de uma aplicação. Por exemplo, a interface Ribbon, presente nas versões 2007 e 2010 do pacote Microsoft Office, é uma das opções 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 também utilizar imagens bem definidas em menus e botões, de preferência no formato PNG. Na internet há dezenas de sites com pacotes de ícones e imagens para serem utilizadas em aplicações desktop e páginas web, como o Icon Archive. Utilize imagens sugestivas de acordo com a função e procure padronizá-las nas telas em comum. Por exemplo, atribua a mesma imagem para os botões de relatórios e a mesma imagem para os botões de Salvar, Alterar e Excluir, respectivamente. Essa prática permite que o usuário “associe” a imagem à funcionalidade do botão, minimizando a complexidade do sistema.

Page 4: Dicas Para o Desenvolvimento de Um Software

 

Bom, fico por aqui, pessoal!Um abraço!

Dicas para o desenvolvimento de um software – Parte 2Postado por André Luis Celestino  Publicado em Artigos, Desenvolvimento, Dicas

Em continuidade ao artigo anterior, esta segunda parte abrange mais algumas boas práticas para o desenvolvimento de um sistema com qualidade. Provavelmente a maioria dessas práticas já são adotadas pelos desenvolvedores, mas vale ressaltá-las aqui como conteúdo para base de conhecimento. Sintam-se à vontade para postar comentários ou críticas sobre o artigo!

Exportação de relatóriosCriar relatórios bem elaborados é fundamental, mas é importante que exista opções para exportá-lo em formatos tradicionais, caso o usuário queira salvá-lo no computador ou enviá-lo por e-mail. O formato PDF é um dos mais utilizados entre as opções de exportação, principalmente por ser um tipo de arquivo com tamanho pequeno e não permitir modificações após ser criado. A maioria dos componentes atuais para elaboração de relatórios já possuem métodos que permitem a exportação para os formatos mais comuns, mas caso esta opção não exista, basta utilizar o software CutePDF Writer, que adiciona uma impressora virtual no computador para criar arquivos PDF a partir da impressão de qualquer documento.

Exemplo de opções para exportação de relatórios

Page 5: Dicas Para o Desenvolvimento de Um Software

Exportar dados de uma tabela ou de uma grade de registros também pode ser de grande utilidade para o usuário, como uma tabela de preços 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 integração com aplicações externas também utilizadas pelo cliente.

Teclas de AtalhoQuando um menu é acessado com bastante frequência, pode ser interessante associar teclas de atalho para acessá-lo com mais agilidade. Quem utiliza o Microsoft Windows já deve conhecer algumas combinações de teclas disponíveis 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 também podem ser atribuídas a determinados eventos do sistema, como recalcular a soma de valores ou preencher um campo automaticamente. Usuários mais experientes geralmente preferem utilizar teclas de atalho ao invés de acessar as funções do sistema utilizando o mouse, principalmente por agilizar as operações rotineiras.

Exemplo de teclas de atalho em um menu

Porém, atribuir teclas de atalho em todos os menus e sub-menus no sistema é desnecessário, além de confundir a memória do usuário. Procure atribuí-las somente nas principais funções do sistema e utilizar combinações de teclas simples para facilitar a memorização.

UtilitáriosQuanto mais recursos úteis o sistema possuir, mais ele atenderá as necessidades eventuais do usuário. A ideia é incluir calendário, calculadora, campo de anotações e telas informativas dentro do sistema, para evitar que o usuário tenha que recorrer a outros aplicativos com essas funções. Uma boa prática é associar teclas de atalho globais à essas funcionalidades, como o F6 para Calculadora e F7 para Calendário, por exemplo.Outra utilidade importante é permitir que o usuário configure o sistema conforme o seu perfil, ou seja, o sistema pode apresentar uma tela de configuração e armazenar as preferências do usuário em um arquivo do tipo “INI”. Todas as vezes que o sistema for inicializado, as preferências contidas neste arquivo são carregadas e aplicadas ao sistema. O arquivo de configuração pode conter o diretório do banco de dados, ordenação padrão dos registros de uma tabela, agendamento de backup e outras configurações internas do sistema.

Page 6: Dicas Para o Desenvolvimento de Um Software

Este arquivo se torna ainda mais útil quando existe mais de um usuário utilizando o sistema e cada um possui preferências diferentes. Assim, não é preciso criar uma versão exclusiva para cada usuário, basta apenas guardar as configurações em um arquivo INI.Aqui no SubRotina há um artigo sobre como trabalhar com arquivos INI pelo Delphi.

Exemplo de configurações em um arquivo INI

Threads e telas de esperaAlgumas operações do sistema podem demorar um certo tempo para serem processadas, principalmente instruções SQL complexas que envolvam cálculos ou consultas em tabelas com vários registros. Quando isso ocorre, normalmente o sistema “congela” ou pára de responder durante o processamento até que a operação seja finalizada. Porém, o usuário pode imaginar que a aplicação parou de funcionar e forçar o encerramento do processo, comprometendo a instrução em execução.Para evitar este tipo de transtorno, é conveniente criar telas de espera para informar o usuário de que um processamento está em execução. 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 instrução SQL compartilham o mesmo processo na memória, é provável que a aplicação fique travada da mesma forma, sem resposta. A solução é implementar unidades chamadas Threads, capazes de criar fluxos paralelos ao processo principal para executar uma operação em segundo plano. Basta então exibir uma tela de espera e transferir o processamento (como uma instrução SQL) dentro de uma Thread para que o sistema não se torne instável.A verificação automática de ortografia no Microsoft Word é um exemplo de Thread. Repare que o programa não trava enquanto a verificação é realizada paraa cada palavra digitada. No Microsoft Outlook, observe também que é possível utilizar normalmente o software ao mesmo tempo que novos e-mails são baixados na caixa de entrada. Portanto, Threads não servem apenas para desenvolver telas de espera, mas sempre quando for necessário executar instruções em paralelo sem afetar o desempenho do sistema. A figura abaixo (em inglês) apresenta uma breve demonstração de como as Threads se comportam dentro de um processo:

Page 7: Dicas Para o Desenvolvimento de Um Software

Ilustração do funcionamento de uma Thread

 

Bom, as próximas dicas ficam para outro artigo!Muito obrigado pela leitura. Até a próxima!

Dicas para o desenvolvimento de um software – Parte 3Postado por André Luis Celestino  Publicado em Artigos, Desenvolvimento, Dicas

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 opinião sobre este texto.

Padronização de códigoEste item é bastante importante quando o projeto é desenvolvido por mais de uma pessoa, ou melhor, por uma equipe de desenvolvimento. Definir uma padronização do código auxilia na legibilidade e na compreensão do que está sendo executado na aplicação. Identar o código nos blocos de condição if-else e nos laços de repetição são uma das práticas que ajudam os desenvolvedores a identificar facilmente a execução de um método. Identação significa “estruturar” as linhas do código em tabulações de

Page 8: Dicas Para o Desenvolvimento de Um Software

acordo com o nível da instrução. A figura abaixo exemplifica um código bem identado utilizando a linguagem C++:

Exemplo de identação de código

Quando há uma grande quantidade de aninhamento de blocos no código-fonte, a identação se torna ainda mais importante para associar o início 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 também podem adquirir essa funcionalidade com os addons cnPack ou GExperts, ambos gratuitos.As variáveis, classes, objetos e métodos também devem possuir nomes sugestivos de acordo com o seu objetivo. Portanto, uma variável com o nome “SomaTotalPedidos” é bem mais fácil de ser assimilada do que uma variável chamada “vSTotPed”. O código fica mais legível quando se trabalha com esse tipo de nomenclatura, mesmo que o nome fique ligeiramente maior.

Tratamento de exceções

Por mais que o desenvolvedor faça testes na aplicação antes de liberar a versão, é natural que alguns erros ainda possam ocorrer inesperadamente para o usuário. Estes erros são decorrentes de problemas de semântica, gravação de dados inconsistentes, falhas de acesso à memória ou até mesmo eventos inesperados do sistema operacional. No ambiente de programação, os erros são conhecidos tecnicamente como exceções. Uma boa prática de programação exige que exista um tratamento de exceções em todos os pontos mais sensíveis do código. Inserções e atualizações no banco de dados são exemplos de operações que possivelmente podem retornar algum erro para o usuário. A recomendação é envolver este código em um bloco de tratamento de exceção e executar uma operação de rollback (desfazer as alterações no banco de dados) caso algum erro seja encontrado. Ao utilizar tratamento de exceções, também é possível criar mensagens mais significativas para reportar a exceção ao usuário. Dessa forma, faz mais sentido exibir a mensagem “Ocorreu um

Page 9: Dicas Para o Desenvolvimento de Um Software

erro. Verifique os dados.” ao invés de “An error occurred. Access violation at address 004068EC.”. Estes tipos de mensagens em inglês técnico geralmente são desconhecidas para o usuário e não trazem nenhum tipo de informação para auxiliá-lo.

Atualização do sistemaA cada atualização do sistema, normalmente é necessário substituir o executável no computador do cliente, rodar scripts SQL e alterar parâmetros de configuração. Sendo assim, é preciso ir até o cliente e fazer todo o processo manualmente no computador local. Para evitar a viagem, uma alternativa é realizar a atualização remotamente através de softwares como o TeamViewer, LogMeIn ou VNC. Porém, é bastante inconveniente quando há dezenas ou até centenas de computadores para serem atualizados. Se a atualização for feita em um computador por vez, pode demorar dias para terminar a atualização em todos as máquinas.Portanto, ao invés de realizar a atualização manualmente, crie um módulo exclusivo para automatizar este processo. O objetivo é permitir que o próprio sistema verifique novas versões, baixe o arquivo de atualização e realize todo o processo automaticamente, sem a intervenção do usuário. Observe que a atualização automática está presente na maioria dos softwares atuais, como navegadores e antivírus. Este tipo de módulo não é simples de ser desenvolvido, mas é plenamente funcional e reduz o trabalho de atualizar vários computadores simultaneamente.

Exemplo de tela de atualização

Programação Orientada a ObjetosNo mundo da programação, a maioria dos métodos e componentes são modelados em classes para proporcionar a reutilização de código e a manipulação de objetos. A princípio, trabalhar com classes e objetos pode ser relativamente complexo, mas sem dúvida garante maior controle de tudo o que acontece dentro da aplicação. Através da Programação Orientada a Objetos (POO), é possível reaproveitar ou reduzir várias linhas de código por meio de técnicas como abstração, herança e polimorfismo. Além disso, definir a visibilidade dos atributos de uma classe e criar métodos privados para manipulação de valores permitem que a estrutura interna da aplicação não seja exposta a outros níveis. Há muito o que se falar sobre Programação Orientada a Objetos, visto que o seu conceito é bem abrangente diante do ponto de vista da Engenharia de Software.

Page 10: Dicas Para o Desenvolvimento de Um Software

Principais elementos da P.O.O.

Durante a fase de projeto, a Programação Orientada a Objetos é amplamente praticada por projetistas e analistas de sistemas através da linguagem UML para modelagem de dados. O Diagrama de Classes, por exemplo, fornece um grande detalhamento de informações para simplificar a modelagem das classes e das tabelas do banco de dados. Em conclusão, pode-se dizer que a utilização da POO evita que o sistema sofra consideráveis alterações e adaptações após a implantação, reduzindo o tempo de desenvolvimento e minimizando os erros de implementação.

 Muito obrigado mais uma vez pela leitura!Um abraço a todos!

Dicas para o desenvolvimento de um software – Parte 4Postado por André Luis Celestino  Publicado em Artigos, Desenvolvimento, Dicas

O quarto artigo sobre dicas para desenvolver um software funcional abrange alguns conceitos ligeiramente mais avançados. Após as doze dicas abordadas nos três primeiros artigos, este envolve aspectos relacionados ao aperfeiçoamento das funcionalidades de um sistema. Agradeço novamente a todos os leitores que estão acompanhando os artigos, e espero que de alguma forma essas dicas tenham agregado um pouco mais de conhecimento.

Page 11: Dicas Para o Desenvolvimento de Um Software

Normalização de dados

Na maioria dos cursos relacionados a desenvolvimento de sistemas, é comum encontrar uma disciplina que mencione a Normalização de Dados, fundamental para a formação de analistas e programadores. Este assunto sugere uma série de procedimentos aplicados à modelagem de dados para garantir a boa estruturação de um banco de dados. Essa modelagem é responsável pela integridade, confiabilidade e desempenho das operações realizadas nas tabelas. Alguns dos pontos mais importantes abordados pela normalização de dados envolve a utilização imprescindível de chaves primárias, chaves estrangeiras, criação de tabelas intermediárias para relacionamentos muitos-para-muitos (N:N) e criação de tabelas para campos multivalorados, como e-mails e telefones. Além de ser uma prática essencial para o projeto de um sistema, a normalização de dados também garante a motivação dos relacionamentos entre as tabelas e facilita futuras manutenções na estrutura.A modelagem do banco de dados de um sistema devem passar basicamente por três formas normais da normalização 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 compostasBoa parte dos sistemas atuais possuem uma padronização 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á situações em que pode ser necessário consultar clientes por endereço, telefone, estado, profissão ou estado civil. Ok, basta então adicionar estes campos às opções de consulta, correto? Bem, é uma alternativa, mas imagine que o usuário também queira pesquisar os clientes que moram no estado de São Paulo, são do sexo masculino e também trabalhem como motorista. Neste caso, a solução é criar uma consulta composta, que consiste em uma busca por vários 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 usuário pode preencher quaisquer campos por quais deseja consultar, e ao clicar no botão 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 cláusulas where e and, e confira se a busca realmente corresponde ao que foi solicitado pelo usuário.

Page 12: Dicas Para o Desenvolvimento de Um Software

Exemplo de SQL Composta

 

Integração com serviços webCom o crescimento da internet e de recursos online, tornou-se comum a integração de sistemas desktop com serviços web para facilitar ou agilizar operações. Um exemplo bem prático é o envio de arquivos de Nota Fiscal Eletrônica. Nos primórdios de sua utilização, os usuários 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 usuários. Felizmente, a integração dos sistemas desktop com os chamados WebServices possibilitou que este procedimento fosse realizado diretamente pela aplicação principal, sem a intervenção do usuário para manipular os arquivos XML. Além deste exemplo, outros serviços web também podem ser agregados à aplicação, como consulta de endereços por CEP, mapas de localização (Google Maps), feed de notícias e outros tipos de informações online. Os desenvolvedores podem ainda disponibilizar um módulo do sistema na web interligado com o sistema desktop, permitindo, por exemplo, que os usuários 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 integração com WebService (Clique para ampliar)Fonte: http://www.consultacpf.com/integracao.aspx

 Cuidado com o que o seu cliente pedeHá muito que ser abordado neste último item, por tratar-se de uma questão mais voltada para análise do que desenvolvimento. Normalmente, os usuários que operam o sistema no dia-a-dia sentem necessidade de novos campos nas telas, botões para novas funcionalidades ou atalhos para agilizar as operações. É muito comum ouvirmos frases como:

“Há possibilidade de colocar um ‘botãozinho’ aqui?”“Eu precisava de um campo aqui para digitar tal informação…”“Preciso de uma tela nesse menu pra ficar mais fácil…”

Page 13: Dicas Para o Desenvolvimento de Um Software

É claro, bons analistas e desenvolvedores devem prestar o máximo de suporte, visando suprir qualquer necessidade do cliente. Mas há casos em que é preciso rejeitar a sugestão 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 inclusão, e se este também será útil para outros clientes que operam o mesmo sistema. É possível também que o campo já exista, mas não é de conhecimento do usuário. Neste ponto vale ressaltar a importância dos treinamentos do sistema para os usuários, além da capacitação da equipe de suporte para identificar esse tipo de situação. Uma simples orientação fornecida ao cliente pode evitar que a equipe de desenvolvimento adicione uma nova funcionalidade sem objetivo algum. Além disso, adicionar um novo campo, botão ou funcionalidade no sistema pode comprometer o visual, trazer inconsistências no cadastro ou causar redundância de informações. Analisar detalhadamente as sugestões de clientes sempre será uma atividade essencial durante o ciclo de vida de um software.

 

Obrigado novamente pela atenção, leitores!Até breve!

Dicas para o desenvolvimento de um software – Parte 5Postado por André Luis Celestino  Publicado em Artigos, Desenvolvimento, Dicas

Alguns leitores do blog me perguntaram sobre a continuação dos artigos sobre boas práticas de desenvolvimento de software. Na verdade, a intenção inicial era elaborar apenas quatro artigos sobre este assunto, mas logo notei que não seriam suficientes para abranger todas as dicas. Agradeço a todos os leitores que acompanharam e divulgaram essa série de artigos, me motivando a escrever os próximos.Bom, essa é a quinta parte dessa série, abordando mais algumas práticas avançadas de desenvolvimento. Voilá!

Page 14: Dicas Para o Desenvolvimento de Um Software

Liberação de objetos da memóriaQuando um aplicativo é iniciado, o sistema operacional se encarrega de alocar o espaço necessário na memória para a sua execução. Esse espaço é variável, e depende da quantidade de recursos que o aplicativo possui. Ao abrir uma tela do aplicativo, todos os campos de edição, botões e rótulos (labels) são criados na memória em runtime (tempo de execução), e permanessem nela até que sejam liberados. O problema surge quando o desenvolvedor esquece ou deixa de liberar esses objetos, acumulando recursos desnecessários na memória do computador. Por exemplo, supõe-se que instanciamos um objeto chamado “objCliente” da classe Cliente na inicialização de um formulário. Ao terminar de manipulá-lo, é necessário desalocá-lo da memória, já que ele não estará mais em uso. Caso não o fizer, o objeto permanecerá alocado na memória, muitas vezes sem o consenso do desenvolvedor. E mais: na próxima vez que o formulário for inicializado, uma nova instância do objeto será criada em outro endereço de memória. Então imagine: ao abrir o formulário 10 vezes, teríamos 10 objetos “objCliente” criados, ao passo de que somente um seria necessário. É por isso que alguns usuários reclamam que o aplicativo começa a ficar lento após um tempo de uso.Cada linguagem de programação tem uma forma distinta de liberar objetos da memória. No Delphi, basta utilizar o comando FreeAndNil para essa finalidade:

var objeto: TClasse;begin objeto := TClasse.Create; try // operações com o objeto finally FreeAndNil(objeto); // libera o objeto da memória end;end;

 

Criação de componentesSe o seu objetivo é reduzir código e padronizar a aplicação, criar componentes é uma ótima prática. Suponha que em determinado projeto decidimos modificar os campos de texto da seguinte forma:- ao receber o foco, ele mudar de cor- o campo não pode possuir conteúdo em branco- ao sair do campo, se o valor for uma data, a aplicação deve validá-la

Para que essas funcionalidades tenham efeito, é necessário codificar cada campo de texto em toda a aplicação, não é? Oras, por quê não criar um componente com essas características? Dessa forma, utilizaríamos esse componente ao invés do campo de texto nativo da ferramenta e não precisaríamos codificar cada um deles, já que as funcionalidades estariam implícitas no componente criado. Além disso, se futuramente for necessário adicionar uma característica (por exemplo, trocar a fonte de texto), basta modificar o componente e a alteração será refletida em todos as instâncias do componente inseridas na aplicação.Quando o desenvolvedor cria vários componentes personalizados, pode-ser dizer que ele está definindo um Framework de desenvolvimento.

Page 15: Dicas Para o Desenvolvimento de Um Software

 

Triggers e Stored Procedures

Implementar algumas regras de negócio no banco de dados pode trazer grandes vantagens para a aplicação, tanto no sentido de automação de operações 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 aplicação Cliente/Servidor ou Multicamadas, criar Triggers e Stored Procedures no banco de dados evita que várias chamadas sejam feitas ao servidor. Imagine que, ao excluir um pedido, seja necessário também excluir os itens do pedido (no sentido master/detail). Pela aplicação, faríamos duas solicitações ao banco de dados: uma para excluir os itens e outra pra excluir o pedido em questão, certo? Pois bem, se centralizarmos essa operação em uma Trigger no banco de dados, apenas uma solicitação será feita, ou seja, a Trigger se encarregará de excluir os itens antes de excluir o pedido, tornando-se um processo automatizado. Para aplicações de pequeno porte pode não surtir tanta diferença, mas em uma aplicação com vários usuários conectados simultaneamente a vantagem é notável, inclusive pelo motivo de redução de tráfego na rede.Só para efeito de conhecimento, segue o exemplo da criação de uma Trigger no Firebird:

CREATE OR ALTER TRIGGER EXCLUIR_PEDIDO FOR PEDIDOSACTIVE BEFORE DELETE POSITION 0ASBEGIN DELETE FROM ITENSPEDIDO WHERE NUMPEDIDO = OLD.NUMERO;END

 

Busca por fonema

Essa dica é bem interessante, embora a implementação 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 língua 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 vários clientes cadastrados, e três deles tenham o nome de Érica, Erica e Érika, respectivamente. Ao atender a ligação de uma dessas clientes, o

Page 16: Dicas Para o Desenvolvimento de Um Software

usuário 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. Porém, a cliente que ligou é a Érika (com acento e com “k”)! Já que o resultado não apareceu na busca, o usuário irá informar que ela não 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 três 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 implementação é complexa e portanto leva muitos desenvolvedores a procurarem por soluções já codificadas.

 

Por enquanto é isso, pessoal!Obrigado mais uma vez pela visita!

Dicas para o desenvolvimento de um software – Parte 6Postado por André Luis Celestino  Publicado em Artigos, Desenvolvimento, Dicas

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 básicos em comparação com as outras partes dessa série de artigos. As quatro dicas a seguir envolvem características visuais, mas que não deixam de ser importantes na usabilidade do software. Confira também as outras partes dessa série no final deste artigo!

 

Dicas de telaAs dicas de tela, também conhecidas como Hints, são textos que aparecem quando você posiciona o cursor do mouse em um componente da tela, como um campo ou botão. Esses textos trazem uma breve definição da função do componente, extremamente útil para barras de ferramentas que possuem apenas imagens nos botões.

Page 17: Dicas Para o Desenvolvimento de Um Software

O problema é que às vezes esses hints não estão disponíveis. Eu já fui vítima de colocar o cursor em um botão 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 usuário execute uma operação incorreta ou entre em contato com o suporte para questionar sobre a funcionalidade.

Exibição dos dados na GridQuem já não visualizou uma Grid dessa forma?

Cortar informações na Grid é desconfortável para o usuário, que normalmente precisa redimensionar as colunas para visualizar todo o conteúdo. Porém, qual é a melhor solução quando há várias colunas para serem exibidas?Na verdade, há 3 soluções. A primeira é fixar o tamanho das colunas em tempo de projeto, de modo que todos os valores possíveis 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 solução é criar uma função que redimensione automaticamente as colunas em tempo de execução com base no maior valor de cada campo. Portanto, os tamanhos serão variáveis conforme os valores que forem exibidos na Grid. Assim como a solução anterior, provavelmente será necessário ativar a barra de rolagem horizontal também.Enfim, a terceira solução, que em minha opinião é bem interessante, consiste em dividir o formulário em duas abas: uma que exiba a Grid somente com as colunas que identifiquem o registro (como código e nome, por exemplo) e ao clicar no registro, todos os dados são carregados em campos de texto na outra aba. Em outras palavras, em uma aba o usuário navega entre os registros e na outra aba ele visualiza os dados do registro selecionado.

Imagem de fundo da aplicaçãoSó para fazer um teste, crie um papel de parede verde fluorescente e coloque como imagem de fundo na sua aplicação. Eu aposto que em dois dias a maioria dos usuários irão marcar uma consulta com o oftalmologista, rsrs. Para os desenvolvedores que eventualmente rodam a aplicação pode não parecer tão cansativo, mas, para os usuários que convivem com o sistema praticamente o dia todo, é desagradável.A dica é utilizar cores leves dispensando gráficos avançados, talvez apenas com o nome do sistema bem pequeno no canto da imagem.

Page 18: Dicas Para o Desenvolvimento de Um Software

Outra dica é manter a imagem de fundo dinâmica, ou seja, permitir que o próprio usuário selecione um arquivo no computador, assim como acontece com o papel de parede do Windows.

Ordem de tabulação

No primeiro artigo, mencionei a importância da ordem de tabulação dos campos no tópico sobre facilidade de uso. Imagine que o usuário está no primeiro campo de uma tela e ao pressionar TAB o foco vai para o último? Ruim, não é? Neste caso, nem é possível “adivinhar” a ordem – infelizmente a solução é utilizar o mouse. Bom, eu mesmo devo assumir que muitas vezes já esqueci de ajustar a ordem de tabulação dos campos, rsrs. Portanto, aqui eu reforço essa dica: a tabulação deve ocorrer de cima para baixo sem pular campos, ao menos que estejam desabilitados ou sejam read-only.

E sobre a questão de utilizar o ENTER ao invés do TAB?Bem, eis que chegamos a mais um dilema entre programadores…

Em minha opinião, o ENTER é uma tecla de confirmação, e não de entrada de dados. Partindo deste raciocínio, eu sempre configuro o ENTER para simular o clique de um botão, confirmar uma mensagem ou selecionar um registro, enquanto o TAB avança entre os campos. Observe que a tecla TAB já possui essa funcionalidade de modo tradicional, utilizada em vários outros sistemas, como o próprio Windows. Inclusive, para retroceder um campo, basta pressionar SHIFT + TAB, o que não é possível com o ENTER. Além disso, reflita: no campo de observações em uma tela de cadastro, o ENTER deverá pular a linha ou avançar para o próximo campo?Bom, essa é apenas minha opinião, ok?

 

Pessoal, obrigado pela atenção!Grande abraço a todos!

Dicas para o desenvolvimento de um software – Parte 7Postado por André Luis Celestino  Publicado em Artigos, Desenvolvimento, Dicas

Page 19: Dicas Para o Desenvolvimento de Um Software

Opa! Estou de volta com a sétima parte sobre dicas de desenvolvimento de software! Nesse artigo, continuo tratando de alguns pequenos “ajustes” no software, mas que fazem diferença para o usuário. Afinal, é ele quem convive diariamente com o produto do nosso trabalho. Lembre-se de que um bom desenvolvimento certamente garante uma boa satisfação.

 

Submenus infinitosImagine que o usuário tenha que acessar 5 submenus para emitir um relatório?

Até ele chegar no último submenu já acabou o expediente, rsrs.Recomenda-se que um menu tenha, no máximo, 2 submenus. Mais do que isso pode atrapalhar o acesso à tela ou funcionalidade, além de confundir as opções em meio a tantos itens. É comum encontrar também submenus desnecessários, como a seleção da impressora para imprimir um relatório. No meu ponto de vista, essa opção pode ser adequadamente incluída na própria tela de visualização do relatório ou no diálogo de impressão.Uma alternativa é criar uma barra de ferramentas com botões de acesso para as telas mais utilizadas, evitando que o usuário tenha que percorrer vários submenus para abri-las. Se essa barra de ferramentas for personalizável é ainda melhor, ou seja, o próprio usuário poderá escolher os botões que ficarão na barra. É muito útil para sistemas que integram dois ou mais departamentos de uma empresa, já que em cada departamento as telas acessadas com mais frequência são diferentes.Assim como comentei na primeira parte dessa série de artigos, alguns softwares mais modernos apresentam menus do tipo Ribbon, parecidos com as versões mais recentes do Microsoft Office. Esse tipo de menu, por possuir abas e botões de opção, podem facilmente substituir os menus tradicionais de um sistema.

 

Formato da data e valoresEssa é clássica! Há muitos softwares por aí que exibem datas no formato americano (mês/dia/ano) e confundem a cabeça do pobre cidadão. Quando o usuário encontra a data “12/15/2013″, além 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

Page 20: Dicas Para o Desenvolvimento de Um Software

“03/06/2013″ ser exibido como “06/03/2013″. Embora esteja errada, o usuário pode interpretá-la como o dia 06 de março. Se o sistema trabalhar com históricos, movimentações ou agendamentos, essas datas podem trazer sérios problemas!Isso também vale para formatos de valores monetários. Procure sempre manter o ponto como separador de milhares e a vírgula como separador decimal. Caso o banco de dados exija que o armazenamento seja no formato americano, cabe ao software realizar a conversão necessária para gravar e exibir corretamente os valores.No Delphi, pode-se adicionar as linhas abaixo no arquivo DPROJ (ou DPR, nas versões antigas) para garantir essa padronização 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 são irônicas, mas na realidade alguns sistemas parecem fazer uma entrevista com o usuário: para qualquer operação existe uma tela de confirmação, até para as operações mais rotineiras. Mensagens são necessárias sim, mas não em excesso. Há operações que são óbvias, e não precisam ter uma mensagem de informação ou confirmação para serem realizadas. É claro que isso não irá afetar o desempenho do software, mas já me deparei com muitos usuários que solicitaram a remoção de algumas mensagens pelo motivo de atrapalhar a usabilidade.Se a intenção é exibir uma mensagem informativa, considere exibi-la no formulário de forma estática, utilizando uma Label, por exemplo. Mensagens de validação também podem ser substituídas por balões com hints (hint balloons), que, além de não exigir interação do usuário (para pressionar o OK), também são bem modernos.

Page 21: Dicas Para o Desenvolvimento de Um Software

Só pra complementar, já trabalhei com sistemas que não mostram nenhuma mensagem ao gravar um registro, apenas limpam os campos para a inserção de novos dados. Se for uma tela que permite inserções sucessivas, essa prática pode ser bem adequada. Basta orientar o usuário de que, se o sistema “limpar” o conteúdo dos campos ao gravar o registro, significa que ele foi gravado com sucesso.

 

Gravação de imagens no banco de dados

Nos fóruns de programação é comum encontrar dúvidas relacionadas à gravação de imagens em tabelas no banco de dados. Bom, antes de implementar essa função no seu sistema, lembre-se de que os dados binários das imagens são extensos e podem sobrecarregar o banco de dados. Para compreender melhor, acompanhe a prática: imagine que você tenha um cadastro de clientes que permita associar uma foto do cliente ao registro. Em um dos cadastros, o usuário carrega uma imagem no formato BMP de 2MB. Imagem grande, não é? Pois bem, ao gravá-la no banco de dados, significa que estes 2MB serão inseridos na tabela. Portanto, se o usuário repetir essa operação para os próximos 100 clientes, o banco de dados armazenará 200MB só por causa das imagens! Além 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 binário referente à imagem e trazer para a aplicação. Considere também que no caso de uma aplicação cliente/servidor, essa consulta pode ainda congestionar o tráfego na rede.

Oras, basta controlar o tamanho da imagem a ser carregada, como por exemplo, somente imagens JPG de tamanho menor que 50KB!Certo, essa é uma alternativa, mas mesmo assim ainda tenho três argumentos:1) Não deixa de ser uma imagem, então 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 código específico tanto para a gravação quanto para a leitura da imagem; 3) E o mais impactante: o usuário terá que utilizar um aplicativo externo para redimensionar e converter a imagem para que atenda os requisitos da sua aplicação. Para muitos, isso pode se tornar entendiante.

O que você sugere então, infeliz?Na verdade, eu já me deparei com a necessidade de armazenar imagens no banco de dados e realmente fui infeliz, rsrs. A solução que encontrei (na qual é a solução que

Page 22: Dicas Para o Desenvolvimento de Um Software

muitos desenvolvedores adotam) é copiar a imagem para uma subpasta dentro do diretório da aplicação. Por exemplo, pode-se criar uma pasta chamada “Imagens” e ao carregar uma foto do cliente na aplicação, você simplesmente copia o arquivo para dentro dessa pasta ao invés 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 cópia, você pode renomear o arquivo conforme algum dado que identifique o cliente, como o próprio código. Por exemplo, no cadastro do cliente nº 10, o usuário irá carregar o arquivo “Andre.jpg” na aplicação, mas este arquivo será salvo como “00010.jpg” dentro da pasta de imagens. Bom, então já deu pra perceber que pra fazer a leitura será bem fácil, não é? Basta carregar a imagem que tenha o nome igual ao código do cliente selecionado.No Delphi, é possível 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');

 

Pessoal, caso queiram sugerir ideias ou discutir algo, deixe um comentário ou entre em contato.Obrigado novamente!

Dicas para o desenvolvimento de um software – Parte 8Postado por André Luis Celestino Publicado em Artigos, Desenvolvimento, Dicas

Page 23: Dicas Para o Desenvolvimento de Um Software

A qualidade de software sempre foi um tema imensamente discutido na área profissional e acadêmica, além de ser um dos maiores focos das empresas de desenvolvimento. Leitores, convido-os a conferir o oitavo artigo da série sobre dicas para desenvolvimento de um software, no qual destaco mais quatro tópicos relevantes sobre o assunto. Aproveitando, gostaria também de agradecer os feedbacks!

 

EstatísticasEmbora o software seja importante para armazenar informações, é interessante que ele também possua boas rotinas de mineração de dados (Data Mining) para compor estatísticas e apresentar dados históricos. Essas funcionalidades são bastante apreciadas pelos stakeholders principalmente por contribuir para a definição de estratégias de negócio da empresa. Entre essas informações, podemos apresentar os clientes potenciais, produtos emergentes, cálculo de variações e faturamento por período, além de gráficos e relatórios bem elaborados. Bons profissionais ressaltam que um software deve trazer valor agregado ao negócio do cliente, e não apenas servir como um contêiner de informações. Portanto, programe o seu software para ser capaz de transformar os dados armazenados em informações estratégicas para o negócio.Mas vale ressaltar: para que isso seja possível, o banco de dados deve estar bem modelado e com relacionamentos corretamente definidos. Caso contrário, os dados levarão uma eternidade para serem compostos e exibidos, ou, no pior dos casos, não será possível 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 negócios, como Business Intelligence, OLAP, ETL e Data Warehouse. Vale a pena conhecer estes conceitos e a sua importância no apoio à tomada de decisão do cliente.

 

Formulários integradosVamos supor que, após aplicar a normalização de dados, você criou um cadastro de cidades no software com o objetivo de registrar as cidades utilizadas por outras tabelas, como clientes, fornecedores e funcionários. Assim sendo, no cadastro de clientes, por exemplo, haverá uma lista de opções (combobox) para que o usuário selecione a cidade do cliente, correto?Pois bem, imagine que o usuário está preenchendo os dados de um novo cliente e ao selecionar a cidade… ops, a cidade não está cadastrada!Como são telas diferentes, o usuário terá que:

Fechar a tela de cadastro de clientes; Abrir a tela de cadastro de cidades; Cadastrar a cidade; Voltar na tela de clientes;

Page 24: Dicas Para o Desenvolvimento de Um Software

Preencher os dados novamente.

Chato, não?Para simplificar este procedimento, procure “integrar” os cadastros, adicionando um botão próximo ao campo para abrir a tela quando necessário. No exemplo acima, adicionaríamos 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 opção na própria combobox, conforme a imagem abaixo:

Porém, atente-se que se houver muitas cidades cadastradas pode não ser viável exibi-las em uma lista de opções, já que, além da demora para carregar todas as cidades na lista, levaria um tempo para o usuário encontrar a cidade desejada. Uma alternativa é abrir uma tela de pesquisa ao invés de utilizar uma lista, de modo que o usuário possa procurar a cidade diretamente pelo nome. Essa opção fica ainda mais interessante quando há uma tecla de atalho para abrir a tela de pesquisa, como uma das teclas de função (F1 a F12).É claro, essa dica vale para qualquer situação que envolva relacionamento entre tabelas.

 

ValidaçõesUma validação é a função de evitar que um dado inválido, inconsistente ou incorreto seja processado ou gravado no banco de dados. Considere a validação como um firewall que analisa os dados digitados pelo usuário: se alguma informação não estiver condizente com os padrões ou regras do sistema, então não é processada. Quanto mais validações você programar no software, maior será o nível de confiabilidade.

Para exemplificar, imagine uma regra de negócio que envolva períodos de vigência sobre um determinado requisito funcional. O período de vigência

Page 25: Dicas Para o Desenvolvimento de Um Software

exige que a data de início de um registro deve ser imediatamente a sequência da data de término do registro anterior. Por exemplo, se a data de término for 20/07/2013, a data de início do registro seguinte deve ser 21/07/2013. Além disso, não é permitida a sobreposição de datas, ou seja, dois registros diferentes não podem compreender o mesmo período. Para controlar a complexidade dessa regra de negócio, é imprescindível que haja uma validação de datas a cada novo registro inserido, evitando que períodos incorretos sejam armazenados na tabela. A validação terá que comparar as datas para encontrar possíveis sobreposições e identificar “furos” entre vigências de dois registros consecutivos. Tradicionalmente, a implementação pode ser uma função que retorne um valor booleano como resultado dessas verificações.Validações geralmente são realizadas antes da inserção do registro de modo que, se os dados não estiverem corretos, a aplicação cancele a operação em transação e permita que o usuário corrija os dados. Porém, existem ainda outras validações 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 números. E volto a repetir: quanto mais você cobrir o sistema com validações, menos haverá “brechas” para falhas, garantindo confiabilidade e integridade dos dados armazenados.

 

Testes, testes a mais testes!E por falar em validações, é necessário testá-las, concorda?Talvez essa seja uma das fases mais importantes no desenvolvimento de um software: testar as funcionalidades, validações e operações de forma intensa, desafiando o seu próprio software a manipular corretamente cada caminho de execução. Teste de software pode ser definido como o acompanhamento da execução de um software em um ambiente controlado para verificar se as saídas e o desempenho correspondem ao esperado.

Acredito que você já tenha recebido algum erro reportado pelo usuário e logo pensou: “Caramba, eu testei essa tela várias vezes, como esse erro aconteceu?“. Isso é natural. A causa deste problema é que nós, desenvolvedores, temos um probleminha conhecido como “vício de programação”. Esse vício faz com que nossos testes sejam óbvios, uma vez que, como nós mesmos fizemos a programação, já conhecemos o comportamento do software e não testamos todas as condições que podem ocorrer. Em outras palavras, o desenvolvedor não consegue pensar com a cabeça do usuário, ao menos que ele já tenha experiência com testes ou realmente saiba interpretar o papel de quem está utilizando o software.Para contornar esse tipo de “vício”, desenvolvedores autônomos colocam uma pessoa não relacionada à área desenvolvimento para testar o software. Além de identificar os erros, o desenvolvedor pode ainda observar as dúvidas que surgem quando um novo usuário começa a utilizar o sistema pelas primeiras vezes.Já no âmbito de empresas de desenvolvimento, há outras soluções mais sólidas:

Page 26: Dicas Para o Desenvolvimento de Um Software

Contratar analistas de testes para elaborar roteiros que descrevem as possíveis condições que podem ocorrer na tela ou no módulo desenvolvido. Dessa forma, estes analistas podem cobrir as possibilidades de falhas a partir do conhecimento que já têm do sistema e das técnicas de elaboração de testes;

Orientar os desenvolvedores a implementar testes automatizados para cobrir o código-fonte. Os testes automatizados são bastante úteis para executar uma bateria de testes pré-definidos de modo rápido e sequencial, sem a intervenção de um usuário para a entrada de dados. Uma vez implementados os testes, a vantagem é a possibilidade de executá-los sempre quando a unidade de código for modificada.

Há vários frameworks funcionais para apoiar desenvolvedores na criação 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.

Pessoal, hoje fico por aqui.Agradeço mais uma vez pela visita!

Dicas para o desenvolvimento de um software – Parte 9Postado por André Luis Celestino Publicado em Artigos, Desenvolvimento, Dicas

Olá, leitores! Nos artigos anteriores sobre dicas de desenvolvimento, foquei bastante em aspectos técnicos, visuais e comportamentais de um software. Neste artigo, vou abordar assuntos mais conceituais que fazem parte da minha paixão 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 diferença na minha produtividade. Provavelmente estes conceitos não serão novidade para muitos, mas é interessante deixá-los registrados aqui no SubRotina como parte dessa série de artigos.

 

Page 27: Dicas Para o Desenvolvimento de Um Software

Design Patterns

Os Design Patterns, ou Padrões de Projeto, como são conhecidos, são conceitos ou modelos orientados a objetos visando solucionar problemas no desenvolvimento de softwares. Estes padrões possuem finalidades particulares que podem ser aplicadas para controlar a estrutura, a criação e o comportamento das classes e dos objetos em uma aplicação. Dependendo da situação em que esses projetos forem aplicados, é possível notar uma redução considerável no tamanho do software em virtude da reutilização de código-fonte.Este ano, por exemplo, acompanhei a implementação dos padrões de projeto Strategy, Observer, Builder e Factory Method em um projeto na empresa em que trabalho e pude observar as vantagens que estes padrões trouxeram ao código-fonte, bem como a facilidade para compreender e documentar o software.Apesar de existir 23 padrões de projeto, é praticamente inviável implementar todos eles em uma única solução, afinal, utilizar padrões de projeto sem um propósito é uma má prática. É preciso haver um motivo real para a implementação, ou seja, uma situação em que se pode comprovar de que o padrão de projeto será uma solução exequível para o problema. Caso contrário, a implementação pode aumentar a complexidade do código-fonte e afetar também o desempenho da aplicação.Uma das dúvidas mais frequentes relacionadas a padrões de projeto é saber onde, quando e como utilizá-los. Em primeiro lugar, o engenheiro de software deve ter sólidos conhecimentos em programação orientada a objetos e um bom nível de abstração. A orientação a objeto é a base essencial para compreender os padrões de projeto. Em segundo lugar, é necessário conhecer o objetivo principal de cada padrão de projeto para que seja possível fazer um estudo da viabilidade buscando solucionar um problema no software. Porém, mesmo com esse conhecimento técnico, é comum alguns engenheiros não conseguirem identificar as situações ou os módulos que devem receber a implementação dos padrões. Portanto, em terceiro lugar, o profissional também deve ter um domínio satisfatório da regra de negócio do cliente. A consolidação de todas essas experiências é o que permite a seleção e a aplicação consciente dos padrões de projeto no desenvolvimento do software.

 

Padrão de arquitetura

Um bom software deve proporcionar flexibilidade e facilidade de manutenção. São inúmeros os casos de softwares que foram desenvolvidos sem uma estrutura bem definida e, após algum tempo, apresentaram complicações nas atividades de manutenção. Por conta disso, os padrões de arquitetura são modelos que surgiram para definir a estrutura do software visando não somente a facilidade da manutenção, mas também outros aspectos, como a modularização, desempenho, agilidade no build e a divisão de responsabilidades em camadas.Só para efeito de conhecimento, já publiquei dois artigos aqui no SubRotina sobre o MVC (Model-View-Controller), um dos padrões de arquitetura disponíveis no mercado

Page 28: Dicas Para o Desenvolvimento de Um Software

no qual me identifiquei bastante. Além do MVC, há também outros padrões populares, como o MVP (Model-View-Presenter) e o MVVM (Model-View-View-Model). Apesar da diferença nas nomenclaturas, a ideia central desses três padrões de arquitetura é basicamente a mesma: separar a lógica e a apresentação dos dados em camadas (ou níveis) diferentes. Enquanto a camada Model representa a modelagem dos dados (classes, métodos, persistência), a camada View é responsável por exibir estes dados ao usuário. Por fim, a camada intermediária, diferente para cada padrão (Controller, Presenter ou View-Model), tem a função de gerenciar a comunicação entre a Model e a View.Deixo aqui a minha recomendação: procurem estudar e conhecer melhor sobre estes padrões de arquitetura. Os conceitos são bastante interessantes e a implementação definitivamente traz bons resultados!

 

Clean CodeUma vez li a seguinte frase em um fórum de programação:“Código ruim não é ruim, é apenas mal compreendido.”

Francamente, não concordo com essa frase. Se todos os programadores pensarem dessa forma, teremos tanto código ruim nos softwares que, em certo momento, será impossível compreendê-los. Analogicamente, é o mesmo que misturar um ingrediente vencido na receita de um bolo: o sabor não será o mesmo, além do risco de fazer mal à saúde. Que analogia sem sentido, não? Rsrs…Para evitar o código ruim, existe um conceito conhecido como Clean Code. Em linhas gerais, como o próprio nome sugere, Clean Code significa “código limpo” e orienta a como escrever um código estruturado, organizado e compreensível.O conceito de Clean Code envolve várias práticas que podem ser aplicadas por qualquer desenvolvedor para escrever um código melhor. Entre essas práticas, há recomendações sobre como definir nomes de funções, nomes de variáveis, responsabilidades de métodos (um método deve ter uma e somente uma responsabilidade), indentação de código, parâmetros e até mesmo orientações de como comentar (e também anotar) o código-fonte.

Há um ótimo livro escrito por Robert C. Martin chamado “Clean Code – A Handbook of Agile Software Craftsmanship“ que aborda todas essas práticas de forma bem detalhada e didática, inclusive com bastantes exemplos. Ainda não tive a oportunidade de lê-lo por completo, mas já consultei algumas páginas para estudar melhores formas de aprimorar alguns pontos do meu código e me identifiquei com o conteúdo. Na verdade, depois de conhecer este livro e ler vários artigos na internet sobre este assunto, pude perceber o quanto o comprometimento na escrita do código-fonte é importante para o desenvolvimento de software.Isso nos leva a refletir sobre aquela famosa frase: “Você é responsável pelo seu código!”.

 

Page 29: Dicas Para o Desenvolvimento de Um Software

InterfacesSe você tem conhecimento ou experiência com Programação Orientação 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 programação. A palavra “Interface” pode ser usada para se referir ao visual de uma aplicação, um componente de hardware (por exemplo, interface de rede), como também um recurso na Orientação a Objetos, no qual é o objetivo deste tópico.Uma Interface é um recurso que nos permite determinar comportamentos em comum entre classes que a implementam. Por meio de sua utilização, é possível estabelecer um padrão na implementação de métodos entre classes como se houvesse um tipo de “contrato”. Em outras palavras, as classes que implementam uma determinada Interface deve obedecer todos os métodos assinados por ela, garantindo um nível adequado de padronização.Já sei, ficou complicado, não é? Vamos para um exemplo teórico!

Suponha que criamos uma Interface e definimos duas assinaturas de métodos que serão utilizados no formulário de clientes: DescontarValor e ValidarDocumento. Vale ressaltar que na Interface não há implementação destes métodos, apenas a assinatura. Pois bem, em seguida, criamos as classes ClienteFisico e ClienteJuridico que implementam a Interface que acabamos de criar. Por convenção, essas duas classes devem obrigatoriamente implementar os métodos DescontarValor e ValidarDocumento, já que elas possuem um contrato com a Interface. Porém, como as classes são diferentes, a implementação destes métodos será diferente para cada uma delas. Para a pessoa física, o desconto do valor será de 2% e a validação do documento deverá ocorrer pelo CPF da pessoa. Por outro lado, para a pessoa jurídica, o desconto será de 4% e a validação irá verificar a veracidade do CNPJ da empresa. Mesmo que sejam finalidades diferentes, os nomes dos métodos são os mesmos e a implementação é obrigatória. Se futuramente for necessário incluir um novo método na Interface, como, por exemplo, VerificarCredito, este deverá ser codificado em cada classe que implementar a Interface. Bacana, não?As vantagens de se utilizar Interfaces se resumem essencialmente na organização e nivelamento de classes, na reutilização de componentes do software e na facilidade de manutenção (em virtude da flexibilidade). O conceito de Interfaces é utilizado com bastante frequência na implementação de Design Patterns e de padrões de arquitetura, portanto, é muito importante conhecê-lo. Assim como disse em outro artigo, estes conceitos estão estritamente ligados um ao outro, o que facilita a compreensão e expande a linha de raciocínio para profissionais que trabalham com orientação a objetos.

 

Agradeço novamente pela visita, leitores!Abraço!