Investigacao da efetividade de um framework corporativo de ... da Silva Avansini... · VBA –...
Transcript of Investigacao da efetividade de um framework corporativo de ... da Silva Avansini... · VBA –...
Universidade Estadual de Maringá Centro de Tecnologia – Departamento de Informática
Especialização em Desenvolvimento de Sistemas para Web
Investigação da efetividade de um Framework Corporativo de
persistência de dados com base no Framework NHibernate em um
ambiente empresarial.
Régis da Silva Avansini
Prof. Dr. Edson A. Oliveira Junior Orientador
Maringá, 2012
Universidade Estadual de Maringá Centro de Tecnologia – Departamento de Informática
Especialização em Desenvolvimento de Sistemas para Web
Régis da Silva Avansini
Investigação da efetividade de um Framework Corporativo de
persistência de dados com base no Framework NHibernate em um
ambiente empresarial.
Trabalho submetido à Universidade Estadual de
Maringá como requisito para obtenção do título
de Especialista em Desenvolvimento de Sistemas
para Web.
Orientador: Prof. Dr. Edson A. Oliveira Junior
Maringá, 2012
Investigação da efetividade de um
Framework Corporativo de persistência de
dados com base no Framework NHibernate
em um ambiente empresarial.
PARECER DA BANCA EXAMINADORA
RÉGIS DA SILVA AVANSINI
DATA DA DEFESA: _____/_____/_____
Trabalho apresentado nesta data ao Curso de Especialização em Desenvolvimento de
Sistemas para Web da Universidade Estadual de Maringá, examinado pela Banca
Examinadora composta pelos professores:
_______________________________________
Prof. Dr. Edson A. Oliveira Junior (Orientador)
______________________________________
Prof. Dr. Tania Fatima Calvi Tait (Professor Convidado)
______________________________________
Prof. Dr. Renato Balancieri (Professor Convidado)
PARECER CONCLUSIVO:
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
AGRADECIMENTOS
“Agradeço a todos os profissionais que me auxiliaram com opiniões distintas sobre as
ferramentas comparadas nesta pesquisa e aos amigos de turma da ESPWEB”.
Avansini, Régis Silva. Investigação da efetividade de um Framework Corporativo de
persistência de dados com base no Framework NHibernate em um ambiente empresarial.
2012. Monografia (Especialização em Desenvolvimento de Sistemas para Web), Universidade
Estadual de Maringá.
RESUMO
O aumento da demanda por soluções de software junto com o pouco prazo de entrega
estabelecido pelos seus clientes faz com que as empresas da área de desenvolvimento de
softwares busquem soluções para assegurar a entrega de seus produtos garantindo ainda a
qualidade do produto final, por isso muitas optam por criarem frameworks corporativos para
reutilização de seus próprios códigos fonte. Alguns desses frameworks são concebidos para
funções específicas como mapear os objetos de sua aplicação para o modelo entidade
relacionamento do banco de dados, contudo já existem soluções disponíveis e gratuitas para
realização dessa funcionalidade. Este trabalho visa levantar as principais informações de dois
frameworks de persistência de dados, identificando desempenho, manutenção, escalabilidade,
curva de aprendizado e opiniões de analistas e programadores para que seja possível comparar
qual deve ser adotado em determinados cenários de desenvolvimento. Para realização dos
estudos foram escolhidos o NHibernate e o framework corporativo desenvolvido por uma
empresa privada, identificando assim o NHibernate como o mais efetivo com base nas
comparações realizadas.
Palavras-Chave: Framework, C#, NHibernate, Persistência, Mapeamento Objeto-Relacional,
Corporativo.
Avansini, Régis Silva. Investigação da Efetividade de um Framework Corporativo de
Persistência de Dados com Base no Framework NHibernate em um Ambiente
Empresarial. 2012. Monografia (Especialização em Desenvolvimento de Sistemas para
Web), Universidade Estadual de Maringá.
ABSTRACT
The increased demand for software solutions along with the little lead time provided by its
customers makes the companies in the area of software development to seek solutions to
ensure the delivery of its products while ensuring the quality of the final product, so many
choose to create frameworks for corporate reuse their own source code. Some of these
frameworks are designed for specific functions such as mapping the objects of your
application to the entity relationship model of the database, however there are solutions
already available for free to achieve this functionality. This work aims to raise the key
information from two data persistence frameworks, identifying performance, maintainability,
scalability, learning curve and opinions of analysts and programmers to be able to compare
which should be adopted in certain deployment scenarios. For the studies were chosen
NHibernate and corporate framework developed by a private company, thus identifying
NHibernate as the most effective based on comparisons made.
Keywords: Framework, C #, NHibernate, Persistence, Object-Relational Mapping,
Corporate.
LISTA DE ABREVIATURAS E SIGLAS
ADO – ActiveX Data Objects.
API – Application Programming Interface.
CLR – Common Language Runtime.
CRUD – Create, Read, Update and Delete.
CSLA – Component-based, Scalable, Logical Architecture.
DBA – Data Base Administrator.
DB2 – Banco de Dados IBM.
DLL – Dynamics Link Library.
DTO – Data Transfer Object.
GNU – General Public License.
IIS – Internet Information Services.
LGPL – Lesser GNU Public License.
LOG – Registro de erros e monitoramento.
MVC – Model-View-Controller.
OO – Orientação a Objetos.
POCO – Plain Old CLR Object.
SGBD – Sistema Gerenciador de Banco de Dados.
SQL – Structure Query Language.
TI – Tecnologia de Informação
URL – Uniform Resource Locator.
VBA – Visual Basic.
XML – Extensible Markup Language.
SUMÁRIO
1. INTRODUÇÃO ..................................................................................................... 1
2. PADRÕES DE PROJETOS E ARQUITETURA DE SOFTWARE ....................... 3
3. FRAMEWORKS ................................................................................................. 10
3.1 Classificação de frameworks ................................................................................ 11
3.2 Tipos de frameworks ............................................................................................. 12
3.3 Vantagens e desvantagens ................................................................................... 13
4. FRAMEWORK CORPORATIVO ....................................................................... 14
4.1 Arquitetura do framework corporativo ................................................................ 14
4.2 Características do framework corporativo .......................................................... 16
4.3 Processo de criação e utilização do framework corporativo ........................... 16
4.4 Configuração do framework corporativo ............................................................ 17
4.5 Mapeamento objeto-relacional ............................................................................. 18
5. FRAMEWORK NHIBERNATE ........................................................................... 23
5.1 Arquitetura do NHibernate .................................................................................... 23
5.2 Principais características do NHibernate ............................................................ 25
5.3 Processo de criação e utilização do NHibernate ................................................ 26 5.3.1 Abordagem bottom-up ............................................................................................................... 27 5.3.2 Abordagem top-down ................................................................................................................. 28
5.4 Configuração do NHibernate ................................................................................ 28
5.5 Mapeamento objeto-relacional ............................................................................. 30 5.5.1 Mapeamento de tabelas-classes .............................................................................................. 34 5.5.2 Mapeamento de chave primária ............................................................................................... 34 5.5.3 Mapeamento muitos-para-um ................................................................................................... 35 5.5.4 Mapeamento Um-para-Um ........................................................................................................ 35
6. COMPARAÇÃO DOS FRAMEWORKS ............................................................. 37
7. CONCLUSÃO E TRABALHOS FUTUROS ....................................................... 43
REFERÊNCIAS BIBLIOGRÁFICAS ......................................................................... 46
APÊNDICE A – QUESTIONÁRIO FRAMEWORKS ................................................. 47
LISTA DE FIGURAS
Figura 2.1 – Diagrama de classes para o padrão Factory Method (Fonte: Autor) ............ 4
Figura 2.2 – Diagrama de classes para o padrão Adapter (Fonte: Autor) ........................ 5
Figura 2.3 – Diagrama de classes para o padrão Observer (Fonte: Autor) ...................... 6
Figura 2.4 – Diferentes representações para um mesmo modelo (fonte: [3]) ................... 8
Figura 2.5 – Modelo de arquitetura de software em camadas MVC (fonte: Autor) ......... 9
Figura 3.1 – Representação do modelo vertical de frameworks (fonte: [6]) ................... 11
Figura 3.2 – Representação do modelo horizontal de frameworks (fonte: [6]) ............... 12
Figura 3.3 – Representação dos tipos de frameworks (fonte: autor) ............................. 13
Figura 4.1 – Camadas básicas de um aplicativo (fonte: [7]) ......................................... 15
Figura 4.2 - Arquitetura do framework corporativo (fonte: [7]) ................................... 15
Figura 4.3 – Arquitetura das classes e entidades do framework (fonte: [7]) ................... 18
Figura 4.4 – Exemplo de entidade do banco de dados a ser mapeado (fonte: [7]) .......... 19
Figura 4.5 – Objeto POCO instanciado da entidade ACTIVITY (fonte: [7]) ................ 19
Figura 4.6 – Objeto serializado da entidade ACTIVITY (fonte: [7]) ............................ 20
Figura 4.7 – Classe POCO da entidade ACTIVITY (fonte: [7]) ................................... 21
Figura 5.1 – Visão de alto nível da arquitetura do framework NHibernate (fonte: [9]) ... 23
Figura 5.2 – Visão da arquitetura do framework NHibernate (fonte: [9]) ...................... 24
Figura 5.3 – Visão detalhada da arquitetura do framework NHibernate (fonte: [9]) ...... 24
Figura 5.4 – Utilização botton-up do NHibernate (fonte: autor) .................................... 27
Figura 5.5 – Utilização top-down do NHibernate (fonte: autor) ..................................... 28
Figura 5.6 – Configuração do NHibernate dentro do web.config (fonte: [10])................ 29
Figura 5.7 – Mapeamento XML da entidade cliente (fonte: autor) ............................... 32
Figura 5.8 – Classe POCO para mapeamento da Figura 6.7 (fonte: autor) ................... 32
Figura 5.9 – Classe POCO mapeada da entidade cliente (fonte: autor) ........................ 33
Figura 5.10 - Classe POCO para mapeamento fluente da entidade cliente (fonte: autor)
.................................................................................................................................. 33
Figura 5.11 – Classe de mapeamento para entidade cliente (fonte: autor) .................... 33
Figura 5.12 – Atributos e valores, mapeamento muito-para-um XML (fonte: [10]) ...... 35
Figura 5.13 – Mapeamento um-para-um em arquivo XML (fonte: [10]) ...................... 36
Figura 5.14 – Atributos e valores, mapeamento um-para-um XML (fonte: [10]) .......... 36
Figura 6.1 – Tempo de adaptação do usuário do NHibernate (fonte: autor) .................. 38
Figura 6.2 – Tempo de adaptação do usuário do framework corporativo (fonte: autor) 39
LISTA DE TABELAS
Tabela 5.1 – Configuração de banco de dados para o NHibernate (fonte: autor) ........... 30
Tabela 5.2 – Estrutura da entidade cliente (fonte: autor) ............................................. 31
Tabela 6.1 – Comparação das ações de mapeamento dos frameworks (fonte: autor) ..... 40
Tabela 6.2 – SGBD’s suportador por ambos frameworks ............................................ 41
1
1. INTRODUÇÃO
Na última década o desenvolvimento de novos aplicativos de software teve um
aumento significativo, fazendo com que empresas da área de desenvolvimento de software
adotassem metodologias e técnicas para aperfeiçoar o ciclo de vida dos seus produtos. Um dos
principais desafios de empresas fornecedoras deste tipo de serviço é atender a demanda de
customização de seus produtos no menor período de tempo possível. Contudo, faz-se
necessário que tais empresas desenvolvam soluções que possam reutilizar os seus próprios
códigos fonte, componentes e interfaces em novos projetos. Para tanto, tais empresas adotam
o uso de frameworks próprios (corporativos), optando em despender recursos humanos e
tecnológicos nos estágios iniciais de seus projetos para concebê-los atendendo às suas
necessidades.
Entretanto, tomar a decisão de optar por uma ferramenta corporativa ou adotar um ou
vários frameworks comerciais pode não ser uma tarefa trivial. O uso de tecnologia própria
pode parecer uma boa estratégia quando usada de forma correta, caso contrário pode acarretar
em alto custo de tempo e recurso, o que pode reduzir o retorno de investimento da empresa.
Vários aspectos devem ser levados em consideração antes de decidir qual framework
adotar, entre eles pode-se destacar: a escalabilidade do framework, o tempo de adaptação da
equipe de usuários, o desempenho, o tempo de concepção de novos produtos, a adaptação do
aplicativo, o conhecimento compartilhado entre a comunidade de software, a difícil
manutenção, o código morto e a falta de capacitação dos profissionais.
Outro caminho no processo de reutilização de recursos é adotar frameworks de
mercado, desenvolvidos por terceiros. Atualmente, são vários os tipos de frameworks
encontrados, alguns com características bem definidas como, por exemplo, persistência de
dados.
Este trabalho tem como objetivo apresentar um estudo comparativo entre dois
frameworks, atualmente adotados por uma empresa com o intuito de identificar qual é o mais
efetivo. O primeiro framework foi desenvolvido pela própria empresa. Ele abrange todas as
camadas de desenvolvimento de uma nova aplicação, contudo neste trabalho é considerada
apenas a persistência de dados. O segundo framework é NHibernate. Tal framework foi criado
estritamente para realizar a persistência de dados.
2
Para a realização deste trabalho foi necessário levantar informações sobre padrões de
projetos de software e arquitetura de software para identificar as necessidades de uma camada
de persistência de dados, em seguida foram estudados os modelos de frameworks existentes
para identificar em quais se encaixam os frameworks aqui comparados, após isso foram
estudados as principais características e arquitetura de ambos os frameworks. Além disso, foi
considerada a experiência de profissionais que tenham trabalhado com uma ou ambas as
ferramentas, por meio de aplicação de um questionário.
Este trabalho está estruturado da seguinte maneira: o capítulo 2 apresenta os principais
conceitos sobre padrões de projeto, amplamente conhecidos como Design Patterns e
conceitos referentes à organização de aplicações em camadas, especificamente na camada de
persistência de dados, tomando como referência o padrão de arquitetura de software MVC
(Model – View - Controller); o capítulo 3 possui uma definição dos tipos de frameworks
encontrados; o capítulo 4 contempla as informações essenciais pertinentes ao framework
corporativo; o capítulo 5 engloba o framework NHibernate; o capítulo 6 apresenta os
resultados obtidos e a comparação realizada entre ambos os frameworks; e o Capítulo 7
apresenta as conclusões e direções para trabalhos futuros. No apêndice A está o questionário
aplicado junto aos profissionais da área.
3
2. PADRÕES DE PROJETOS E ARQUITETURA DE SOFTWARE
Independente da linguagem de programação utilizada, ou da empresa ou ainda da
aplicação que esteja sendo criada, a manutenção está presente. Com o tempo o software irá
crescer e mudar para não se tornar obsoleto. Por exemplo, a alteração do SGBD (Sistema
Gerenciador de Banco de Dados), nem sempre é possível, pois ele está diretamente
relacionado com a forma em que a aplicação foi construída [2], ou seja, um padrão está
diretamente relacionado com a abstração dos detalhes encontrados na criação de um novo
aplicativo de software [3].
Os padrões de projetos de software ou Design Patterns fornecem uma estrutura de
projeto OO (Orientado a Objetos) capaz de solucionar problemas comuns ao processo de
desenvolvimento, visando reutilizar as soluções já encontradas e melhorar a manutenção [2].
Segundo Christopher Alexander [1], “Cada padrão descreve um problema que ocorre
repetidas vezes em nosso ambiente e o núcleo da solução para tal problema, de tal forma que
possamos usar essa solução de diferentes formas sem nunca fazê-la da mesma maneira duas
vezes”.
Os padrões de projetos estão entre os mais importantes avanços da engenharia de
software nos anos de 1990, uma simples abstração do que é flexível dentro de uma aplicação,
e/ou seu remanejamento dentro do projeto para que possa sofrer alterações no decorrer do
processo de forma organizada já se caracteriza como um padrão de projeto de software. O
padrão comportamental Strategy, por exemplo, define um conjunto de classes, encapsula cada
uma delas e as torna intercambiáveis.
Alguns cuidados devem ser levados em consideração na utilização de padrões de
projetos. Deve-se evitar tornar flexível o que não precisa ser flexível. Muitas partes do código
escrito não se relacionam com o problema que será resolvido, o número de classes tende a
aumentar e o relacionamento entre elas ficará mais complexo [3].
Os padrões de projetos são organizados em três grandes categorias, que são: padrões
de criação, padrões estruturais e padrões comportamentais [3].
Os padrões de criação dizem respeito a como se instanciar objetos. Gamma [3] define
cinco padrões de criação: Factory Method, Abstract Factory, Builder, Prototype e Singleton.
4
Esses padrões têm como objetivo ajudar o sistema a tornar-se independente da forma como os
objetos são criados, encapsulando o conhecimento sobre quais classes o sistema faz uso [3].
O padrão Factory Method, por exemplo, fornece uma interface para criar grupos de
objetos que se relacionam sem especificar suas classes concretas. Para isso, é definida uma
interface para criar um objeto, deixando a responsabilidade de quais classes instanciar para as
classes menos ancestrais. A Figura 2.1 apresenta um diagrama de classes para o padrão
Factory Method.
Figura 2.1 – Diagrama de classes para o padrão Factory Method (Fonte: Autor)
Pode-se observar na Figura 2.1 que é um padrão de projeto que visa encapsular a
criação de um objeto em um método [3] reduzindo o acoplamento da aplicação, portanto é um
padrão de projeto que pode e deve ser utilizado em conjunto com outros padrões de criação,
comportamentais ou estruturais.
Os padrões estruturais correspondem à forma com que as classes e objetos se associam
para construir estruturas ainda maiores e descrevem a forma em que os objetos são compostos
para se obter novas funcionalidades. São sete os padrões estruturais definidos por Gamma
[3]: Adapter, Bridge, Decorator, Proxy, Façade, Composite, Flyweight.
O padrão Adapter, também conhecido como Wrapper tem como objetivo adaptar o
uso de uma interface. Sua função é auxiliar no casting de uma interface de uma classe para
outra interface que contenha um comportamento mais apropriado para atender a um requisito
especifico [3]. Esse padrão nos permite reescrever alguns requisitos ou métodos pertencentes
5
à uma classe adaptada tornando a aplicação mais versátil. Além disso, não se faz necessário
utilizar outros objetos para se obter o tipo da classe desejada. A Figura 2.2 apresenta um
diagrama de classes para o padrão Adapter.
Figura 2.2 – Diagrama de classes para o padrão Adapter (Fonte: Autor)
Para utilizar um padrão estrutural como o Adapter é necessária a utilização de um
padrão de criação. O diagrama de classes da Figura 2.2 é uma evolução do padrão Factory
Method representado pela Figura 2.1 fazendo uso do Adapter.
Padrões comportamentais definem como os elementos interagem entre si além do
comportamento de cada um na aplicação, classes e objetos. Eles lidam com algoritmos e a
distribuição de responsabilidade entre as classes e objetos, descrevendo um padrão de
comunicação entre os objetos relacionados. Os padrões comportamentais descritos por
Gamma [3] são: Chain of Responsability, Command, Interpreter, Iterator, Mediator,
Memento, Observer, State, Strategy, Template Method e Visitor.
O padrão Observer, define uma relação de dependência um para muitos entre os
objetos que se relacionam, assim quando um objeto muda de estado todos os seus dependentes
serão notificados e atualizados também [3]. Esse padrão é facilmente identificado na camada
6
de controle do modelo de arquitetura em camadas de software MVC. A Figura 2.3 apresenta o
diagrama de classes para o padrão Observer.
Figura 2.3 – Diagrama de classes para o padrão Observer (Fonte: Autor)
Essas notificações demonstradas na Figura 2.3 poderiam ser feitas de forma manual,
contudo deixaria a aplicação com alto acoplamento e de difícil manutenção. Com a utilização
do Observer é possível reduzir o uso do relacionamento bidirecional entre as classes abstratas
e interfaces, obtendo baixo acoplamento e alta coesão.
Através do uso dos padrões vistos acima pode-se construir uma arquitetura mais
complexa, a arquitetura de software tem como objetivo estudar o sistema, analisando seus
componentes, as propriedades externamente visíveis e a forma como eles se relacionam de
acordo com sua natureza [4]. Um componente de um aplicativo de software nada, mas é do
que a abstração das classes, objetos, processos, rotinas, bibliotecas, base de dados e quaisquer
outras informações pertinentes ao que irá compor o software [4].
Na arquitetura de software devemos de certa maneira encapsular informações desses
componentes quando essas não forem relevantes para determinar como eles irão interagir.
Detalhes privados aos componentes não fazem parte da arquitetura em si [4].
7
Para arquitetar um software de maneira correta devemos considerar um maior escopo
de requisitos que compõem a aplicação, como por exemplo: confiabilidade, escalabilidade,
manutenção, segurança, custo de produção do produto além de tempo de vida do software.
Assim, a arquitetura deve representar a aplicação como um todo [4].
Padrões de arquitetura de software mais complexos como MVC, por exemplo, têm
como objetivo principal definir uma arquitetura para que os componentes de um aplicativo se
comuniquem entre si. Para isso, esse padrão define três camadas básicas para organizar seus
componentes, são elas: Modelo, visão e controlador, fazendo com que eles fiquem menos
acoplados, facilitando nas futuras alterações que a aplicação possa vir a sofrer [3].
A camada modelo é onde se encontram os principais requisitos da aplicação, ou seja, é
responsável por tudo que a aplicação irá realizar, se preocupando com a manipulação,
armazenamento e geração dos dados, de certa forma é um encapsulamento das informações e
comportamento independente de como será apresentado na camada de visão, contém toda a
regra de negócio a ser aplicada antes de realizar o mapeamento para persistir os dados.
A camada de visão não se relaciona diretamente com a camada modelo. Não importa
como os dados foram obtidos e nem de que forma foram ou muito menos de onde eles vêm.
Essa camada se preocupa apenas em exibir a informação para o usuário, na camada de visão
encontra-se o front-end da aplicação variando de acordo com a aplicação, ou seja, telas
desenvolvidas em Forms, Silverlight, páginas html, etc.
A camada de controle é responsável em determinar o fluxo da apresentação dos dados.
Ela funciona como uma camada intermediária entre a camada modelo e visão, controla e
mapeia as ações entre ambas. Nesta camada encontram-se classes responsáveis em transferir
os objetos entre as camadas, são as chamadas classes DTO (Data Transfer Object).
O MVC garante o baixo acoplamento entre as camadas, fazendo uso dos padrões de
projeto definido por Gamma [3]. A Figura 2.4 demonstra um elemento da camada modelo
sendo representado por três elementos distintos da camada visão.
8
Figura 2.4 – Diferentes representações para um mesmo modelo (fonte: [3])
O objetivo do MVC é aumentar a flexibilidade e a reutilização da aplicação, a camada
de visão deve garantir que reflita a situação atual da camada modelo, ou seja, do objeto que
representa. Assim, sempre que esse objeto sofrer alguma alteração ele irá notificar todas as
interfaces da camada de visão que dependem dele [3].
O MVC é aplicável a uma arquitetura maior. Ele deve ser capaz de desassociar os
objetos da camada de visão para que mudanças para uma determinada visão não afetem outra.
Isso pode ser obtido ao utilizar o padrão de projeto Observer. Outro aspecto do MVC é que se
podem ter pontos de vista idênticos para determinadas classes da camada de visão.
Comportamentos idênticos que podem ser reutilizados, por exemplo, conjunto de controle de
ações de um formulário pode ser único para vários formulários. Para isso, faz-se uso do
padrão de projeto Composite.
Uma visão usa uma instância de uma subclasse controladora para programar uma
estratégia de resposta particular. Se desejar programar uma estratégia diferente basta substituir
a instância com um tipo diferente de controlador. É ainda possível alterar o controlador de
uma visão em tempo de execução para permitir à visão mudar a maneira como ele responde à
entrada de ações do usuário. Tal relação entre a camada de visão e a camada controladora é
um exemplo do padrão de projeto Strategy. O MVC ainda utiliza os padrões de projeto
Factory Method e Decorator para especificar uma classe controladora padrão e para adicionar
atributos para a visão respectivamente, mas as principais relações da arquitetura MVC são os
padrões de projeto Observer, Composite e Strategy [3].
As principais do MVC é que ele permite: aumentar o número de clientes que
consomem os recursos da camada de modelo adicionando apenas novas visões e
controladores, tornar a aplicação escalável e facilitar a manutenção e testes, além de permitir
9
o desenvolvimento em paralelo das camadas que compõem o aplicativo [3]. As principais
desvantagens desse modelo é que ele necessita de um maior tempo para analisar e modelar o
sistema como um todo. Além disso, requer recursos humanos especializados, não sendo
aconselhado para aplicações de pequeno porte [3].
Atualmente, existem algumas variações do MVC, devido à influência de novas
tecnologias e também devido as necessidades que surgem no desenvolvimento de algumas
aplicações. Mas, tradicionalmente esse modelo possui o relacionamento e comportamento
entre as camadas como mostrado na Figura 2.5 [3].
Figura 2.5 – Modelo de arquitetura de software em camadas MVC (fonte: Autor)
10
3. FRAMEWORKS
O uso desse conceito surgiu há alguns anos e vem agregando adeptos com o passar do
tempo. Com isso, o uso de frameworks tem se tornado cada vez mais comum no ambiente de
desenvolvimento.
Os frameworks não se relacionam a um domínio ou problema específico de uma
determinada aplicação. O seu objetivo é compor um conjunto de funções interdependentes
que visam representar uma solução parcial para um determinado problema. Portando, ele deve
servir de ponto de partida para criar a aplicação, a estrutura de classes, interfaces e objetos
que o compõem devem ser utilizadas (estendidas, implementadas e instanciadas) de acordo
com o problema especifico [5].
Entre as principais vantagens na utilização de frameworks, podemos citar: ganho na
produtividade, diminuição de erros no aplicativo, tempo de desenvolvimento da aplicação
reduzido além de tornar a aplicação mais homogênea.
A arquitetura de um framework por mais simples que seja tem relação com padrões de
projeto de software. São conceitos bem interligados, contudo não são obrigatoriamente
dependentes.
O objetivo de um framework é separar as partes da aplicação que podem sofrer
alteração das que permaneceram estáticas [5]. As classes não sofrem alterações,
independentemente das aplicações que estejam utilizando o framework, podendo apenas ter
suas classes estendidas.
São várias as áreas relacionadas à tecnologia que utilizam de frameworks. Nos dias de
hoje é possível encontrar frameworks próprios para interface gráfica, incorporação de
arquitetura de software como MVC, construção de scripts, mapeamento objeto-relacional
entre outros.
Normalmente frameworks são criados para atender um determinado conjunto de
problemas, sendo assim empresas da área de tecnologia tendem a criar frameworks
corporativos ao identificar uma mesma solução para problemas que tendem a surgir durante a
construção de suas aplicações. Durante o ciclo de vida dos softwares desenvolvidos é notada a
presença de classes comuns em diferentes projetos, e um conjunto dessas classes tende a ser o
ponto inicial da criação de um framework.
11
De certa forma um framework deve ser algo reutilizável e estável. Contudo, para que
seja utilizado de forma correta deve possuir a documentação apropriada para entendimento de
seu funcionamento e utilização. Basicamente, um framework deve em sua documentação
mostrar a razão para a existência de determinada funcionalidade, deve descrever como utilizar
seus recursos além de detalhar o comportamento das classes e objetos relacionados a um
determinado recurso.
3.1 Classificação de frameworks
Os frameworks podem ser classificados de acordo com o ambiente em que será
utilizado, por exemplo, um framework pode ser utilizado em nível de domínio, aplicação ou
suporte [6].
Os frameworks de domínio também conhecidos como frameworks verticais
encapsulam conhecimento que estejam relacionados a um determinado domínio. Eles tendem
a solucionar boa parte da aplicação de acordo com o conhecimento agregado [6]. A Figura 3.1
apresenta o modelo de crescimento vertical de um framework.
Figura 3.1 – Representação do modelo vertical de frameworks (fonte: [6])
12
Os frameworks de aplicação são o oposto dos frameworks de domínio. O
conhecimento agregado é relacionado a vários domínios diferentes. Esse tipo de framework
também é conhecido como framework horizontal, pois resolve apenas parte da aplicação. A
Figura 3.2 apresenta o modelo de crescimento horizontal de um framework.
Figura 3.2 – Representação do modelo horizontal de frameworks (fonte: [6])
Por fim, temos os frameworks de suporte, pouco utilizados, pois fornecem serviços
relacionados ao sistema e não à aplicação.
3.2 Tipos de frameworks
Os frameworks podem ser correlacionados em três tipos de acordo como foram
concebidos, são eles: frameworks White-box (caixa branca), Black-box (caixa preta) e Gray-
box também conhecidos como híbridos [6].
Os frameworks caixa-branca fornecem classes abstratas que deverão ser especializadas
de acordo com a necessidade da aplicação. Assim, os desenvolvedores de sistema estendem o
framework utilizando o recurso de herança presente na OO, por exemplo, a classe Object da
linguagem de programação C#.
13
Os frameworks caixa-preta fornecem classes já utilizáveis em que os programadores
devem instanciar essas classes diretamente para utilizar os objetos que compõem o
framework, por exemplo, Swing (GUI) da linguagem de programação Java.
Por fim, tem-se os frameworks híbridos que agregam características dos frameworks
caixa-branca e caixa-preta. A grande maioria dos frameworks presentes no mercado se
enquadra nesse tipo, tanto os frameworks Open-Source como os frameworks corporativos. A
Figura 3.3 apresenta a relação entre os tipos de frameworks.
Figura 3.3 – Representação dos tipos de frameworks (fonte: autor)
3.3 Vantagens e desvantagens
Ao longo das especificações mencionou-se inúmeras vantagens e desvantagens do uso
de um framework, sabe-se que o custo final de um aplicativo de software está diretamente
relacionado ao tempo despendido para concebê-lo. Dessa forma, erros de identificação de
requisitos poderão elevar o custo final do produto. O aspecto mencionado anteriormente
também esta relacionado à escolha das ferramentas que serão utilizadas. Por exemplo, a
escolha do framework a ser adotado no desenvolvimento ou pela escolha de se desenvolver
um próprio framework que realize determinadas funcionalidades comuns a várias aplicações.
As principais vantagens do uso de frameworks são: baixo tempo de codificação, e uso
de soluções já homologadas, além dos desenvolvedores focarem em desenvolver apenas o que
é necessário e principalmente menor probabilidade de erros no código.
As principais desvantagens do uso de frameworks são: necessidade de recursos
humanos especializados, a não disponibilização de todo código fonte que compõe o
framework, mudança de foco no desenvolvimento e a necessidade de desenvolver em uma
linguagem especifica [6].
14
4. FRAMEWORK CORPORATIVO
Para a realização deste trabalho, foi estudado um framework corporativo criado por
uma empresa do setor de desenvolvimento de software. Contudo, o framework em questão
abrange todas as camadas de uma aplicação possuindo, assim, uma complexa arquitetura. A
fim de refinar a pesquisa será abordado apenas a sua camada de persistência, sendo
comparada com o framework NHibernate, próprio para realização de persistência.
O framework corporativo atualmente utiliza ferramentas de mercado como base para
sua construção, como: framework .Net, linguagem de programação C# e IronPython,
plataforma web Asp.net e Silverlight rodando sobre o IIS, Internet Information Service. Ele
permite soluções para diferentes bancos de dados, utilizando como comunicação ADO.Net
(ActiveX Data Objects) para acesso ao banco de dados utilizando conceitos CSLA
(Component-based, Scalable, Logical Architecture) e conceitos do Microsoft Entity
Framework, esse por sua vez realiza apenas persistência como o NHibernate.
O objetivo da empresa ao criar esse framework não foi competir com tecnologias de
mercado, como vimos todas as tecnologias de mercado são utilizadas a fim de criar soluções
de mais alto nível, garantindo maior produtividade e evitando que o setor de desenvolvimento
adote diferentes soluções para diferentes projetos.
Os desenvolvedores da empresa podem utilizar a linguagem de programação C# para
desenvolvimento e manutenção das aplicações da empresa adotando como base o framework
corporativo que fornece vários recursos, inclusive persistência de dados, contudo deverá
manter os padrões estabelecidos pela ferramenta.
4.1 Arquitetura do framework corporativo
A definição da arquitetura para o framework segue os seguintes requisitos:
O desenvolvedor deve ser capaz de programar a regra de negócio da aplicação em C#
não procedural, mantendo os conceitos de OO podendo herdar comportamento de classes do
próprio framework.
O aplicativo deve ser capaz de realizar interoperabilidade com outras tecnologias, ou
seja, aplicativos antigos da empresa não devem ser necessariamente reescritos em C#.
15
Como vimos anteriormente para o uso de um framework faz-se necessário organizar as
aplicações em camadas, esse por sua vez engloba todas as camadas de uma aplicação como
mostra a Figura 4.1, contudo detalharemos apenas a camada de persistência.
Figura 4.1 – Camadas básicas de um aplicativo (fonte: [7])
Para o framework corporativo que iremos estudar, a camada de persistência é uma
mescla de duas camadas vistas acima, são elas: Lógica de negócio e Lógica de acesso a dados,
a seguir demonstraremos um diagrama que compõe toda a estrutura do framework, lembrando
que ele foi concebido a fim de garantir a interoperabilidade entre diferentes tecnologias.
Figura 4.2 - Arquitetura do framework corporativo (fonte: [7])
Se observarmos na Figura 4.2, notamos que regras de negócio escritas em C# podem
ser carregadas e executas a partir de um objeto VBA (Visual Basic) ou diretamente pelo
servidor de aplicação, esse processo já existia anteriormente para regras de negócio escritas
16
em Delphi com a diferença de que as mesmas não poderiam ser acessadas diretamente pela
aplicação desktop, fazendo com que sempre seja utilizado um objeto escrito em VBA.
4.2 Características do framework corporativo
Dentre as principais características do mecanismo de persistência do framework
estudado estão:
Abstrair do desenvolvedor o mecanismos de persistência.
Manter o baixo acoplamento entre o objeto de interação com os dados e a fonte
de dados em si.
Abstrair o controle de LOG de alteração aos dados.
Interagir com os dados através de programação OO, visando assim entre outros
benefícios a reutilização. Por exemplo, classes POCO (Plain Old CLR Object)
podem ser incorporadas em um projeto comum aos demais projetos podendo
assim ser reutilizada ou estendida para se incorporar uma nova regra.
Diminuir o máximo possível à necessidade de o programador escrever
instruções SQL (Structure Query Language) de consulta ou persistência.
Para que todas as características vistas acima funcionem corretamente foi adotada para
esse framework a utilização de “Entidades” para desempenhar a manipulação dos dados
(CRUD - Create, Read, Update and Delete), estas entidades recebem as informações através
de um serviço e esse é responsável em realizar a persistência dos dados efetivamente.
4.3 Processo de criação e utilização do framework corporativo
Esse framework não incorpora todas as funcionalidades de persistência, é comum nos
comerciais permitir ao desenvolvedor criar a aplicação e a partir do mapeamento de suas
classes obterem as entidades do banco de dados, contudo para esse framework não se aplica,
devido ao controle de permissões e acesso além de deixar a cargo dos DBA’s (Data Base
17
Administrator) a padronização e criação de entidades, sendo assim o framework corporativo
não permite aos desenvolvedores utilizar uma abordagem top-down como veremos a seguir.
Para que seja possível criar um projeto é necessário que o framework esteja instalado e
configurado corretamente, a partir daí basta adicionar as DLL’s (Dynamics Link Library) no
projeto C#, as principais são:
EntidadeBase.dll.
EntidadeNegocio.dll.
EntidadeServico.dll.
4.4 Configuração do framework corporativo
A configuração e instalação desse framework é extremamente complexa, pois envolve
a configuração de outros componentes desenvolvidos pela empresa, além disso, ele
compartilha de DLL’s das entidades de serviço com o aplicativo desktop, o que os tornam
interligáveis. Contudo para aplicações web, considerando que esteja tudo configurado e
instalado para os demais componentes, basta configurar o web.config para que ele reconheça
qual o servidor em que se encontra a aplicação.
Por fim a configuração de onde se encontra o banco de dados é realizada através da
própria interface gerada de forma automática pela aplicação, atualmente esse framework
suporta comunicação apenas com os SGBD’s (Sistema Gerenciador de Banco de Dados):
Oracle.
SQLServer 2005.
SQLServer 2008.
DB2.
Cachê.
18
4.5 Mapeamento objeto-relacional
Todo o mapeamento é através de definições de entidades, classes POCO que mapeiam
uma entidade já existente no banco de dados, o framework incorpora várias classes para
realização das associações básicas de um SGBD, sendo assim faz-se necessário ao
desenvolvedor utilizar destas classes para realizar a persistência dos dados, a arquitetura das
classes envolvidas é apresentada abaixo.
Figura 4.3 – Arquitetura das classes e entidades do framework (fonte: [7])
O mapeamento de entidades nada, mas é que relacionar a aplicação com a estrutura do
banco de dados para que seja efetuada a persistência das informações providas da própria
aplicação.
Para agilizar o processo de desenvolvimento incorporado ao próprio framework estão
recursos que permitem ao desenvolvedor gerar as classes POCO.
Como vimos o mapeamento é realizado através de entidades, mas o framework aqui
estudado define como entidade nada, mas do que um objeto de negócio, sendo uma espécie de
caixa preta que contêm os dados e as lógicas de negócio, assim sendo, o desenvolvedor não
necessita conhecer a origem dos dados e nem como as lógicas de negócios são acionadas.
Qualquer tentativa de manipulação dos dados passará através da lógica de negócio,
assegurando que as regras de negócio sempre sejam aplicadas, garantindo a integridade do
objeto de negócio.
19
Através desta arquitetura a entidade não tem conhecimento se está sendo utilizada por
uma interface WinForms, Silverlight, Asp.Net ou por uma regra de negócio no servidor da
camada de negócio, as principais aplicações de persistência são:
Um registro de uma entidade em um banco de dados relacional.
O retorno da execução de uma lógica de negócio.
O retorno de uma stored procedure que obtém dados de diversas entidades.
Tudo que o desenvolvedor precisa fazer é interagir com os objetos referentes às
classes do framework, não se preocupando com transações, persistência, validações, etc.
A classe “EntidadeBase”, como o próprio nome sugere é a base para qualquer
entidade, nela estão as propriedades que mapeiam os campos das entidades e o mecanismo
responsável em realizar de fato a persistência. A seguir tomaremos como exemplo o
mapeamento de uma entidade.
Figura 4.4 – Exemplo de entidade do banco de dados a ser mapeado (fonte: [7])
Figura 4.5 – Objeto POCO instanciado da entidade ACTIVITY (fonte: [7])
20
Como vimos às classes responsáveis em realizar a persistência realizam uma chamada
a um serviço, para isso é necessário que a mesma classe POCO esteja serializada e mapeada
no serviço de entidades do framework, esse processo é automático, a seguir segue a classe
apresentada acima serializada utilizada para execução dos serviços.
Figura 4.6 – Objeto serializado da entidade ACTIVITY (fonte: [7])
Como veremos os relacionamentos de dependência são mapeados através de uma
classe denominada “EntidadeAssociacao”, a mesma realiza o mapeamento um-para-um,
muitos-para-um ou muitos-para-muitos, o que define o tipo de mapeamento é a existência de
outra classe com vínculo do tipo “EntidadeAssociacao”.
Analisando a Figura 4.7 podemos observar a entidade “ACTIVITY” mapeada através
de uma classe POCO do tipo “EntidadeBase”, a mesma classe implementa a interface
INotifyPropertyChanged, porém isto é opcional.
Diferentemente de Java as anotações em uma classe são denominadas como atributos
em C#, partindo desse conceito podemos avaliar o primeiro atributo da classe, o atributo
21
“DefinicaoEntidade” que indica qual é a entidade do banco de dados que será mapeada, em
seguida temos o atributo “Servico” que associa a classe POCO a um serviço criado de forma
automática pelo framework, para isso é passado por parâmetro a URL (Uniform Resource
Locator) e qual a entidade de serviço será executa, em seguida o nome da classe que não
necessita ser o mesmo nome da entidade do banco de dados.
Também podemos observar que a classe estende o comportamento de uma
“EntidadeNegocio” que recebe como parâmetro o tipo a ser mapeado, esse por sua vez se faz
necessário para acessar informações que não estão no domínio da classe POCO, por exemplo,
uma chave estrangeira na classe POCO em si nada mas é do que um valor numérico, sendo
assim para acessar os demais campos da entidade ao qual a chave estrangeira referencia basta
acessar pelo objeto “Fields”, que o framework se encarrega de buscar estar informações
apenas para consulta sem ser necessário mapear esta classe.
São inúmeras as possibilidades através desse mapeamento, as classes POCO’s podem
ser herdadas e para cada método de acesso aos atributos podem incorporar regras e negócio.
Figura 4.7 – Classe POCO da entidade ACTIVITY (fonte: [7])
22
A maneira em que o mapeamento é realizado está diretamente associados às
necessidades da empresa, regras internas são executadas automaticamente o que dificulta
comparar alguns aspectos com outros frameworks, as definições de constraints são
automáticas na classe “EntidadeNegocio”, desta forma o programador não necessita se
preocupar com esse tipo de mapeamento herdado do banco de dados.
23
5. FRAMEWORK NHIBERNATE
O framework NHibernate é semelhante ao framework Hibernate para Java, porém
voltado para tecnologia .Net. Ele lida diretamente com a persistência simples dos dados,
capaz de interagir com diferentes sistemas de gerenciamento de banco de dados.
Seu funcionamento visa a simplicidade, dado um XML (Extensible Markup
Language) de suas entidades e relacionamentos, o NHibernate gera automaticamente o SQL
responsável em armazenar e carregar os objetos, outra vertente é criar classes cujos atributos
serão metadados de mapeamento no próprio código fonte, não sendo necessária a utilização
de um arquivo XML.
Esse framework suporta persistência transparente, ou seja, as classes que representam
objetos a serem mapeados não são obrigatoriamente forçadas a seguir um modelo de
programação restritiva, isso permite projetar a lógica de negócio usando classes .Net simples
[8] denominadas POCO (Plain Old CLR Object).
5.1 Arquitetura do NHibernate
Por meio de uma visão de alto nível da arquitetura do framework NHibernate pode-se
observar a utilização do banco de dados e informações de configuração para que o framework
consiga fornecer serviços de persistência de dados e recuperar objetos já persistidos para a
aplicação.
Figura 5.1 – Visão de alto nível da arquitetura do framework NHibernate (fonte: [9])
24
A seguir temos uma visão mais detalhada da arquitetura em tempo de execução, nota-
se que o NHibernate é flexível e suporta várias abordagens, a arquitetura fornece ao aplicativo
suas próprias conexões ADO .Net e se encarrega de gerenciar suas transações, para isso faz-se
uso de um subconjunto de API’s (Application Programming Interface) do próprio framework.
Figura 5.2 – Visão da arquitetura do framework NHibernate (fonte: [9])
Nota-se que a arquitetura abstrai a aplicação da base ADO .Net deixando os detalhes e
gerenciamento a cargo das API’s do framework. A seguir segue um diagrama contendo todos
os objetos que compõem a arquitetura do framework.
Figura 5.3 – Visão detalhada da arquitetura do framework NHibernate (fonte: [9])
25
Como vimos acima são vários os objetos que compõem sua arquitetura, a seguir temos
a definição de alguns destes objetos e qual a importância de cada um deles.
O primeiro objeto é o Session cujo namespace é NHibernate.ISession, esta é a
principal interface entre a aplicação e o NHibernate, é um objeto de curta duração responsável
por uma comunicação realizada entre o aplicativo e o banco de dados onde serão persistidas
as informações.
O segundo objeto é o SessionFactory cujo namespace é NHibernate.ISessionFactory,
esta interface mantém um cache de todo mapeamento compilado, permite a aplicação criar
sessões a partir do arquivos de configuração, fornecendo um provedor para a conexão através
da interface IConnectionProvider.
As demais interfaces ITransaction, IConnectionProvider, IDriver,
ITransactionFactory são opcionais ao se criar uma aplicação [9].
5.2 Principais características do NHibernate
Dentre as principais características desse framework destacam-se o fato de utilizar um
modelo de programação natural, ou seja, possui suporte a OO e todas as suas características,
além disso, suporta composição de estruturas nativas do .Net como coleções de objetos e
coleções genéricas, dando suporte para uma ampla variedade de mapeamento de coleções e
objetos sem utilizar códigos intermediários durante sua etapa de construção.
O NHibernate garante diferentes formas de como se obter as informações do banco de
dados, para isso é criado o objeto desejado nas consultas para representar um dado ou uma
coleção de dados.
Permite personalizar o SQL tanto para consulta como para persistência dos objetos
mapeados, além disso, permite a execução de alguns procedimentos nativos para quando o
sistema gerenciador de banco de dados utilizado for o Microsoft SQLServer.
Por fim podemos destacar a característica que faz com que seja aceitável a realização
desta pesquisa, esse framework é livre, ou seja, open source e é licenciado sob a LGPL
(Lesser GNU (General Public License) Public License).
26
5.3 Processo de criação e utilização do NHibernate
O processo de criação de uma aplicação que utiliza o NHibernate consiste em etapas
simples, a princípio devemos determinar qual das abordagens utilizaremos com relação a
criação da base de dados, ou seja, devemos determinar se as entidades que irão compor a base
de dados serão criadas a partir da aplicação (top-down) ou se a aplicação será criada a partir
da base de dados (bottom-up).
Não definiremos uma ordem para as etapas de criação, pois as ordens das mesmas se
alteram de acordo com a abordagem adotada na criação da aplicação como mencionado
anteriormente, contudo um projeto que utilize dos recursos do NHibernate deverá conter as
seguintes etapas:
Criação da base de dados e das entidades relacionais.
Criação das classes que irão acessar os objetos mapeados.
Criação do arquivo XML de mapeamento.
Criação do arquivo XML de configuração do NHibernate.
Utilização a API que contém as DLL’s do framework.
É possível eliminar a etapa de criação do arquivo de mapeamento das entidades do
banco de dados devido ao fato do mesmo mapeamento poder ser realizado diretamente na
classe POCO que irá persistir os dados, para que esse mecanismo funcione os atributos das
classes POCO deverão ser identificados através de atributos, estes atributos irão determinar o
comportamento de cada objeto mapeado, como, por exemplo, se ele representa uma chave
estrangeira, se ele possui constraints, se ele representa um chave primária ou qualquer outra
característica provida do mecanismo de um SGBD.
Ao contrário do Entity Framework que já vem incorporado ao Visual Studio, o
NHibernate requer uma instalação manual, para isso basta realizar download do mesmo, e
quando criar um novo projeto adicionar as seguintes DLL’s [8]:
NHibernate.dll.
NHibernate.ByteCode.Castle.dll.
Castle.Core.dll.
27
5.3.1 Abordagem bottom-up
Esta abordagem consiste em criar uma aplicação utilizando o NHibernate para quando
o banco de dados que será persistido já exista, além de possuir sua estrutura de entidades
criadas, isto inclui os relacionamentos entre chaves primárias e estrangeiras, portanto basta ao
desenvolvedor criar uma classe POCO que represente a estrutura da entidade no banco de
dados, criar o arquivo de mapeamento em XML caso não opte em utilizar atributos nos
objetos da classe de mapeamento, criar o arquivo de configuração do NHibernate e adicionar
as DLL’s do framework na aplicação, a Figura 5.4 ilustra o comportamento da abordagem
mencionada acima levando em consideração a utilização de um XML para mapear o banco de
dados ao invés de utilizar atributos nas classes POCO.
Figura 5.4 – Utilização botton-up do NHibernate (fonte: autor)
28
5.3.2 Abordagem top-down
Diferentemente da abordagem mencionada anteriormente, esta por sua vez consiste em
criar um banco de dados a partir das definições realizadas no arquivo XML de mapeamento
ou através das anotações realizadas na definição da classe POCO, além é claro das definições
realizadas nos atributos desta mesma classe, ou seja, a aplicação será responsável em definir
um banco de dados e todas as suas configurações e criar todas as entidades do mesmo bem
como seus relacionamentos de integridade e constraints, a Figura 5.5 ilustra o comportamento
desta abordagem levando em consideração a utilização de um arquivo XML para realizar o
mapeamento.
Figura 5.5 – Utilização top-down do NHibernate (fonte: autor)
5.4 Configuração do NHibernate
Como vimos anteriormente umas das etapas necessárias para utilização desse
framework é a criação de um arquivo XML de configuração, contudo nem sempre se faz
necessária à criação desse arquivo, estas configurações definem informações do provedor,
dialeto, driver e string de conexão do banco de dados usado para persistência.
29
A principio podemos criar o arquivo “hibernate.cfg.xml” e atribuir todas as
propriedades necessárias para que a aplicação conheça o banco de dados, mas como
mencionado anteriormente estas configurações não devem necessariamente conter nesse
arquivo.
Quando chamado o método Configure() do assembly NHibernate.Cfg.Configuration
pertencente a DLL NHibernate.dll já adicionada ao projeto como vimos no processo de
criação, fará com que o NHibernate procure esse arquivo para aplicar as configurações, caso
ele não encontre procurará as mesmas informações nos arquivos de configuração web.config
ou app.config para aplicações web ou desktop respectivamente.
A Figura 5.6 demonstra como ficaria a configuração do NHibernate dentro do arquivo
web.config para uma aplicação web, para isso a tag <ConfigSections> que pertence à
<configuration> deve conter uma nova seção para depois adicionar a configuração do
NHibernate com o nome dessa seção [10].
Figura 5.6 – Configuração do NHibernate dentro do web.config (fonte: [10])
Atualmente os principais bancos suportados pelo NHibernate são: Microsoft SQL
Server 2008/2005/2000, Microsoft Access, Oracle, Firebird, PostgreSQL, DB2 UDB, MySQL
e SQLLite [11].
30
Para alterar o banco de dados a ser utilizado, basta alterar no arquivo de configuração
as tags responsáveis pelo dialeto, provedor, driver e string de conexão, abaixo segue tabela de
configuração dos SGBD’s mencionado anteriormente [11].
Tabela 5.1 – Configuração de banco de dados para o NHibernate (fonte: autor)
SGBD Dialeto Provedor Driver String de Conexão
SQL Server NHibernate.Dial
ect.MsSql2005Di
alect
NHibernate.Connect
ion.DriverConnecti
onProvider
NHibernate.D
river.SqlCli
entDriver
Server=(local);
Initial Catalog=
dbname;User
Id=user;Password=
Microsoft
Access
NHibernate.JetD
river.JetDialec
t,
NHibernate.JetD
river
NHibernate.Connect
ion.DriverConnecti
onProvider
NHibernate.J
etDriver.Jet
Driver,
NHibernate.J
etDriver
Provider=Microsoft.J
et.OLEDB.4.0;
Data Source=
Teste.mdb
Firebird * NHibernate.Dial
ect.FirebirdDia
lect
NHibernate.Connect
ion.DriverConnecti
onProvider
NHibernate.D
river.Firebi
rdClientDriv
er
Server=localhost;
Database=C:nhibernat
e.fdb;
User=SYSDBA;Password
=masterkey
Postgre
SQL
NHibernate.Dial
ect.PostgreSQLD
ialect
NHibernate.Connect
ion.DriverConnecti
onProvider
NHibernate.D
river.Npgsql
Driver
Server=localhost;ini
tial
catalog=nhibernate;U
ser
ID=nhibernate;Passwo
rd=********;
DB2 UDB * NHibernate.Dial
ect.DB2Dialect
NHibernate.Connect
ion.DriverConnecti
onProvider
NHibernate.D
river.OdbcDr
iver
driver={IBM DB2
ODBC
DRIVER};Database=db;
hostname=host;port=p
ort;protocol=TCPIP;
uid=uid; pwd=pwd
MySQL NHibernate.Dial
ect.MySQLDialec
t
NHibernate.Connect
ion.DriverConnecti
onProvider
NHibernate.D
river.MySqlD
ataDriver
Database=test;Data
Source=localhost;
User Id=blah;
Password=blah
* Possuem outras configurações adicionais. * Obs: As strings de conexão deverão ser alteradas de acordo com a aplicação.
5.5 Mapeamento objeto-relacional
O mapeamento de entidades e classes consiste em relacionar de forma direta a
aplicação com o banco de dados onde serão persistidas as informações providas da própria
aplicação, porém para isso é imprescindível que a as classes POCO possuam a mesma
estrutura da entidade ao qual ela representa.
31
Apesar de o mapeamento ser algo simples de se realizar já existem ferramentas
capazes de realizar essa etapa, em busca simples pela internet encontramos uma aplicação
gratuita para realizar o mapeamento da camada de persistência de nossa aplicação,
FluentNHibernate [12] por exemplo, gera um mapeamento fluente do banco de dados.
Esse framework permite a realização do mapeamento de três formas distintas, a
primeira delas através do uso de um arquivo XML, a segunda através de atributos na própria
classe POCO, e uma terceira maneira denominada de mapeamento fluente, que tem como
objetivo utilizar o que tem de melhor das duas outras formas de mapeamento.
A seguir será demonstrada as três maneiras distintas de se realizar o mapeamento do
banco de dados para o NHibernate, para exemplo tomarei como referência a entidade Cliente,
composta pela estrutura abaixo:
Tabela 5.2 – Estrutura da entidade cliente (fonte: autor)
Coluna Chave Primária Tipo Nulo
Id Sim Inteiro Não
PrimeiroNome Não String Não
UltimoNome Não String Não
DataNascimento Não DateTime Sim
Demonstramos como a classe cliente deve ser mapeada em XML para que mantenha a
mesma estrutura e comportamento visto acima, a grande vantagem desse tipo de mapeamento
em XML é que é o mais antigo dentre os três, isto nos leva a crer que esse já tenha atingido
uma maturidade maior para controle de aplicações, dentre as desvantagens está o fato da
configuração não ser algo tão trivial e principalmente pelo fato de se houver alterações no
banco, faz-se necessário alterar esse arquivo e a classe POCO ao qual ele se relaciona.
32
Figura 5.7 – Mapeamento XML da entidade cliente (fonte: autor)
Figura 5.8 – Classe POCO para mapeamento da Figura 6.7 (fonte: autor)
A segunda maneira de mapear a classe Cliente é através da definição de atributos na
classe POCO e em suas propriedades, em Java estes atributos são chamados de anotações.
Esse mapeamento é realizado diretamente na classe, assim não se faz necessária à utilização
de um arquivo XML.
As grandes vantagens desse tipo de mapeamento é que as alterações ficam
centralizadas em apenas um artefato do projeto além de facilitar a compilação do mesmo,
porém a desvantagem é que a classe POCO começa a ficar poluída com muitas linhas de
código deixando-a fortemente acoplada ao framework NHibernate.
33
Figura 5.9 – Classe POCO mapeada da entidade cliente (fonte: autor)
Por fim a última maneira de se realizar o mapeamento no NHibernate, o mapeamento
fluente é a mais recente opção para .Net, trata-se de uma combinação do que a de melhor nos
dois outros mapeamento vistos até então, ou seja, fácil compilação, classes limpas e pequenas.
Figura 5.10 - Classe POCO para mapeamento fluente da entidade cliente (fonte: autor)
Figura 5.11 – Classe de mapeamento para entidade cliente (fonte: autor)
34
É importante ressaltar que o mapeamento deve ser construído em torno da declaração
das classes de persistência e não em torno das entidades do banco de dados [10].
Abordaremos alguns conceitos do NHibernate adotados no mapeamento de uma classe, além
disso ressalta-se que todos elementos, atributos e valores presente em um mapeamento via
XML também constam nos demais tipos de mapeamento visto anteriormente.
5.5.1 Mapeamento de tabelas-classes
Não entrarei em muitos detalhes do funcionamento de todos os atributos desse
elemento, são inúmeras as propriedades que podem ser alteradas para cada atributo e
consequentemente o comportamento da classe também será alterado, os principais atributos
do elemento Class são:
Name, consiste no nome da classe .NET de persistência (ou interface),
incluindo seu assembly.
Table, o nome da entidade ao qual ela se refere no banco de dados.
Schema, permite sobrepor o esquema definido no elemento raiz de
mapeamento.
5.5.2 Mapeamento de chave primária
Classes mapeadas devem declarar a chave primária da entidade de banco de dados. A
maioria das classes também possui uma propriedade com o identificador único de uma
instância. O elemento <id> define o mapeamento desta propriedade para a coluna de chave
primária.
Esse elemento possui os atributos name, type, column, unsaved e access e também
pode possuir um gerador de código específico, para isso deve ser declarado um atributo
generator para ele, para entidades com chave primária composta, deve-se utilizar o atributo
composite-id.
35
5.5.3 Mapeamento muitos-para-um
Consiste em criar uma associação para uma outra classe de persistência, o modelo
relacional que será criado no banco de dados é o muitos para um, alguns dos atributos que
compõem esse elemento são:
Name, o nome da propriedade.
Column, o nome da coluna.
Class, o nome da classe de persistência que será relacionada.
Cascade, é a operação que deve ser realizada para o objeto relacionado ao
objeto pai.
Um exemplo típico de declaração desse mapeamento em XML:
“<many-to-one name="Produto" class="Produto" column="PRODUTO_ID"/>”.
Figura 5.12 – Atributos e valores, mapeamento muito-para-um XML (fonte: [10])
5.5.4 Mapeamento Um-para-Um
Há duas variedades para esse tipo de associação, a primeira delas é a associação de
chave primária e a segunda de chave estrangeira única, para a primeira delas não é necessário
uma coluna extra na entidade. Para uma associação de chave primária, por exemplo, entre a
entidade “Pessoa” e “Empregado”, deve-se realizar o mapeamento mostrado pela Figura 5.13.
36
Figura 5.13 – Mapeamento um-para-um em arquivo XML (fonte: [10])
Garantindo para que a chave primária para as duas entidades sejam sempre iguais, ou
seja, a instância recém-salva de “Pessoa” é então atribuído o mesmo valor chave para a
instância “Empregado”, de forma alternativa podemos realizar esse mesmo tipo de
relacionamento da seguinte maneira:
“<many-to-one name="Pessoa" class="Pessoa" column="PESSOA_ID"
unique="true"/>”.
Esta associação passa a ser realizada de forma bidirecional, adicionando a seguir para
o mapeamento de “Pessoa”.
“<one-to-one name="Empregado" class="Empregado" property-ref="Pessoa"/>”.
Figura 5.14 – Atributos e valores, mapeamento um-para-um XML (fonte: [10])
37
6. COMPARAÇÃO DOS FRAMEWORKS
O fato do uso de um framework como base para a construção de um aplicativo de
software traz inúmeras vantagens ao processo de desenvolvimento, entre elas podemos citar a
produtividade da equipe, a capacidade da aplicação de agregar novos recursos, o aumento da
capacidade de alteração em recursos já desenvolvidos e por fim o fato de que em sua maioria
os frameworks já possuem um alto nível de maturidade com relação a vários aspectos, como
por exemplo, efetividade no mapeamento de uma base de dados.
Esta seção apresenta a comparação realizada entre o framework NHibernate e o
framework corporativo. Para isso foram comparados os aspectos de persistência de ambos
para identificar o quanto eles influenciam na produtividade de uma equipe de persistência,
levando em consideração a capacidade que ambos apresentam com relação ao crescimento de
uma aplicação e principalmente o impacto causado por alterações de funcionalidades já
desenvolvidas. Para levantamento dos aspectos mencionados foi aplicado um questionário,
Apêndice A, junto a desenvolvedores e analistas que trabalham com ambas as tecnologias a
fim de levantar as dificuldades, vantagens e limitações com relação ao uso de ambos os
frameworks.
A produtividade de uma equipe de desenvolvimento de software está diretamente
relacionada ao tempo desprendido na criação do software com relação à quantidade de
recursos adicionados ao desenvolvimento.
O uso de um framework aumenta consideravelmente a produtividade por permitir
reutilização de código fonte e por fornecer classes e interfaces com mecanismos já
implementados, contudo identificar o que pode ser ou não comum a vários projetos para que
sejam desacoplados da aplicação a fim de serem reutilizados em outras circunstâncias faz com
que o desenvolvedor tenha um nível de abstração maior com relação às regras de negócio e
principalmente com relação às ferramentas que ele utilizará [6].
Como citado anteriormente podemos definir produtividade como sendo a relação de
recursos disponíveis por tempo gasto, mas por se tratar de serviços de software deve-se levar
também em consideração a qualidade, eficácia e eficiência dos serviços oferecidos pela
empresa de TI (Tecnologia da Informação).
38
Com base nas informações coletadas no decorrer desse trabalho podemos mensurar o
quão produtivo pode se tornar o ciclo de desenvolvimento de um aplicativo de software ao
utilizar o framework corporativo ou o framework NHibernate, podendo chegar a conclusãode
qual entre ambos é mais efetivo.
É possível observamos que para os frameworks atingirem o máximo de sua
produtividade é interessante, porém não obrigatório que a aplicação que faça uso dos de tais
frameworks esteja também arquitetada de maneira correta. A aplicação deve estar organizada
em camadas como, por exemplo, sugerido pelo modelo MVC a fim de possibilitar na camada
modelo o uso de um framework de persistência de dados.
Com base nos dados coletados pelo questionário aplicado junto aos desenvolvedores e
analistas de sistemas que utilizam do framework NHibernate [Apêndice A] obtemos o gráfico
da Figura 6.1 referente a questão um do questionário, que demonstra o tempo estimado pelos
desenvolvedores para começar a produzir em nível satisfatório, ou seja, através do uso do
NHibernate os desenvolvedores devem ser capaz de realizar o mapeamento objeto-relacional
(atributos e entidades), realizar querys complexas, realizar a persistência dos dados, estruturar
suas classes POCO utilizando das práticas de OO (herança, encapsulamento, polimorfismo,
abstração e coesão) e estruturar a aplicação garantindo o controle de transação oferecido pelo
framework.
Figura 6.1 – Tempo de adaptação do usuário do NHibernate (fonte: autor)
39
Como observamos na Figura 6.1 sessenta por cento dos desenvolvedores usuários do
NHibernate não levaram mais do que trinta dias de estudos e treinamentos para integrar uma
equipe de desenvolvimento utilizando o framework NHibernate de forma efetiva, ou seja,
começar a produzir de forma satisfatório como definido acima.
É comum no ambiente de desenvolvimento de software os recursos humanos levarem
mais tempo para se adaptarem ao processo de trabalho devido ao curto tempo entre o
surgimento de novas tecnologias, desta forma podemos afirmar que o tempo de aprendizagem
do NHibernate é de certa forma considerado baixo o que viabiliza a adoção do mesmo.
A seguir temos o demonstrativo do tempo estimado pelos desenvolvedores usuários do
framework corporativo estudado neste trabalho.
Figura 6.2 – Tempo de adaptação do usuário do framework corporativo (fonte: autor)
Podemos observar que o tempo médio para que um desenvolvedor comece de fato a
produzir utilizando o framework corporativo é muito maior do que tempo demandado
NHibernate. Um dos principais motivos alegados pelos desenvolvedores é a falta de
documentação apropriada, além de não existir conhecimento na comunidade de software com
relação a tal framework.
É comum no decorrer do processo de criação de um aplicativo nos deparar com novos
requisitos que talvez não tenham sido implementados pela equipe em nenhum momento.
Dessa forma, cabe aos programadores de sistemas desenvolverem uma solução ou buscar por
40
experiências fora do ambiente de trabalho. Contudo, para o framework corporativo esse tipo
de recurso não se aplica, o que afeta diretamente a produtividade dos programadores.
Portanto, existem fortes indícios de que o framework NHibernate é de fato mais
produtivo que o framework corporativo. Porém, outros aspectos devem ser analisados para
tornar o framework corporativo mais prático mesmo sendo pouco produtivo. Um aspecto
simples é restringir ao DBA a criação das entidades e campos no banco de dados, esse aspecto
varia de acordo com as regras e padrões da própria empresa que o utiliza.
A seguir temos um quadro comparativo com relação às ações de persistência capazes
de serem executadas pelos frameworks aqui comparados.
Tabela 6.1 – Comparação das ações de mapeamento dos frameworks (fonte: autor)
Framework Consulta Inserção Gravação Remoção Criação
Corporativo Sim Sim Sim Sim Não
NHibernate Sim Sim Sim Sim Sim
Com base na Tabela 6.1 podemos notar que o framework corporativo não incorpora ao
seu mecanismo de persistência a criação de entidades e campos a partir de suas classes
mapeadas. Isso não pode ser considerado uma deficiência pelo fato de que ele foi concebido
com esse intuito para garantir as regras do processo de criação de aplicações da empresa que o
criou. Se pensarmos nesse cenário, podemos chegar a conclusão de que o NHibernate não
atenderia tal necessidade pelo fato de permitir ações de criação.
Para que um framework seja passível de ser utilizado um dos principais requisitos que
ele deve suprir é a escalabilidade, ou seja, a capacidade que ele possui em suportar o aumento
de consumo de seus recursos [6]. Como esta pesquisa contempla frameworks de persistência
de dados e que cada requisição feita ao banco de dados irá utilizar seus recursos, logo
podemos definir que o aumento de uso de recursos do framework estará diretamente
relacionado com o aumento de acesso a base de dados, independentemente da ação a ser
executada.
Ambos os frameworks dão suporte a uma grande gama de requisições, o consumo de
memória de ambos é satisfatória para gerenciar uma requisição de acesso ao banco de dados,
41
ou seja, não há aumento gradativo de consumo de memória a cada iteração (Session,
Transaction), pois ambos não apresentam vazamento de memória, sendo assim o garbage
collector do framework .Net consegue limpar da memória o que não está mais em uso. Assim,
os recursos de hardware do servidor limitam de fato o quão escalável é o framework.
Como mencionado anteriormente o framework corporativo incorpora um serviço de
entidades para permissão de usuários em cada entidade do banco de dados, logo seu consumo
de memória é maior se comparado com o NHibernate, por exemplo, para cada persistência
que ele for realizar será necessário realizar consultas em outras entidades para identificar se
aquele usuário possui uma definição de nível de acesso com permissão de gravação para a
entidade a ser persistida.
Por fim devemos avaliar o quão adaptáveis são ambos os frameworks, ou seja, eles são
capazes de suportar mudanças consideráveis no meio de um ciclo de vida de uma aplicação
sem impactar diretamente no que já foi desenvolvido, por exemplo:
Mudanças com relação ao SGBD.
Mudanças com relação à plataforma onde o aplicativo será mantido, ou ainda
troca ou atualização do sistema operacional.
Mudanças com relação às regras de negócio.
Notamos que o NHibernate dá suporte a mais SGBD’s que o framework corporativo, é
claro que isso se dá ao fato de que a empresa que desenvolveu seu próprio framework
corporativo o criou para atender apenas aos SGBD’s ao qual trabalha.
Tabela 6.2 – SGBD’s suportador por ambos frameworks
Framework Oracle SQLServer Firibird Access PostgreSQL DB2 MySQL SQLLite Cachê
Corporativo Sim Sim Não Não Não Sim Não Não Sim
NHibernate Sim Sim Sim Sim Sim Sim Sim Sim Não
É comum com o passar do tempo regras de desenvolvimento serem alteradas. É
possível pensar em um cenário onde o serviço de entidades do framework corporativo
necessite sofrer alterações, lembrando que nem todos os usuários desse framework possuem
acesso às classes que o compõe, pois existe uma equipe responsável para fazer isso. Se essas
42
mudanças englobarem novas implementações, com o passar do tempo tendem a surgir o que
chamamos de código morto [7], ou em um pior caso códigos sendo executados sem a menor
necessidade. Assim sendo, essas características tendem a elevar muito o custo de se criar um
framework corporativo.
Portanto, construir algo que agregue recursos às aplicações deve sempre levar em
consideração as possíveis alterações que ele irá sofrer. Quando optamos em usar o
NHibernate somos sempre forçados a desenvolver qualquer regra que não seja relacionada
com a persistência de dados. Essas regras variam de acordo com o projeto. Para os estudos
realizados neste trabalho podemos identificar que o framework corporativo apesar de realizar
persistência de dados incorpora regras de autenticação automática, e isto faz com que
mudanças realizadas nele afetem todos os projetos que o utilizam.
43
7. CONCLUSÃO E TRABALHOS FUTUROS
Através dos estudos realizados em cima da arquitetura de dois frameworks de
persistência de dados, sendo um deles corporativo e o outro open source, fomos capazes de
determinar qual seria o ideal a ser adotado. Para isso levamos em consideração as
características de mapeamento, opinião de profissionais que atuam com ambos os
frameworks, aspectos relacionados a mudanças e escalabilidade.
Através das comparações realizadas identificamos que o framework corporativo possui
regras acopladas a persistência de dados, tornando impossível desacoplar de suas
funcionalidades esse controle de permissões, além disso, notamos que ele atualmente limita o
mapeamento objeto-relacional apenas por meio de classes POCO’s, não permite ações de
criação na base de dados e por fim identificamos que o mesmo dá suporte a uma gama menor
de SGBD’s se comparado ao NHibernate.
Com base nas informações obtidas neste trabalho com relação aos frameworks e com
as comparações e aspectos levantados podemos concluir que o NHibernate atende melhor as
necessidades da empresa com relação a produtividade pelo fato de não acoplar mecanismos de
permissão automáticos para cada iteração de persistência que realizar, deixando a cargo do
desenvolvedor escolher quando executar ou não esse tipo de funcionalidade.
Nota-se que o NHibernate fornece a seus usuário formas distintas de se realizar o
mapeamento objeto-relacional. Ele possui uma documentação melhor elaborada, permite
ações de criação na base de dados a partir de seu mapeamento e tem como pré-requisito o
conhecimento de OO e conhecimento de relacionamentos entre entidades do banco de dados.
Portando, baseado nos resultados identificamos que para qualquer tipo de aplicação o
uso do NHibernate é extremamente aconselhável, tornando a criação/uso de um framework
corporativo prejudicial no mínimo questionável com relação ao tempo que será desprendido
na criação do mesmo, adaptação e treinamento de profissionais, confiabilidade, adaptação a
mudanças e capacidade de crescimento.
O framework corporativo pode agregar regras à persistência como é o que ocorre com
o serviço de entidades já mencionado. Porém, tais regras podem ser desenvolvidas utilizando
o NHibernate, desacoplando da persistência. Isso despenderia mais tempo na criação, mas se
levarmos em consideração o tempo que a construção de uma tecnologia corporativa leva além
de consumir muitos recurso de uma empresa, torna-se aceitável a utilização do NHibernate
para cenários como os apresentados neste trabalho.
44
Ambos os frameworks são eficazes com relação à persistência de dados, contudo para
este trabalho não foi possível comparar a eficiência de ambos, esta limitação ocorreu devido
ao fato de que o framework corporativo executa um serviço de entidades a cada ação de
persistência solicitada a ele, esse serviço de entidades tem como objetivo verificar se o
usuário possui permissão para realizar ações CRUD em determinada entidade do banco de
dados, sendo assim qualquer comparação de desempenho passa a ser inconclusiva, uma vez
que instruções SQL são sempre adicionadas ao mecanismo de persistência do framework
corporativo.
O desenvolvimento deste trabalho de pesquisa buscou acrescentar conhecimento à
comunidade de desenvolvimento de software com relação à utilização de frameworks
terceirizados de persistência de dados como o NHibernate se comparado com a construção de
um framework corporativo, possibilitando destacar as seguintes contribuições:
benefícios na utilização de um modelo de arquitetura de projeto de software em
camadas ao se utilizar um framework de persistência de dados;
identificação dos principais riscos a se optar em construir um framework
corporativo de persistência de dados;
complexidade da arquitetura que envolve a construção de um framework
corporativo;
principais vantagens em optar pela utilização do NHibernate; e
Comparações para identificar qual o melhor modelo de framework a ser
adotado na construção de um aplicativo de software, levando em consideração
os requisitos que o software deve apresentar.
Existem alguns pontos deste trabalho que podem ser estendidos com o objetivo de
acrescentar mais detalhes de comparação de ambos os frameworks. Dentre as sugestões de
trabalhos futuros é possível citar:
Construir uma aplicação utilizando o NHibernate que simule a execução do
serviço de entidades do framework corporativo, a fim de mensurar com
exatidão a diferença de desempenho de ambos ao executar a persistência de
dados;
Submeter o framework corporativo a uma mudança de regras do serviço de
entidade para analisar o impacto real que sofrerão todas as aplicações que
façam uso dele; e
45
Além da limitação com relação ao desenvolvimento de uma aplicação com ambos os
frameworks para comparar desempenho, podemos identificar como uma outra limitação o
levantamento dos custos financeiros com relação ao desenvolvimento de uma ferramenta
corporativa, comparando com a adoção de utilizar uma ferramenta open source e investir em
treinamento aos recursos humanos.
46
REFERÊNCIAS BIBLIOGRÁFICAS
[1] ALEXANDER C.; ISHIKAWA S.; SILVERSTEIN M.; JACOBSON M.; FIKSDAHL
KING I.; ANGEL S.; A Pattern Language. Oxford University Press, New York, 1977.
[2] FREEMAN, E.; SIERRA, K.; BATES B. Use a Cabeça: Padrões de Projetos. Segunda
Edição. USA: O’Reilly Media, 2004.
[3] GAMMA, E.; HELM R.; JOHNSON R.; VLISSIDES J. Design Patterns. Elements of
Reusable Object-Oriented Software. Professional Computing Series. Massachusetts, USA:
Addison-Wesley, 1995.
[4] BASS L.; CLEMENTS P.; KAZMAN R.; Software Architecture in Practice. USA:
Addison-Wesley, 1998.
[5] ECKEL, B. Thinking in Patterns. Problem-Solving Techniques using Java. Revision
0.9. 0.9 ed. President, USA : MindView, 2003.
[6] FIORINI, S. T. Arquitetura para Reutilização de Processos de Software. 2001. Tese
(Doutorado em Informática) - Pontifícia Universidade Católica do Rio de Janeiro, Rio de
Janeiro.
[7] Framework Corporativo. Documentação do Framework Corporativo.
[8] NHibernate, <http://www.nhibernate.com/>. Site oficial do framework NHibernate,
acessado em 15/12/2011.
[9] NHibernate, <http://nhforge.org/wikis/reference2-0en/architecture.aspx>. Definição
de arquitetura do NHibernate, acessado em 08/01/2011.
[10] NHibernate, <http://nhforge.org/doc/nh/en/index.html>. Documentação técnica do
NHibernate, acessado em 08/01/2011.
[11] NHibernate, <http://imasters.com.br/artigo/20695/banco-de-dados/ nhibernate-
banco-de-dados-suportados-pelo-nhibernate>. Principais SGBD’s suportados pelo
NHibernate, acessado em 08/01/2011.
[12] NHibernate, <http://fluentnhibernate.org/>. Ferramenta para mapeamento fluente de
objeto-relacional, acessado em 08/01/2011.
47
APÊNDICE A – QUESTIONÁRIO FRAMEWORKS
1. Qual o tempo médio que o programador leva para começar a produzir ao adotar a
utilização deste framework?
[ ] 30 dias [ ] 45 dias [ ] 60 dias [ ] acima de 60 dias
2. Com relação ao nível da documentação oficial deste framework, você a considera?
[ ] baixo [ ] média [ ] alto
3. Para o framework em questão como você classificaria o conhecimento na comunidade
de software?
[ ] não existe [ ] baixo [ ] médio [ ] alto
4. Qual a relação de exemplos práticos disponíveis para ser tomado como base no
processo de aprendizado deste framework.
[ ] nenhum [ ] poucos [ ] suficientes [ ] vários
5. Com relação à complexidade das classes e interfaces deste framework você considera?
[ ] simples [ ] complexas
6. Com relação ao mapeamento objeto-relacional, o framework pode ser considerado?
[ ] insuficiente [ ] suficiente
7. Com relação à restrição como é feita o mapeamento objeto-relacional, o framework
pode ser considerado?
[ ] baixa [ ] média [ ] alta
8. Qual a dificuldade de incluir uma nova regra a classe POCO, ao se utilizar deste
framework?
[ ] baixa [ ] média [ ] alta
9. Qual a importância de uma arquitetura bem definida para a utilização deste
framework?
[ ] pouco importante [ ] importante [ ] muito importante [ ] indispensável
10. Com relação a alterações na base de dados, replicar para o aplicativo ao se utilizar
deste framework pode ser considerado?
[ ] simples [ ] complexo