Escolar Documentos
Profissional Documentos
Cultura Documentos
Cleiton Cabral dos Santos Supervisor: Jos Coelho de Pina 5 de dezembro de 2005
ndice
1.
Introduo 1.1 Objetivos ........................................................................................................................................ 1.2 A empresa ....................................................................................................................................... 1.1 Escopo ........................................................................................................................................... 2 2 2 3 3 4 4 4 9 9 11 12 12 14 14 14 14 14 15 15 16
2.
Parte Tcnica .......................................................................................................................................... 2.1 Motivaes ...................................................................................................................................... 2.2 A equipe de desenvolvimento .................................................................................................... 2.3 O Call Web ..................................................................................................................................... 2.4 Os padres ..................................................................................................................................... 2.5 Mapeadores objeto-relacionais ................................................................................................... 2.6 As classes geradas pelo LLBLGen Pro ..................................................................................... 2.7 Os padres versus ORM ................................................................................................................ 2.8 Resultados obtidos ....................................................................................................................... 2.9 Atividades realizadas ....................................................................................................................
3.
Parte Subjetiva ....................................................................................................................................... 3.1 Desafios e frustraes .................................................................................................................. 3.2 Interao da equipe ....................................................................................................................... 3.3 O IME e o projeto ........................................................................................................................ 3.4 Disciplinas relevantes ................................................................................................................... 3.5 O futuro do projeto ...................................................................................................................... 3.6 Consideraes finais ......................................................................................................................
4.
Bibliografia .............................................................................................................................................
-1-
1. Introduo
1.1 Objetivos
Esta monografia descreve a arquitetura e incio de implementao do sistema Call Web, realizado na Van Rooy de junho a novembro de 2005. O foco principal a arquitetura do sistema, sendo independente de linguagens de programao. No se trata exatamente de um estgio porque j trabalho h sete anos nesta empresa. Eu mesmo sugeri o desenvolvimento do Call Web como objeto deste estudo e foi uma boa oportunidade para a empresa poder desenvolver um trabalho de carter acadmico. O Call Web a evoluo de outro sistema da Van Rooy chamado Call Solution, desenvolvido em Delphi 7 com uma arquitetura cliente-servidor. Esta arquitetura em duas camadas dificulta a migrao para um ambiente como a Internet. Por isso surgiu a necessidade de um sistema que fosse flexvel o suficiente para que pudssemos utiliz-lo com qualquer tipo de interface moderna (browser na Internet, Pocket PCs, celulares, etc.) e com qualquer banco de dados (SQL Server, Oracle, Interbase, etc.).
1.2 A empresa
A Van Rooy atua no ramo de telemarketing desde 1992. Possui solues bastante abrangentes neste ramo, como software de controle de PABX (Call Manager) e gravao de ligaes (Call Corder). O principal produto, no entanto, o Call Solution, um sistema de CRM (Customer Relationship Management). O termo CRM tem sido muito utilizado para definir sistemas de gerenciamento da relao com o cliente. Estes sistemas fornecem recursos que permitem a uma empresa melhorar a satisfao de seus clientes e aumentar resultados. Isto obtido a partir de conhecimento aprofundado das suas necessidades. Muitas empresas tm investido muito neste ramo e tm obtido timos resultados. Em relao equipe tcnica, a empresa possui um departamento de desenvolvimento, composto por cinco analistas-programadores, e um departamento de suporte tcnico que faz testes continuamente e d suporte a usurios dos nossos produtos.
1.3 Escopo
O projeto desenvolvido na Van Rooy nestes seis meses abrange diversos assuntos potencialmente interessantes. A prpria linguagem de programao e o ambiente que escolhemos para o desenvolvimento (Microsoft Visual Studio 2003 e a linguagem C#) e o framework .NET so interessantes e completamente novos para mim e para a empresa. Da mesma forma, o domnio da aplicao sistemas de CRM seria um campo vasto para explorao. No entanto, este estudo ser concentrado apenas na arquitetura do sistema por ser um tpico interessante e de razovel complexidade. A literatura a respeito trata arquiteturas de forma geral e muitas vezes difcil saber quais caminhos escolher. Decidir a arquitetura final do sistema Call Web exigiu muita pesquisa e discusso entre os membros da equipe, sendo o tpico mais valioso de todo o projeto. importante salientar que todas as escolhas feitas, alternativas descartadas e decises tomadas so especficas do projeto Call Web, mas podem ser aplicadas a diversos outros sistemas corporativos. Na verdade, em vrios pontos do projeto os requisitos tiveram solues conflitantes, nas quais algumas qualidades foram sacrificadas em troca da melhoria de outras. A maior fonte de inspirao para a estrutura do sistema Call Web foi o livro de padres de arquitetura de Martin Fowler chamado Patterns of Enterprise Application Architecture. Este livro trata de padres de sistemas corporativos, que normalmente acessam uma base de dados. A maior parte dos padres referidos nesta monografia so provenientes deste livro.
-2-
2. Parte Tcnica
2.1 Motivaes
Nesta seo, gostaria de mostrar as foras que levaram deciso de se projetar o novo sistema que objeto de estudo desta monografia e como ele ir suprir as novas exigncias de nossos clientes. Como mencionado na introduo, o principal produto da Van Rooy atualmente o Call Solution, um sistema desenvolvido em Delphi 7 utilizando uma arquitetura cliente-servidor. Ele composto por uma aplicao Windows que acessa um banco de dados relacional (ver figura 2.1). Atualmente o Call Solution est preparado para acessar os seguintes bancos de dados: SQL Server, Oracle, Interbase e Firebird. um sistema monoltico, composto por um nico executvel de 22 megabytes.
Figura 2.1 Arquitetura do Call Solution (cliente-servidor) Estas caractersticas do Call Solution possuem algumas desvantagens: a) Por ter uma estrutura cliente-servidor, o sistema no acessvel atravs da Internet e alter-lo para esta finalidade demandaria muitas horas de alteraes. b) A atualizao de novas verses prejudicada por causa do tamanho do arquivo executvel de 22 megabytes. c) Pequenas alteraes implicam em enviar o executvel inteiro novamente para o cliente. d) Como a estrutura cliente-servidor, todos os terminais que utilizam o Call Solution precisam ter conectividade com o banco de dados, exigindo que software especfico seja instalado nas mquinas dos clientes. Isso dificulta o processo de instalao. e) A lgica de negcio do sistema est ainda muito acoplada interface com o usurio, diminuindo o reaproveitamento de cdigo e tornando-o confuso. f) Quando o sistema precisa acessar um novo tipo de banco de dados que possui sintaxe de comandos no compatvel com os anteriores, necessrio refatorar o sistema inteiro para que ele aceite o novo banco. Isto se deve ao fato de cada banco de dados possuir sintaxe diferente para alguns de seus comandos bsicos (SELECT, UPDATE e DELETE).
g) Quando novas rotinas de acesso a dados so adicionadas ao sistema, o desenvolvedor precisa lembrar-se de que deve programar de forma diferenciada para todos os bancos aceitos pelo sistema. Alm disso, ao alterar rotinas que fazem acesso a dados, ele freqentemente esquece de fazer as alteraes para todos os bancos, o que causa erros somente em tempo de execuo. h) Os desenvolvedores precisam conhecer aspectos diferentes de diversos bancos de dados. Por exemplo, necessrio que o programador saiba que left joins em Oracle so feitos usando o smbolo (+) e em SQL Server o smbolo *=. Percebe-se que muitos problemas esto relacionados conectividade com o banco de dados e outros sua prpria estrutura monoltica e pouco flexvel. Esses inconvenientes atrapalham a manuteno do sistema e pequenas alteraes demandam muitas horas de desenvolvimento.
-3-
Foi a partir deste cenrio que surgiu a idia de iniciar aos poucos um novo sistema, em uma linguagem de programao mais moderna. Uma arquitetura multicamadas foi a soluo apropriada.
2.4 Os padres
Nas disciplinas sobre design orientado a objetos aqui do curso de bacharelado em cincias da computao sempre trabalhamos num universo orientado a objetos. No entanto, o prprio Fowler escreve (em [3], captulo 18): Softwares interessantes raramente vivem isolados. At o sistema mais puramente orientado a objetos muitas vezes precisa lidar com coisas que no so objetos, tais como tabelas de bancos de dados relacionais, transaes CICS e estruturas de dados XML. Os padres descritos aqui procuram conciliar esses dois universos. No nvel mais alto de abstrao da arquitetura de software, Martin Fowler sugere (em [3], captulo 1) uma diviso em camadas. Desta forma, o sistema divido em partes lgicas distintas, com responsabilidades bem definidas e que se comunicam. Cada camada deve utilizar os recursos disponibilizados pelas camadas subjacentes e nunca deve conhecer as camadas superiores. Existem duas definies para o termo camada. Uma camada fsica (tier) representa uma mquina na qual uma parte da aplicao executada. No exemplo de uma aplicao cliente-servidor, o banco de dados normalmente instalado num servidor. Os clientes so normalmente mquinas menos potentes que esto numa rede local e atravs dela acessam o banco de dados. Neste exemplo, a aplicao est sendo executada em dois lugares fsicos diferentes: parte dela no servidor e parte na mquina do cliente. Uma camada lgica (layer) uma separao conceitual dentro da aplicao. Diversas camadas lgicas podem residir num mesmo programa executvel e, portanto, serem executadas numa nica camada fsica (mquina). Sempre que houver referncia a camadas neste trabalho, elas sero as camadas lgicas da arquitetura.
-4-
As trs camadas principais so: a) Apresentao (PL Presentation Layer) b) Lgica de Negcio (BLL Business Logic Layer) c) Acesso a Dados (DAL Data Access Layer) Fowler usa o termo fonte de dados (data source) para a camada de acesso a dados e domnio (domain) para a camada de negcios. Preferi adotar aqui os termos que so mais utilizados atualmente no dialeto de arquitetos de sistema e suas respectivas abreviaes em ingls. A camada de apresentao a responsvel pela interface com o usurio. Nela so mostradas informaes (output) e dados so coletados (input) para processamento nas camadas inferiores. As caractersticas desta camada dependero do tipo de interface: browsers, PALMs, celulares, SmartPhones, Pocket PCs, etc. (Ver figura 2.2). A idia que a camada de apresentao seja o view do padro MVC definido no livro Design Patterns (ver [4] para mais referncias sobre MVC).
Figura 2.2 Exemplos de tipos de interface com o usurio A camada de negcios o ncleo do sistema, na qual toda a lgica do domnio especfico de cada aplicao est centralizada. certamente a parte mais complexa de ser projetada e implementada. A sua responsabilidade processar e validar informaes. Por ltimo, a camada de dados responsvel pela persistncia das informaes. Normalmente ser representada principalmente por um banco de dados relacional. Exemplos: Oracle, Interbase, MySQL, SQL Server, etc. (Ver figura 2.3).
-5-
Uma estrutura simples em trs camadas pode ser vista no diagrama da figura 2.4.
Figura 2.4 As trs camadas principais da aplicao Normalmente, a camada de dados composta apenas pelo banco de dados. No entanto, veremos que os padres que adotamos aqui colocam mais responsabilidades na DAL para aumentar o seu desacoplamento da BLL. A camada de negcios O foco principal da nossa ateno neste ponto foi descobrir como trabalhar com a camada de negcios, que normalmente o corao do sistema. Em [3], Martin Fowler comea a aprofundar-se nas camadas de software a partir da camada de negcios (BLL), pois a camada central. Decidir o padro da BLL influenciar na estrutura das demais camadas do sistema. Ele considera trs padres principais de arquitetura para a camada de negcios: a) Transaction Script (110) b) Table Module (125) c) Domain Model (116) O nmero entre parnteses aps o nome uma conveno de notao de padres. Ele indica a pgina do livro no qual o padro foi escrito. A escolha de um dos trs padres est diretamente relacionada complexidade do domnio da aplicao. Para aplicaes mais simples, Transaction Script ou Table Module sero mais apropriados. Escolhemos o padro Domain Model por ser aconselhado para domnios complexos, como o caso do Call Web. No entrarei em detalhes sobre os padres Transaction Script ou Table Module, pois foge do escopo deste trabalho. Entretanto, a figura 2.5 nos d uma idia do quanto modificar o sistema torna-se difcil conforme a lgica de domnio torna-se mais complexa, para cada um dos trs padres possveis. O padro Domain Model Como se pode perceber observando o grfico da figura 2.5, o padro Domain Model recomendvel no caso de aplicaes com lgica de negcios relativamente complexa. importante lembrar que muitas aplicaes comeam simples e tendem a tornarem-se complexas no decorrer de sua vida til. Portanto, se existe a possibilidade de a aplicao crescer em um curto espao de tempo, recomendvel a utilizao de Domain Model. O Call Web, apesar de ainda possuir poucas funcionalidades, foi projetado com este padro por termos como objetivo faz-lo crescer a ponto de tornar-se um sistema completo de CRM.
-6-
Transaction Script
Complexidade da lgica de domnio Figura 2.5 Uma idia da relao entre os trs padres da camada de negcio (extrado de [3]) Resumidamente, o padro Domain Model prev uma teia de objetos de negcios que esto interconectados e colaboram na definio do domnio da aplicao. Estes objetos usam herana, estratgias e outros padres do GoF [4]. Basicamente, esta arquitetura no deve estar preocupada com a representao da camada de dados. Em Table Module, por exemplo, os objetos que residem na camada de negcios so praticamente mapeados diretamente de tabelas do banco de dados. A idia em Table Module que o comportamento est diretamente associado aos dados que o representam. Isto em geral no verdade em domnios complexos que utilizam, por exemplo, herana. No existe um equivalente direto em bancos de dados relacionais no que diz respeito herana em orientao a objetos. Por isso, o mapeamento dos dados contidos em tabelas no banco de dados mais complexo no caso de Domain Model. s vezes mais de uma tabela poder ser mapeada para uma nica classe ou uma nica tabela poder ser mapeada para diversas classes no domnio da aplicao. Para se ter uma idia, na figura 2.6 est representada a estrutura do padro Active Record (160), que mais apropriada para uma camada de negcios do tipo Transaction Script ou at mesmo uma Domain Model no muito complexa. Basicamente o que vemos que um registro de uma determinada tabela no banco de dados est diretamente mapeado para um objeto na camada BLL.
Figura 2.6 Padro Active Record (160). Uma classe na BLL representa um registro de uma tabela na DAL. Active Record ideal para domnios simples, mas para o caso do Call Web este padro possui alguns problemas: a) O objeto mapeado na camada BLL est acoplado representao de uma tabela no banco de dados. Isto significa que a representao dos dados est acoplada lgica de negcios (BLL e DAL misturadas). b) Domnios complexos no evoluem facilmente com este padro. Por exemplo, se no futuro for necessrio utilizar herana nestes objetos, ser difcil refatorar o cdigo para faz-la.
-7-
c) O objeto sabe interagir com o banco de dados, como por exemplo, gravar-se. Isto significa que ele possui comandos SELECT, INSERT e DELETE, operaes comumente conhecidas como CRUD (Create, Read, Update, Delete). Portanto, existe um forte acoplamento entre os objetos na BLL e a DAL. Por estes motivos, descartamos Active Record e optamos por Data Mapper (165), que mais apropriado para domnios complexos. O prprio Fowler comenta em [3], captulo 10: Se o mapeamento for complexo, Data Mapper funciona melhor porque melhor em desacoplar a estrutura de dados dos objetos do domnio da aplicao. Os objetos do domnio no precisam conhecer o layout do banco de dados. Na figura 2.7 est representada a estrutura deste padro. Note que agora a classe Cliente no possui mais responsabilidade de se gravar no banco de dados. Esta responsabilidade foi transferida para uma camada de mapeadores, pertencente camada de dados.
Figura 2.7 Padro Data Mapper (165). Total abstrao do banco de dados na camada BLL. Desta forma, se a empresa decidir trocar o banco de dados de Oracle para SQL Server, por exemplo, a nica camada a ser alterada ser essa nova camada de mapeadores, que fazem nada mais do que operaes CRUD. Na figura 2.8 est representada de forma esquemtica a arquitetura do sistema aps a incluso da camada de mapeadores na DAL.
Figura 2.8 Arquitetura usando Domain Logic (116) e Data Mapper (165). No foi ao acaso que chegamos a essa arquitetura. Na verdade o raciocnio que utilizamos na prtica foi inverso ao que est sendo demonstrado aqui. O mesmo acontece na descoberta de teoremas em matemtica! Tm-se uma intuio, sabe-se de uma verdade e procuramos mais ou menos um caminho reverso para chegar at o resultado. A seguir, falarei sobre softwares chamados de mapeadores objeto-relacionais e veremos qual o seu papel na arquitetura apresentada at aqui.
-8-
-9-
[C#] // Criar uma nova instncia vazia. ClienteEntity cliente = new ClienteEntity(); // Preencher atributos. cliente.ID = "00125"; cliente.Nome = "Jos da Silva"; cliente.Endereco = "Rua das Rosas, 170"; cliente.Cidade = "So Paulo"; cliente.Estado = "SP"; cliente.Telefone = "5789-9912"; // Salvar. Necessrio um Adapter para isso. DataAccessAdapter adapter = new DataAccessAdapter(); adapter.SaveEntity(cliente, true);
Figura 2.10 Criando um novo objeto mapeado e depois gravando-o no banco de dados. Na figura 2.11 mostrado o procedimento para recuperar o cliente do banco de dados. Basta passar a chave primria no construtor e depois usar um objeto Adapter para carreg-lo.
[C#] DataAccessAdapter adapter = new DataAccessAdapter(); ClienteEntity cliente = new ClienteEntity("00125"); adapter.FetchEntity(cliente);
Figura 2.11 Criando um objeto mapeado de um registro j existente no banco de dados. Os relacionamentos entre as tabelas do banco de dados tambm so todos mapeados. Por exemplo, suponha que precisamos buscar todos os pedidos de um determinado cliente. Se as chaves estrangeiras foram corretamente definidas no banco de dados, o LLBLGen Pro criar automaticamente atributos na classe ClienteEntity para mape-los. Na figura 2.12 est um trecho de cdigo que exemplifica a recuperao de pedidos de um cliente.
[C#] // Primeiro, recuperar o cliente DataAccessAdapter adapter = new DataAccessAdapter(); ClienteEntity cliente = new ClienteEntity("00125"); adapter.FetchEntity(cliente); // Recuperar pedidos EntityCollection pedidos = cliente.Pedidos; adapter.FetchEntityCollection(pedidos, cliente.GetRelationInfoPedidos());
Figura 2.12 Recuperando os pedidos de um cliente. Usa o padro Foreign Key Mapping (236). Note que o programador no precisa saber quais so os campos que compem a chave estrangeira, o cdigo para os relacionamentos criado automaticamente. Os objetos criados pelo LLBLGen Pro podem ser ligados diretamente a componentes da interface do usurio. Este recurso chamado em .NET de databinding. Um array de entidades (chamadas no LLBL de EntityCollection), podem ser diretamente ligados (bound) a um componente DataGrid de uma pgina web em ASP.NET. Portanto, uma tentao simplesmente usar as classes geradas para popular componentes visuais, ligando-os diretamente. Veremos mais adiante os problemas que isso pode causar e como fizemos para resolver os conflitos.
-10-
Note que o mapeamento 1:1 entre tabelas e objetos no exatamente o padro descrito por Fowler. Domain Model prev domnios complexos, nos quais muitas vezes uma nica classe poder encapsular mais de uma tabela no banco de dados. Por este motivo, tivemos que adaptar a arquitetura para acomodar a introduo do mapeador objetorelacional sem acoplar o domnio da aplicao estrutura do banco de dados. No caso do Call Web o problema ainda pior porque o banco de dados que vamos utilizar possui problemas na estrutura, devido ao fato de ter sofrido diversas alteraes nos ltimos anos. O tpico a seguir trata destas adaptaes e foi resultado de longas reunies e pesquisas em fruns na Internet para chegarmos a uma concluso.
-11-
Figura 2.13 Nossa adaptao para o padro Data Mapper (165). Isolamento da camada LLBL.
-12-
muito pequenos, mas no para o nosso caso. O meu colega estava relutante em abandonar as idias que aprendeu no curso, mas ele se interessou pelo livro tambm e concordou que havia algo de errado no que ele tinha aprendido. Foram dois meses de intensas discusses, reunies, consultas em fruns na Internet, etc. Em outubro, depois de termos analisado diversos pontos de vista, chegamos concluso de como deveria ser a arquitetura final do sistema Call Web. Iniciamos o desenvolvimento. Novembro foi dedicado inteiramente implementao das funcionalidades bsicas do Call Web: consulta e incluso de agendamentos e cadastro de clientes. Neste perodo tambm atualizamos o Visual Studio para a verso 2005, mas ainda no tivemos tempo para explorar todas as novidades da verso 2.0 do .NET. Tambm neste ms comecei a escrever a monografia.
-13-
3. Parte Subjetiva
3.1 Desafios e Frustraes
O maior desafio deste projeto foi aprender tanta coisa em to pouco tempo. Em apenas seis meses eu aprendi uma linguagem de programao inteiramente nova, o ambiente de desenvolvimento Visual Studio e o mais valioso: projetar a arquitetura de um sistema como o Call Web. Houve momentos, nos meses de agosto e setembro, em que as nossas escolhas eram conflitantes entre si, havia muitas alternativas e eu cheguei a ficar completamente perdido sobre qual delas seria a mais apropriada para o nosso projeto. Gastei diversas horas em fruns de discusso para tentar captar outros pontos de vista, problemas encontrados e suas respectivas solues. Ter de pensar e chegar a uma concluso enriqueceu muito nosso conhecimento sobre o assunto. No acho que tenha havido frustraes. No foram estabelecidos prazos e meu chefe deu total liberdade para o desenvolvimento da arquitetura e estudo das tecnologias. Por parte da empresa, foi depositada total confiana na equipe e no projeto.
-14-
determinada tarefa. Hoje eu penso que se o usurio errou, muito provavelmente a interface foi mal feita ou conceitos do sistema foram mal definidos.
-15-
4. Bibliografia
[1] A. Turtschi et al., C# .NET Web Developers Guide. Syngress Publishing, Inc, Maryland, USA, 2002. [2] F. Buschmann, R. Meunier, H. Rohnert, P. Sommerlad, M. Stal, Pattern-Oriented Software Architecture A System of Patterns. John Wiley and Sons Ltd, Chichester, UK, 1996. [3] M. Fowler, Patterns of Enterprise Software Architecture. Addison Wesley, USA, 2002. [4] E. Gamma, R. Helm, R. Johnson, J. Vlissides, Design Patterns Elements of Reusable Object-Oriented Software. Addison-Wesley, USA, 1994. [5] J. Nielsen, Designing Web Usability: The Practice of Simplicity. New Riders Publishing, USA, 2000. [6] Site: www.msdn.com. Microsoft Developers Network.
-16-