27 de junho de 2011

Design Patterns com Delphi: State - Parte I

Ao longo de sua existência, um objeto em um sistema computacional pode sofrer variações em seu estado interno. Isto é, cada operação realizada com ele ou cada propriedade ajustada altera o valor de variáveis internas (membros), introduzindo mudanças no seu estado. Se o objeto tiver que se comportar de forma diferente de acordo com seu estado interno, a implementação dele tende a se tornar cada vez mais complexa à medida que a quantidade de estados possíveis aumenta, dificultando a manutenção do sistema como um todo.

O Design Pattern comportamental State foi concebido para atender a situações como as descritas no parágrafo anterior, simplificando a manutenção do sistema. Como exemplo do cenário onde o padrão é aplicável, imagine um sistema que controle contas correntes. Dependendo do saldo total, a conta é classificada de uma maneira que determina a disponibilidade de certas operações. Também determina se os serviços disponíveis para a conta são cobrados, a taxa de remuneração que se aplicará ao saldo (se aplicável), taxa juros sobre empréstimos (se aplicável), etc.

A base do conceito para implementarmos esse padrão é a existência de uma interface que torna públicas as operações disponíveis para a classe principal – a conta, no nosso exemplo. O estado interno é mantido por outra classe que tem o conhecimento de como se comportar adequadamente para esse estado específico. Quando a classe principal precisa realizar uma operação, ela delega a responsabilidade para a classe que mantém o estado. Podemos perceber, então, que cada conjunto diferente de comportamentos baseado no estado da classe principal será tratado por uma classe de estado diferente. O resultado desse arranjo é que a classe principal consegue comportar-se da forma planejada apenas trocando a instância interna da classe de estado, o que ocorre de forma transparente para quem usa a classe principal.

Veja no diagrama UML abaixo a relação entre as classes previstas para nosso exemplo:
Diagrama UML para o padrão State

Classes de objetos que podem alternar seu estado de acordo com uma lista previamente conhecida normalmente têm um Diagrama de Estados associado a elas quando modelamos o projeto usando UML. Esse diagrama documenta as mudanças de estado permitidas para o objeto. Com base no saldo existente, a conta do exemplo pode ser classificada como Ouro (melhores taxas de rendimento, menor preço para serviços), Comum (as taxas e preços normais se aplicam) e Diferenciada (o saldo baixo ou negativo leva a menor rendimento, serviços mais caros e proibição de saques e empréstimos).

Formalmente, as classes que participam da solução para o pattern State recebem os seguintes nomes:
Context é a classe que publica as operações que estarão disponíveis para as demais partes do sistema, sendo, por isso, a classe principal da solução. Ela mantém uma referência para a classe que contém o estado atual e o comportamento associado a este estado. No diagrama acima, a classe Context é a TWConta.

State é uma interface que define quais as operações do Context terão comportamento baseado num estado. Ela contém ainda as propriedades relevantes para determinar quando uma troca de estado deve acontecer. Esse papel é executado pela classe TWEstadoConta no diagrama acima. Por ser uma interface, ela normalmente será abstrata, isto é, muitas das funções serão implementadas somente por suas heranças.

Concrete State são as classes que provêem o comportamento adequado para cada estado possível. Elas herdam da interface State, promovendo a implementação necessária para cada operação introduzida por ela. No diagram há 3 classes nessa categoria: TWContaComum, TWContaOuro e TWContaDiferenciada.

Um Client é qualquer parte do sistema que solicite uma operação à classe Context. Esse é o papel da classe TWTelaOperConta no diagrama anterior.

O tipo de hierarquia proposta pelo State é muito semelhante àquela adotada no padrão estrutural Adapter. A diferença é que o Adapter serve para ocultar detalhes de implementação de objetos diferentes que têm a capacidade de executar tarefas similares, adaptando esses objetos a uma interface padronizada. Já o State simplifica a diferenciação de comportamentos dentro de um mesmo objeto. Ou seja, o primeiro foca no aspecto estrutural e envolve várias classes enquanto o segundo foca o comportamento de um único objeto.

No próximo post, mostro uma sugestão de como implementar em Delphi o exemplo usado aqui.

16 de junho de 2011

Representando dados binários como texto em Delphi

Estou desenvolvendo para a ABC71 um projeto para automatizar o processo de implantação do nosso ERP. Parte do projeto consiste em deixar nossos consultores criar passos num tipo de assistente, aproveitando o conhecimento de campo deles para montar cenários de implantação. Ao criar um passo, eles podem até mesmo carregar uma imagem para representá-lo. Tudo isso é salvo como um arquivo XML, o que traz um problema : imagens são arquivos binários e um XML contem apenas texto.

Mesmo que eu usasse uma seção CDATA, teria que aplicar alguma transformação no conteúdo binário para que ele pudesse ser lido corretamente - certos bytes representam caracteres especiais que não podem ser exibidos, tais como o 27 (escape) e o 0 (zero sinaliza fim de uma string em C/C++).

Uma forma de converter o conteúdo binário num texto legível seria tomar cada byte e usar a representação hexadecimal dele. Por exemplo, ao invés do byte com valor 27, eu teria um texto com valor 1B. Um inconveniente salta aos olhos : como cada byte é representado por 2 caracteres, o conteúdo binário dobra de tamanho no processo de conversão !

A melhor solução que encontrei para esse problema é usar a codificação chamada Base64. Nesse algoritmo, uma sequência de bytes é processada para gerar um texto contendo apenas caracteres que podem ser exibidos, selecionados em uma lista fixa com 64 caracteres possíveis - daí o nome de Base64. Não sei se a VCL inclui uma implementação desse algoritmo; a versão que usei está disponível para download no site Koders.com. O texto resultante dessa conversão ainda é maior do que o conteúdo original mas ao menos não dobra de tamanho.

Trabalhar com a Base64 é relativamente simples. Há somente duas funções no fonte indicado: uma para codificar a informação binária (B64Encode) e outra para obter de volta a informação originalmente codificada (B64Decode). Como exemplo, o trecho de código abaixo carrega uma imagem a partir de um arquivo, codifica o conteúdo encontrado e retorna o resultado do processamento como uma string. Por ser um texto, esse resultado pode ser facilmente utilizado em outras partes do programa. No meu caso, eu o incluí como valor de uma tag num XML:
var lConteudo : String;
lSsAux : TStringStream;
lStreamOrg : TFileStream;
begin
{ Stream auxiliar para recuperar o conteúdo binário do arquivo }
lSsAux := TStringStream.Create ('');
lStreamOrg := TFileStream.Create (_ImgFilePath, fmOpenRead);

{ Copia o conteúdo do arquivo para o stream em memória }
lSsAux.CopyFrom (lStreamOrg, 0);
lSsAux.Position = 0;

{ Prepara o conteúdo binário, codificando-o como um texto }
lConteudo := lSsAux.DataString;
lConteudo := B64Encode(lConteudo);

lStreamOrg.Free();
lSsAux.Free();

Result := lConteudo;
end;

Para obter o arquivo original de volta, basta decodificar o texto preparado pelo código anterior. O exemplo que segue traz um função que recebe esse texto, decodifica-o e grava o resultado num novo arquivo com o conteúdo original intocado:
procedure TWAssitente.DecodeContentToFile (AConteudo: String);
var lStreamDst : TFileStream;
Buffer : PChar;
begin
{ Cria o novo arquivo vazio }
lStreamDst := TFileStream.Create (_ImgFilePath, fmCreate);

{ Decodifica o conteúdo }
AConteudo := B64Decode (AConteudo);

{ Grava o conteúdo decodificado no arquivo }
Buffer := PChar (AConteudo);
lStreamDst.Write (Buffer^, Length(AConteudo));
lStreamDst.Free ();
end;

Como é possível deduzir da discussão até aqui, a Base64 pode ser usada para preparar qualquer conteúdo binário e não só imagens. Isto inclui tanto arquivos (documentos, planilhas, executáveis, músicas, etc.) quanto dados contidos em arrays e streams na memória de seu programa. Até mesmo o resultado de assinaturas digitais podem passar por esse processo, como mostra o post sobre a assinatura do XML de uma nota fiscal eletrônica.

Os cálculos do algoritmo da Base64 não são complexos. Caso queira analisá-lo (ou simplesmente utilizá-lo), o fonte completo pode ser acessado através desse link.

9 de junho de 2011

Há futuro para projetos em Delphi ?

Algumas pessoas me enviaram email perguntando o que penso sobre o futuro do Delphi. A preocupação básica é a de que a linguagem vem perdendo terreno, enquanto cada vez mais projetos são levados a cabo com .NET, Java e principalmente com linguagens com forte apelo Web (PHP, Perl, Javascript), conforme atesta a lista mantida pela TIOBE Software.

Acho que essa é uma preocupação infundada. Em primeiro lugar, o IDE do Delphi vem ganhando novas versões de forma consistente, às quais têm sido incorporados novos recursos, sempre em sintonia com a evolução do mercado. Isso dá bastante tranquilidade de que a ferramenta não foi abandonada e que adotá-la (ou continuar com ela) não implicará em restrições ao uso de novas tecnologias.

Um outro ponto é a quantidade de acessos a este blog quando o tema está relacionado ao Delphi. Ainda, pelos emails que recebo a partir do blog com comentários e dúvidas, vejo que a linguagem tem uma comunidade bastante grande e ativa aqui no Brasil. Mesmo em sites fora do país eu encontro vasto material quando preciso pesquisar alguma coisa. Então, acredito que o uso do Delphi ainda continuará firme e forte.

Por fim, a Embarcadero havia comunicado em maio que haveriam mudanças nas parcerias deles por aqui. A promessa era ampliar os serviços através da homologação de novos parceiros. No entanto, notícia publicada hoje pela ComputerWorld informa que eles darão um passo ainda maior : abrirão escritório próprio no Brasil, mostrando claramente que pretendem dar continuidade no suporte à ferramenta.

Abaixo, reproduzo essa notícia:
A empresa norte-americana Embarcadero, dona da ferramenta de desenvolvimento Delphi, está desembarcando no Brasil e passará a operar com time local. Inicialmente, a companhia terá um escritório próprio, mas já faz parte de seus planos a abertura de uma subsidiária.

Até agora, as ferramentas Delphi e de desenvolvimento para banco de dados da companhia eram vendidos no Brasil pelo canal de distribuição da Micro Focus, que adquiriu a Borland há dois anos, dona desses produtos.

Embora a Embarcadero tivesse comprado essa linha da Borland em 2008, a empresa não estava presente no País nem em outros mercados da América Latina com operação direta.

Com a abertura de um escritório próprio no Brasil, a Embarcadero promete se aproximar mais de seus clientes e incrementar os negócios no País. Ao anunciar a inauguração da unidade local, o vice-presidente de vendas da empresa para a região das Américas, Allen Lovett, destacou que o mercado brasileiro foi considerado importante pela matriz pela sua economia crescente e por ser o maior da América Latina.

“Temos uma base grande de desenvolvedores Delphi no Brasil e enxergamos muitas oportunidades aqui para crescermos”, diz Lovett. A operação local será comandada pelo executivo José Eugênio Braga, que foi diretor comercial e de marketing da Borland.

Eugênio Braga será presidente da Embarcadero no Brasil e contará com apoio de um time de aproximadamente 15 pessoas, todas vindas da Borland e que já conheciam os produtos da marca.

Mais próxima dos desenvolvedores

De acordo com o presidente da Embarcadero no brasil, o País conta com uma comunidade de aproximadamente 100 mil desenvolvedores Delphi e já vendeu mais de 300 mil licenças da ferramenta. Entretanto, ele admite que houve uma queda na comercialização dos produtos da marca para sua base antiga. Mas ele garante que a empresa não perdeu mercado, pois 60% dos contratos são fechados com novos usuário.

Lovett complementa que a decisão da Embarcadero de ter uma operação local é para tentar fidelizar sua base, oferecendo serviço, suporte e treinamento em português. Faz parte dos planos também aumentar o número de desenvolvedores em Delphi que estão saindo da universidade.

Eugênio Braga lembra que na época da Borland havia um programa estruturado com universidades brasileiras para para treinar jovens em Delphi. Cerca de 300 universidades participavam da iniciativa. “Vamos investir no Brasil, oferecer treinamento, fazer campanhas e certificar nossos parceiros de negócios”, promete Lovett.

A empresa também promete trazer para o Brasil uma terceira linha de produtos, que será lançada mundialmente no terceiro trimestre, com soluções para controlar licenças de software nas grandes companhias.

Com a operação local, Lovetti espera aumentar a participação do mercado brasileiro na receita global da companhia, que hoje é de 10% e a meta é chegar em 2012 com uma contribuição de 15%. O valor do faturamento mundial da empresa não foi revelado.

Aqui na ABC71 usamos como linguagem principal o C++ Builder, ferramenta gêmea do Delphi em que a programação é feita em C++. Por conta de tudo que foi exposto aqui, não temos qualquer plano de trocar de ambiente num futuro próximo - até porque, nosso ERP tem mais de 5000 telas, processos e relatórios construídos com essa ferramenta.

A única coisa que me preocupa realmente é o fato de que os compiladores do Delphi e do C++ Builder ainda não gerarem código nativo para 64 bits. É um recurso que prometem a bastante tempo mas sobre o qual não tenho visto mais notícias. Veja aqui.

2 de junho de 2011

Microsoft mostra recursos da próxima versão do Windows

Nem bem acabou de lançar o Windows 7, a Microsoft já estava planejando a nova versão. A empresa havia feito antes algumas revelações sobre como seria o Windows 8 mas em primeiro de junho chegaram a mostrar coisas mais concretas a esse respeito. Ao que parece, a proposta é aproximar o Windows Phone daquele voltado para desktops, de modo que a interação com o usuário seria idêntica em um e outro.

A aproximação ainda teria como objetivo preparar uma versão otimizada para tablets, disponibilizando a mesma usabilidade nas três plataformas. Apesar da pressa pra não perder o bonde, essa versão específica para tablets deverá ser entregue, na melhor das hipóteses, no começo de 2012. Mas, segundo o Citigroup, a Microsoft não está atrasada para a festa dos tablets pois há uma base muito grande de programas feitos para seu sistema operacional. Como ela está trabalhando para garantir que esses programas rodem também nos tablets, muitos dos que os usuários já estão acostumados a utilizar em seus pcs estarão automaticamente disponíveis nos dispositivos com o novo Windows.

Mesmo que seja um sistema operacional muito bem resolvido e abarrotado de recursos interesses - como parece ser o Windows Phone 7 - , somente o tempo dirá se eles estão ou não atrasados. Se demorarem muito, os usuários que hoje são fiéis a programas Windows já podem ter encontrado substitutos a altura nos sistemas de seus tablets.

O texto que vai abaixo é uma reprodução da matéria publicada pelo IDG Now! a respeito da apresentação dos recursos previstos para o Windows 8. A reportagem original pode se acessada aqui.
O Windows 8 está a caminho, e será bem diferente do Windows que conhecemos hoje. Esta foi a mensagem que a Microsoft passou na noite desta quarta-feira (01/06) durante a conferência anual D: All Things Digital, fealizada próxima a Los Angeles, EUA.

Na conferência a Microsoft apresentou uma versão preliminar do Windows 8, com uma interface radicalmente modificada. Em vez do tradicional desktop com janelas, barra de tarefas e Menu Iniciar, a interface se parece muito com a usada no Windows Phone 7, completa com "Tiles" otimizadas para uso com o toque.

A Microsoft também postou um vídeo que mostra alguns dos novos recursos. A empresa diz que a interface foi projetada não apenas para laptops e desktops, mas para tablets também. A nova interface com Tiles, "quadrados" coloridos que exibem informações e servem de atalho para aplicativos, substitui o tradicional menu iniciar e os ícones no desktop, de acordo com a empresa.

O Windows 8 irá rodar aplicativos Windows já existentes e terá suporte aos periféricos já existentes. No vídeo a Microsoft mostra aplicativos tradicionais, como o Office, rodando em uma interface desktop similar à do Windows 7, e é possível trocar entre a nova interface e o modo desktop ao toque de um botão.

O sistema também terá uma versão do navegador Internet Explorer 10 otimizada para toque, muito similar à versão do Internet Explorer utilizada no Windows Phone 7. Para facilitar o uso do sistema em Tablets a Microsoft também incluiu um teclado virtual completo, com um modo "separado" que agrupa as teclas nas laterais da tela para facilitar a digitação com os dedões.

Aplicativos desenvolvidos especialmente para o Windows 8 também serão diferentes, e usarão "o poder do HTML5, acessando recursos nativos do Windows através de JavaScript e HTML", diz a empresa. Ainda não está claro se isso significa que aplicativos para o Windows 8 serão exclusivamente baseados em HTML5, JavaScript e outras tecnologias originadas na web ou se haverá a possibilidade de usar ferramentas de desenvolvimento mais tradicionais já oferecidas pela Microsoft e outras empresas.

O que é interessante no Windows 8 é que ele é outro passo rumo à transformação dos computadores pessoais em aparelhos mais parecidos com tablets. A Apple também está deixando o Mac OS X mais similar ao iPad ao incorporar vários recursos do iOS ao Mac OS X 10.7 "Lion", embora o Windows pareça ir um passo adiante na fusão entre os tablets e os PCs.

A própria Microsoft confirma o escopo das mudanças, dizendo que o Windows 8 é "uma recriação do Windows, do processador à interface. Um PC com o Windows 8 é na verdade uma nova categoria de aparelho, que pode ir de telas pequenas sensíveis ao toque até os grandes monitores de um desktop, com ou sem um teclado e mouse".

Provavelmente haverá resistência a estas mudanças e teremos que esperar para ver como tudo funciona na prática. Mas o rumo está traçado.