arquitetura.xml
5.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" []>
<chapter id="arquetipo">
<title>Arquitetura</title>
<section>
<title>Estrutura</title>
<para>
Visando uma melhor modularização, o Demoiselle está dividido por funcionalidades. Isto significa que o framework
não é monolítico, no qual todas as suas funcionalidades estão contidas em um único pacote. Aliás, esta estratégia não é
a mais indicada, pois projetos com um propósito específico, que não necessitam de persistência ou interface Web, por
exemplo, teriam dependências desnecessárias. Assim, o Demoiselle é separado em Core, Extensões e Componentes.
</para>
<!-- TODO: incluir um diagrama ilustrando a estrutura do framework -->
<para>
O Core do Demoiselle contém aquelas funcionalidades comuns a todas as extensões e aplicações. O core é simples,
leve e formado majoritariamente por interfaces e poucas implementações. O Core é a base do framework, sem ele, as
extensões e a própria aplicação não funcionariam.</para>
<para>
As Extensões, como o próprio nome sugere, estendem o Core com funcionalidades extras e bem específicas a um domínio ou
tecnologia. Neste contexto, caso sua aplicação necessite de persistência com JPA, o framework fornecerá facilidades
para você; contudo, estas funcionalidades não estão no Core. Para este propósito existem as extensões como a
<literal>demoiselle-jpa</literal>, por exemplo. Cabe destacar que as extensões não possuem vida própria,
pois estão diretamente ligadas ao núcleo do framework, inclusive o ciclo de vida das extensões está
totalmente acoplado ao do Core.
</para>
<para>
Já os Componentes são artefatos separados e que, portanto, não são dependentes diretamente do Core. Aliás, os
Componentes podem até mesmo existir sem referenciar o Core. Desta forma, o seu ciclo de vida é totalmente
independente do Core e Extensões. Um componente não precisa, necessariamente, estender o comportamento do Core, mas
permitir disponibilizar novas funcionalidades ao usuário. Outra diferença importante é que, diferente de Core e
Extensões, os Componentes não necessariamente são aderentes a alguma especificação. Um exemplo é o
<literal>demoiselle-validation</literal>.
</para>
</section>
<section>
<title>Pacote Internal</title>
<para>
As boas práticas de programação nos alertam para que nunca sejamos dependentes de implementações, mas sempre de
interfaces ou, como alguns costumam dizer, <quote>depender de contratos</quote>.
As interfaces existem para isto: definem um contrato, enquanto as implementações deste contrato ficam à parte, de
preferência, distante do programador da aplicação. O mecanismo de injeção de dependência fortalece ainda mais esta
ideia. Sua aplicação precisará apenas depender das interfaces que o Demoiselle provê. A implementação específica será
injetada automaticamente pelo CDI.
</para>
<tip>
<para>
As classes do pacote <literal>internal</literal> nunca devem ser referenciadas pela sua aplicação!
</para>
</tip>
<para>
Qual o motivo de toda esta explicação? Os programadores mais curiosos irão encontrar classes do framework que estão
inseridas no pacote <literal>internal</literal>.
Cabe alertar que as classes aí contidas não devem ser usadas diretamente pela aplicação, caso contrário, você
estará acoplando-a com a implementação interna do framework, que pode sofrer mudanças sem aviso prévio. A equipe do
Demoiselle possui atenção especial quanto às suas interfaces (contratos) e não irá modificá-las sem antes tornar
públicas as mudanças. Contudo, tudo que consta no pacote
<literal>internal</literal>
pode sofrer mudanças repentinas. Isto significa que sua aplicação pode deixar de funcionar de uma versão para outra
caso você esteja usando diretamente classes internas.
</para>
</section>
<section>
<title>Arquitetura das aplicações</title>
<para>
É importante reforçar que o Demoiselle não obriga nenhum tipo de arquitetura para as aplicações, que podem ser
constituídas por quantas camadas forem necessárias. Contudo, é prudente não exagerar! Para quem não sabe por onde
começar, sugerimos uma arquitetura e padrões largamente utilizados pelo mercado, de forma a facilitar a manutenção e
para melhor modularização de seu projeto.
</para>
<para>
Usualmente, as aplicações são constituídas por pelo menos três camadas, desta forma é comum separar as lógicas de
apresentação, regras de negócio e persistência. O Demoiselle já fornece estereótipos que visam tornar esta
separação mais clara, respectivamente:
<literal>@ViewController</literal>, <literal>@BusinessController</literal> e <literal>@PersistenceController</literal>.
Maiores detalhes sobre cada anotação desta serão dados no decorrer desta documentação.
</para>
<!-- TODO: explicar melhor cada um dos estereótipos, se possível exemplificando com códigos -->
<para>
Cabe destacar que estamos falando de uma macro-visão arquitetural. Cada camada desta pode ser organizada
internamente da melhor forma possível, ou conforme os padrões vigentes no mercado. Para uma aplicação Swing, por
exemplo, o padrão de projeto <emphasis>Presentation Model</emphasis>
é bastante indicado e pode ser adotado em aplicações nesta plataforma. Para aplicações Web, os frameworks
especialistas geralmente aplicam o padrão MVC (Model/View/Controller).
</para>
</section>
</chapter>