Escolar Documentos
Profissional Documentos
Cultura Documentos
LAGES (SC)
ANO 2015
0
JOSÉ AUGUSTO ZANOTTO FRANKLIN
LAGES (SC)
ANO 2015
1
JOSÉ AUGUSTO ZANOTTO FRANKLIN
BACHAREL EM SISTEMAS DE
INFORMAÇÃO
BANCA EXAMINADORA:
3
LISTA DE ILUSTRAÇÕES
4
FIGURA 39 - Interface Confirma Saque\Transferênci ..............................................63
FIGURA 40 - Interface Saque ....................................................................................64
FIGURA 41 - Interface Transferência .......................................................................64
FIGURA 42 - Interface Depósito ...............................................................................65
FIGURA 43 - Interface Extrato ..................................................................................65
FIGURA 44 - Estrutura do projeto.............................................................................69
FIGURA 45 - Classe Comuns ....................................................................................70
FIGURA 46 - Métodos classe Conta .........................................................................70
FIGURA 47 - Classe repositório ................................................................................71
FIGURA 48 - JSON e XML ......................................................................................72
FIGURA 49 - Classe Transações ...............................................................................73
FIGURA 50 - Classe static Static...............................................................................74
FIGURA 51 - Classe Traces ......................................................................................74
FIGURA 52 - Classe Program ...................................................................................74
FIGURA 53 - Método de validação de conta.............................................................75
FIGURA 54 - Método LoadAccount() (logout) .........................................................76
FIGURA 55 - Método LoadAccount() (SetDeposit) .................................................76
FIGURA 56 - Método LoadAccount() (SetTransfer) ................................................76
FIGURA 57 - 7Método LoadAccount() (GetBalance) ..............................................76
FIGURA 58 - Método LoadAccount() (SetWithdraw) ..............................................77
FIGURA 59 - Etapas de Desenvolvimento de Software Orientado a Aspectos ........78
FIGURA 60 - Estrutura de projeto com implementação de aspecto..........................79
FIGURA 61 - Biblioteca PostSharp ...........................................................................80
FIGURA 62 - Implementação aspecto de segurança .................................................81
FIGURA 63 - Aspecto Segurança ..............................................................................81
FIGURA 64 - Advice Log...........................................................................................82
FIGURA 65 - Advice Exception .................................................................................82
FIGURA 66 - Advice Security ....................................................................................83
FIGURA 67 - Exemplo de Pointcuts .........................................................................83
FIGURA 68 - Aspecto inserido no fluxo principal ....................................................84
FIGURA 69 - Tela de login do protótipo ...................................................................88
FIGURA 70 - Tela Operações Protótipo ....................................................................89
FIGURA 71 - Operação Saque Protótipo...................................................................89
FIGURA 72 - Operação Saque Protótipo...................................................................90
FIGURA 73 - Operação deposito Protótipo ...............................................................90
FIGURA 74 - Operação Transferência Protótipo ......................................................91
FIGURA 75 - Confirmação transferência Protótipo ..................................................91
FIGURA 76 - Operação extrato Protótipo .................................................................92
5
QUADRO 7 - Efetuar Transferência ..........................................................................52
QUADRO 8 - Emitir Extrato ......................................................................................53
QUADRO 9 - Verificação de transferência ...............................................................53
QUADRO 10 - Validação de saldo para saque ..........................................................53
QUADRO 11 - Verificação de saldo para transferência ............................................54
QUADRO 12 - Validação de conta destino ...............................................................54
QUADRO 13 - Validação de valor para transferência ...............................................54
QUADRO 14 - Validação de saldo para saque ..........................................................54
QUADRO 15 - Validação de conta ............................................................................55
QUADRO 16 - Requisitos não funcionais .................................................................56
QUADRO 17 - Comparação entre a quantidade de linhas implementadas ...............86
6
LISTA DE ABREVIATURAS E SIGLAS
8
ABSTRACT
Over the years, software engineers struggle as the code structure in order to maximize
reuse and reduce the risk of defects. While the Object Oriented Programming (OOP)
provides a solid framework for the organization of code, just presenting difficulties to
reuse crosscutting, leading to unnecessary duplication of code and an increase of errors
in the production phase, causing a decrease in the quality and time to market. The
proposed work aims to present this new idea of Aspect Oriented Programming (AOP)
which your goal is defined in separating the levels of concern during the software
development. The methodology consisted of a literature review on the topic and
programming a system with use of the concepts of the POA. During the research, it was
found that it is possible to consider separately the problems related to the storage of data,
business modelling, security, distribution audit log records etc. To facilitate the lifting
of these crosscutting, it becomes feasible based on the non-functional requirements, as
they are impact in various system layers, as specifically deal with particulars related to
the use of the application in terms of performance, usability, reliability , security,
availability, maintainability, as well as the technologies involved. The POA is divided
into three phases and they decay, implementation and recovery. To demonstrate the
effectiveness of POA, work was the development of an ATM system, which presents a
solution in OOP, and a refactoring POA, facilitating the identification of the strengths
using this new concept. As considerations it is emphasized that the POA should not be
thought of as a new standard of programming, but as a complement to OOP, since
dealing with different concerns, having as its objective to facilitate the reuse of code,
leaving with a structure easy to maintain, and easier understanding of evolution due to
its ease of code reuse.
Keywords:
Aspecto, Programação Orientada a Aspecto, Requisitos Não Funcionais.
SUMÁRIO
1 INTRODUÇÃO ..........................................................................................................9
1.1 Apresentação .............................................................................................................9
1.2 Descrição do problema ............................................................................................10
1.3 Justificativa ..............................................................................................................11
1.4 Objetivo geral ..........................................................................................................12
1.5 Objetivos específicos ...............................................................................................12
1.6 Metodologia .............................................................................................................13
2 REVISÃO BIBLIOGRÁFICA ................................................................................14
2.1 Desenvolvimento de software. ................................................................................14
2.2 Programação Orientada a Objetos ...........................................................................15
2.2.1 Encapsulamento .............................................................................................................. 16
2.2.2 Herança ........................................................................................................................... 18
2.2.3 Polimorfismo ................................................................................................................... 19
2.3 Dificuldades encontradas na POO ...........................................................................21
2.3.1 Entrelaçamento do Código (Tangled Code).................................................................... 22
2.3.2 Espalhamento do Código (Scattering Code) ................................................................... 24
2.4 Programação Orientada a Aspectos .........................................................................26
2.4.1 Conceitos Fundamentais sobre a Programação Orientada a Aspectos.......................... 27
2.4.2 Motivação (Importância da POA) ................................................................................... 28
2.4.3 Sincronização de Objetos Concorrentes ......................................................................... 30
2.4.4 Conceitos e Terminologias .............................................................................................. 32
2.4.5 Problemas na utilização da POA .................................................................................... 41
2.4.6 Benefícios da Programação Orientada a Aspectos ......................................................... 42
2.4.7 Linguagens que implementam POA ................................................................................ 42
2.5 Requisitos do sistema ..............................................................................................43
2.5.1 Requisitos Funcionais ..................................................................................................... 44
2.5.2 Requisitos Não Funcionais .............................................................................................. 44
2.5.3 Estratégia para licitar Requisitos Não Funcionais ......................................................... 45
2.5.4 Como identificar requisitos não funcionais .................................................................... 46
2.6 Conclusões do capítulo. ...........................................................................................48
3 MODELAGEM DO SISTEMA...............................................................................49
3.1 Processo unificado: ..................................................................................................49
3.1.1 UML ................................................................................................................................. 49
3.1.2 Descrição do estudo de caso ........................................................................................... 50
3.2 Caso de uso ..............................................................................................................50
3.2.1 Diagrama de caso de uso ................................................................................................ 51
3.3 Levantamento de Requisitos....................................................................................51
3.3.1 Requisitos Funcionais ..................................................................................................... 52
3.3.2 Requisitos Não funcionais ............................................................................................... 55
3.4 Diagrama de classe ..................................................................................................56
3.5 Operações ................................................................................................................57
3.5.1 Função Saque: ................................................................................................................. 57
3.5.2 Função Depósito ............................................................................................................. 58
3.5.3 Função Transferência...................................................................................................... 59
3.5.4 Consulta Extrato .............................................................................................................. 61
3.6 Prototipação de interface .........................................................................................62
3.7 Considerações finais ................................................................................................65
4 DESENVOLVIMENTO...........................................................................................67
4.1 Tecnologias utilizadas .............................................................................................67
4.1.1 XML ................................................................................................................................. 67
4.1.2 JSON ................................................................................................................................ 68
4.1.3 PostSharp ........................................................................................................................ 68
4.2 Programação Orientada a Objetos ...........................................................................69
4.3 Programação Orientada a Aspectos .........................................................................77
4.4 Diferencial entre a programação orientada a aspecto sobre a orientada a objeto ...84
5 APRESENTAÇÃO DO SISTEMA .........................................................................88
6 CONCLUSÃO...........................................................................................................93
REFERÊNCIAS BIBLIOGRÁFICAS ......................................................................94
11
1 INTRODUÇÃO
1.1 Apresentação
9
impacto no código de negócio (requisitos funcionais), uma vez que estes códigos não
estão entrelaçados e espalhados em várias unidades do sistema. Desta forma, a
Programação Orientada a Aspecto (POA) possibilita o desenvolvimento de programas
utilizando tais aspectos, o que inclui isolamento, composição e reuso de códigos de
implementação dos aspectos.
A POA por ser um objeto de estudo recente, está sendo muito abordada por
engenheiros de software, pesquisadores e programadores interessados em utilizar essa
técnica que busca reduzir a complexidade e aumentar a produtividade no
desenvolvimento de software. A (OO) é um método eficaz até certo ponto, pois,
precisava de uma evolução que não foi obtida, o encapsulamento dos requisitos que
produzem efeitos em todo o sistema, não passou por revisões e adaptações profundas
nas suas descrições. Por isso, a Orientação a Aspectos (OA) ganhou força na
comunidade científica e tecnológica como a provável solução para essa brecha deixada
pela (OO), com certa eficácia na mudança de pensamento e do conhecimento na área de
desenvolvimento de sistemas. Muitas empresas têm incorporado rapidamente a OA por
não exigir nenhuma adaptação de seus equipamentos e ser de fácil compreensão aos
desenvolvedores e testadores de software.
O presente estudo contemplou os seguintes capítulos: Capítulo 1 foi
apresentado o projeto do trabalho, ou seja, definição do problema, justificativa, objetivos
e metodologia. O segundo capitulo se aprofundou no estudo de viabilidade através do
levantamento bibliográfico, abordando os temas referente aos paradigmas de
programação (OO) e (OA), e também formas de licitação de requisitos não funcionais.
No terceiro capítulo, foi apresentado a modelagem do sistema. No quarto capitulo foi
realizado o desenvolvimento de um sistema (OO), refatorando em uma solução (OA),
apresentando com tudo um comparativo com as devidas vantagens e desvantagens
existentes na (POA) sobre a (POO). O quinto capítulo tratou-se de uma apresentação do
sistema com suas formas de utilização e no capítulo final apresentou-se a conclusão
geral do trabalho.
10
Nos dias atuais existe uma grande dificuldade no controle de características
transversais o que acaba deixando um emaranhado de código espalhado por todo o
sistema, tornando cada vez mais difícil de controlar, modificar e reutilizar estas
características em comum, aumentando assim o custo de seu desenvolvimento. Neste
caso, será que com o uso da (POA) será possível resolver as dificuldades levantadas?
1.3 Justificativa
Desta forma este TCC visa utilizar a POA para mostrar a separação dessas
funcionalidades ortogonais através da geração de aspectos. Será comparado a construção
de um sistema sem a valorização destes artefatos versus um sistema preocupado com as
11
características transversais, partindo da modelagem do sistema até a formação de
aspectos, tornando assim, um sistema com código mais legível e de fácil manutenção,
trazendo como benefício um aumento na produtividade em relação a reutilização de
classe, e com um processo mais eficiente para a formação de novos softwares.
12
b) Estudar as abordagens utilizadas para estender a modelagem de requisitos
para tratar de interesses transversais para o desenvolvimento de aspectos;
c) Demonstrar com um exemplo a metodologia POO;
d) Refatorar o exemplo utilizando o contexto de aspectos para demonstrar
suas vantagens.
1.6 Metodologia
13
2 REVISÃO BIBLIOGRÁFICA
14
Ao longo dos últimos anos a Engenharia de Software disponibilizou vários
métodos, técnicas e ferramentas para auxiliar os desenvolvedores de software a
produzirem com maior qualidade. Outas características foram perseguidas, sendo talvez
as mais importantes para a produtividade, a reusabilidade e manutenibilidade.
(GROVES, 2013).
No desenvolvimento estruturado, a separação de interesses ocorre através das
diferentes funcionalidades oferecidas pelo software. Cada função é implementada em
um único módulo, ou procedimento. Neste paradigma de desenvolvimento, apesar dos
interesses relativos a funcionalidades ficarem separados, interesses relativos a dados
ficam distribuídos em um único módulo.
Em engenharia de software, o princípio da separação de características está
relacionado à decomposição e modularização (PARNAS, 1972). Para garantir este
princípio, durante o desenvolvimento, deve-se usar a decomposição em unidades
menores, cada uma abordando uma única característica, diminuindo a complexidade
com código modular, onde o relacionamento mútuo desses módulos formará um
sistema.
Com o desenvolvimento de aplicações complexas, cresceram as demandas por
metodologias que possam abstrair e modularizar as estruturas básicas de um programa,
surgindo assim o conceito em desenvolvimento de softwares chamado de POO.
15
As classes são consideradas como um identificador para que posteriormente
sejam referenciadas no momento da criação de um Objeto. Dentro destas classes, tem-
se os métodos, os quais definem funções existentes dentro das classes.
O autor (RICARTE, 2001) também descreve que os métodos definem as
funcionalidades da classe, ou seja, o que será possível fazer com os objetos dessa classe.
Cada método é especificado por uma assinatura, composta por um identificador (o nome
do método), o tipo para o valor de retorno e uma lista de argumentos, sendo cada
argumento identificado por seu tipo e nome.
A POO trouxe uma nova perspectiva de modelagem de dados, auxiliando o
desenvolvedor com métodos fáceis para garantir uma maior desenvoltura durante o
desenvolvimento de sistemas. Dentre as grandes vantagens podem ser citadas três, sendo
elas: (encapsulamento, herança e polimorfismo) que nasceram com o paradigma,
diferenciando de qualquer outra programação utilizada anteriormente.
2.2.1 Encapsulamento
16
FIGURA 2 - Abstração do encapsulamento de um caixa eletrônico
17
FIGURA 3 - Método sacar
2.2.2 Herança
18
FIGURA 4 - Diagrama UML de classes que representam relacionamentos de herança.
2.2.3 Polimorfismo
19
Através deste fundamento de polimorfismo, segundo (SERSON, 2007), a
extensibilidade é promovida pelo polimorfismo a partir do momento em que ele permite
unificar o processamento de objetos relacionados por herança ou por implementação de
interfaces. Do ponto de vista arquitetural, novas classes podem ser adicionadas que o
processamento polimórfico permanecerá imutável.
Sem meios apropriados para sua separação em um sistema OO, os interesses
transversais tendem a ficar espalhados e entrelaçados com outros interesses. Um
interesse é dito espalhado quando afeta vários componentes do sistema e entrelaçado
quando se mistura com outros interesses dentro de um mesmo módulo. Estas duas
características são indesejáveis porque causam uma maior dificuldade de entendimento,
evolução e reutilização dos artefatos de software (GARCIA et Al., 2004).
Com o polimorfismo, os mesmos atributos e objetos podem ser utilizados em
objetos distintos, porém com implementações lógicas diferentes. Por exemplo, tem-se
uma classe Animal e nela sabe-se que todo animal come, sendo que Cães comem ração
e Tigres comem carne. Dentre os métodos de chamadas existentes, pode-se ter os
comportamentos citados, na Figura 5.
20
FIGURA 6 - Exemplo de chamada de polimorfismo
Nota-se então, que cada chamada irá fazer algo diferente, porém como existe
herança entre as classes, todos os métodos irão funcionar, porque são do tipo mais
genérico (Animal) ou são filhos do mais genérico.
Através destas 3 fundamentações, tem-se ainda algumas dificuldades
encontradas nas implementações da POO, tais quais serão abordadas no próximo tópico.
21
FIGURA 7 - Problemas de espalhamento e entrelaçamento causadas pela OO
22
FIGURA 8 - Exemplo para demonstrar o entrelaçamento de código
23
pensar em tal interação poderia apresentar um novo comportamento.
Esta especulação advém da teoria de IA sobre a interação de agentes
inteligentes, que, através de sinergia da cooperação entre eles, um novo
comportamento pode surgir.
Ainda com o problema de ter classes inchadas com códigos invasivos tratando
aspectos não pertinentes a seus objetos, tem-se o problema de repetição destes códigos.
Analisando o exemplo anterior das classes Banco e Questão (Figura 8) e
supondo que aquelas mesmas chamadas intrusivas fossem feitas por outras classes, caso
fosse necessário alterar o nome do método conectar() da classe Banco para
abrirConexao(), seria necessária a alteração de todas as chamadas a esse método em todo
o sistema. Isso causaria sérios problemas de manutenibilidade e produtividade.
Por exemplo, analisando a Figura 9(a) abaixo, é possível notar que o método
conectar() se faz presente em diversas classes, podendo esses estarem espalhados em
diversas partes de um programa. A manutenção para uma alteração desse método
impactara em todas as classes que fazem uso deste. A Figura 9(b) representa a alteração
desses métodos.
FIGURA 9 - Manutenção transversais
24
Abaixo é apresentado outro exemplo o qual é possível a visualização desse
problema, a Figura 10 mostra a quantidade de registros de logs no servlet container
Tomcat. As barras verticais são as classes e as linhas horizontais representam o
espelhamento obtido pelas chamadas para registros de logs.
Tangled Code Código emaranhado Utilização de uma única classe ou método para
implementar múltiplos interesses.
25
O código emaranhado ocorre quando um módulo é
implementado com múltiplos interesses
simultaneamente. Um desenvolvedor
frequentemente considera os interesses como
lógica do negócio, performance, sincronização,
segurança, dentre outros, durante a
implementação do módulo. Isso resulta na
implementação de vários interesses em um mesmo
módulo.
(FONTE: SERSON, 2007)
Pode-se dizer que a POA é um novo conceito, devido ser alvo de estudo na
esfera acadêmica e principalmente por ser de interesse dos arquitetos de softwares que
buscam diariamente metodologias ágeis e de fácil compreensão, apresentando um
retorno positivo para a equipe durante o processo de desenvolvimento.
Em 1997 Kiczales líder da empresa Xerox, coordenava uma equipe de
pesquisados, que primeiro descreveu a POA em 1997. Ele e sua equipe estavam
preocupados com o uso de repetições “clichê” que eram muitas vezes necessárias e se
tornavam “caras” pela utilização em diversos blocos de códigos orientados a objetos.
São citados como exemplos destas características, o controle de log, cache, transação,
persistência, entre outros.
O autor Kiczales (1997) e sua equipe descrevem os problemas que POO foi
incapaz de capturar e resolver de uma forma clara. Eles observaram que essas
preocupações transversais acabaram sendo espalhadas por todo o código, deixando este
com um emaranhado de código, se tornando cada vez mais difícil de desenvolver e
modificar. Eles analisaram todas as razões entre as técnicas utilizadas para identificar o
motivo de se apresentar este descontrole, resultando neste “emaranhamento”.
A POA complementa a POO, fornecendo outra maneira de pensar sobre a
estrutura do programa. A unidade fundamental da modularidade em POO é a classe,
enquanto que em POA a unidade de modularidade é o aspecto. Aspectos permitem a
modularização de preocupações, tais como gerenciamento de transações que atravessam
vários tipos e objetos.
26
O principal objetivo da POA é separar o código referente ao negócio dos
códigos transversais, uma divisão de interesses (requisitos), abrangendo o problema de
legibilidade como a questão da modularidade. Esses interesses transversais são
divididos em aspectos mantendo o código referente ao negócio como fluxo principal da
aplicação e sem qualquer alteração.
27
Um ponto de ligação pode ser encarado como um evento que ocorre no código
da regra de negócio, marcado pela execução de um determinado método ou pela
alteração no valor de uma propriedade. Criar pontos de ligação significa indicar quais
desses eventos devem ser monitorados pelo aspecto, usando para isso estruturas
chamadas de pointscuts. Os pointscuts se valem de uma sintaxe especial para possibilitar
a indicação de quais métodos e propriedades dispararão a execução do código relativo a
um ponto de ligação (FABBRO, 2011).
O autor (GROVES, 2013) exemplifica uma característica transversal através
do seguinte contexto: considere um método que faz X. Se realizado um logging de
performance (C) nesse método X, caso exista outros métodos Y e Z que necessitem
desse controle de performance, será necessário colocar C em cada um desses métodos
também. Sendo assim, “C” é a preocupação transversal. Embora a preocupação
transversal seja um termo conceitual “cross-cutting” que é definido por uma ou duas
sentenças, que resulta em um código “concreto” funcional.
Enfim, a POA é uma tecnologia de programação em nítida evolução que
oferece suporte a novos mecanismos e recursos de abstração e composição com o
objetivo de permitir alcançar uma melhor separação de interesses no nível da
implementação. A POA é evolucionária porque considera atribuições reconhecidas da
separação de interesses proporcionadas por tecnologias anteriores.
28
FIGURA 11 - Aplicação bancária com o método de transferência de valores
Porém, numa aplicação bancária construída para o mundo real, este método de
transferência está longe do adequado. É necessário incluir valores de segurança, que
determinam se o usuário possui autorização para realizar a operação. É preciso também
“envolver” a operação em uma transação para prevenir perda de dados. Finalmente, é
preciso fazer o log dos dados da aplicação. Uma versão simplificada que contém estes
novos objetos (concerns) está ilustrada na Figura 12.
29
aquele que implementa as regras do negócio.
Deve-se considerar o que ocorre quando é necessário alterar, por exemplo, a
implementação de segurança da aplicação. No exemplo mostrado, o código é espalhado
por vários métodos, e qualquer mudança significa um grande esforço de codificação.
Por fim, pode-se dizer que este código não está devidamente encapsulado nos
seus próprios módulos. Isto aumenta a complexidade do sistema e torna a manutenção
do mesmo muito difícil.
A POA então, busca resolver este problema permitindo que o programador
implemente essas questões (segurança, log, transações, e etc.) através de aspectos. Em
muitas linguagens que implementam POA, o aspecto é constituído de uma ou mais peças
de advices (fragmentos do código, como métodos) e uma lista de join points (pontos no
programa principal na qual os advices são inseridos).
30
Quando a preocupação do código transversal é utilizada em vários métodos e
várias classes (usando o copiar e colar, por exemplo), esta abordagem é chamada de
scattering (dispersão) por que o código fica espalhado em toda a aplicação.
Na Figura 13, tem-se o código de lógica de negócio em verde, e o código de
registro em vermelho.
31
organizada se mantendo agradável para o desenvolvimento, de maneira que as
ferramentas de POA realizarão o processo de “tecelagem” de acordo com ferramenta
utilizada.
32
mecanismos podem ser utilizados de forma dynamic crosscuting, para a modificação da
execução dos componentes, executando advices antes ou depois de métodos do
componente, substituindo parâmetros, ou mesmo trocando a execução de um método do
componente por um advice do aspecto. Ou podem ser usados de forma statis
crosscuting, alterando a própria estrutura dos componentes: adicionando métodos e
propriedades, ou modificando a hierarquia de classes, conforme detalha a Figura 15.
Por ser uma área relativamente nova na computação, ainda não existe uma
tradução usual para muitos termos utilizados na literatura a respeito de POA sendo
assim, esse trabalho irá dar enfoque em apenas algumas terminologias, como por
exemplo: Separation of concern; Aspect; Join Point; Advices; Introduction e Weaving.
33
satisfazer a um determinado interesse estivesse concentrada em uma única localidade
física, separada de outros interesses, para que o interesse possa ser estudado e
compreendido com facilidade.
Tem-se em consideração uma boa prática de desenvolvimento de sistemas,
onde a decomposição de um sistema através da divisão de interesses permite-se um
melhor nível de abstração dos dados, diminuindo assim a complexidade das
características individuais, permitindo assim que o desenvolvedor mantenha o foco
especificamente no que for de interesse aumentando o processo de evolução de
desenvolvimento.
A ideia central por trás da orientação a aspectos é que os mecanismos de
abstração e composição das tecnologias existentes não são suficientes para separar
alguns interesses especiais encontrados em sistemas mais complexos. Esses interesses
são chamados de interesses transversais (crosscutting concerns) uma vez que afetam a
modularidade de outros elementos (chamados de componentes), “atravessando” seus
limites. Sem os meios apropriados para a separação e a modularização, interesses
transversais tendem a ficar espalhados e entrelaçados com outros interesses. As
consequências naturais são uma menor compreensibilidade, uma menor evolução e uma
menor reutilização dos artefatos do código. A orientação a aspectos utiliza o aspecto
como um novo mecanismo de modularização para a separação de interesses transversais
e fornece um novo mecanismo para combinar aspectos em componentes em pontos de
combinação bem definidos (RESENDE; SILVA, 2005).
O desenvolvimento estruturado realizou a separação de interesses orientando-
se através das diferentes funcionalidades oferecidas pelo software. Cada função é
implementada em um único módulo, ou procedimento. Daí surgiram conceitos que
ajudam a manter a separação de interesses, como o baixo acoplamento e a alta coesão.
O objetivo do desenvolvimento orientado a aspectos é encapsular interesses
transversais em aspectos fisicamente separados do restante do código. Em termos
abstratos, a orientação a aspectos introduz uma terceira dimensão de decomposição,
conforme ilustra a Figura 16. Além de decompor o sistema em objetos (dados) e métodos
(funções), é então transformado cada objeto e função de acordo com o interesse sendo
34
servido e agrupados a cada interesse em um módulo distinto, ou aspecto.
2.4.4.2 Aspectos
35
comportamento de componentes. Essas melhorias podem adicionar uma nova estrutura
e comportamento para um ou mais componentes, refinar ou até mesmo redefinir o
comportamento existente.
Os aspectos podem afetar um ou mais componentes, possivelmente afetando
sua estrutura e comportamento. Além disso, amplia-se o uso do termo para denotar
também um relacionamento genérico de um aspecto para um ou mais componentes.
36
FIGURA 17 - Exemplo de mais de um ponto de junção para um ponto de função
2.4.4.4 Advices
Advice é uma estrutura que denota o que um aspecto deve fazer, ou seja, qual
o comportamento do aspecto. O advice designa a semântica comportamental do aspecto.
Todo advice está associado a um pointcut, que define pontos de junção.
De acordo com o autor (NELSON, 2005), advice são construções semelhantes
aos métodos, entretanto, não podem ser chamados diretamente pela aplicação base e
nem pelo próprio aspecto, pois sua execução é feita automaticamente após o entrecorte
no ponto de junção. Outra diferença em relação aos métodos é que os advices não
possuem nome, não tem especificadores de acesso (public, private, etc) e tem acesso a
variáveis especiais das execuções dos pontos de junção, como assinatura dos métodos
entrecortados, etc. Há três tipos de advice:
Before: é o mais simples, simplesmente executa antes do ponto de
junção. O único detalhe a se observar é que se o advice levantar uma
exceção, o ponto de junção não será mais executado.
After: executa depois do ponto de junção. Existem três variações desse
advice, que dependem de como a execução do ponto de junção é
finalizada, ou seja, se terminou normalmente, com uma exceção, ou de
37
qualquer forma. O Quadro 3 sintetiza as variações do after().
after() returning: ponto_de_corte() Executa depois do ponto de junção se ele tiver terminado novamente
(sem exceção)
after() throwing: ponto_de_corte() Executa depois do ponto de junção somente se este tiver saído com
uma exceção
38
de informações sobre o ponto de junção que será afetado em determinado instante.
Sendo assim, através das cláusulas nos pontos de corte, existem 3 tipos de informação:
Args(): a cláusula args(var1, var2, ... varn) pode ser usada para
capturar argumentos passados para um método. No exemplo da Figura
19, o método interceptado adicionalIngrediente() recebe como
parâmetro um objeto da classe Ingrediente. O ponto de corte captura o
objeto passado através da cláusula args. O args recebe como parâmetro
uma variável que pode ser usada no advice. A variável é declarada na
definição do pointcut, como se fosse um parâmetro do pointcut. No
advice, uma nova variável é declarada na declaração do advice, e
passada para o ponto de corte.
39
de uma chamada ou atribuição. No entanto, target() fará sentido quando
associar aos pontos de corte call() ou set(), conforme a Figura 21.
O ponto de corte irá capturar o objeto da classe B sobre o qual está sendo executado o
método g(). O resultado do ponto de corte, nesse caso, é a execução de B.g() está na
classe B e não na classe A. Assim, o target(var) vai retornar um objeto da classe B
2.4.4.6 Weaving
40
FIGURA 22 - Weaver fazendo a mesclagem dos módulos
41
completamente a sua semântica.
42
serem executados realizar alguma função para atender alguma necessidade.
O quadro 3 apresenta as linguagens que possibilitam a POA.
43
Um requisito de um sistema é uma característica do sistema ou a descrição de
algo que o sistema é capaz de realizar para atingir seus objetivos (PFLEEGER, 2004).
Com base nessas definições, pode-se dizer que os requisitos de um sistema
incluem especificações dos serviços que o sistema deve prover, restrições sob as quais
ele deve operar, propriedades gerais do sistema e restrições que devem ser satisfeitas no
seu processo de desenvolvimento.
As definições acima apresentadas apontam para a existência de diferentes
tipos de requisitos. Uma classificação amplamente aceita quanto ao tipo de informação
documentada por um requisito faz a distinção entre requisitos funcionais e requisitos
não funcionais.
44
funcionais podem ser classificados quanto à sua origem. Existem diversas classificações
de requisitos não funcionais. O autor (SOMMERVILLE, 2007), por exemplo, classifica-
os em:
Requisitos de produto: especificam o comportamento do produto
(sistema). Referem-se a atributos de qualidade que o sistema deve
apresentar, tais como confiabilidade, usabilidade, eficiência,
portabilidade, manutenibilidade e segurança.
Requisitos organizacionais: são derivados de metas, políticas e
procedimentos das organizações do cliente e do desenvolvedor,
Incluem requisitos de processo (padrões de processo e modelos de
documentos que devem ser usados), requisitos de implementação (tal
como a linguagem de programação a ser adotada), restrições de entrega
(tempo para chegar ao mercado, restrições de cronograma, etc),
restrições orçamentárias (custo, custo-benefício), etc.
Requisitos externos: referem-se a todos os requisitos derivados de
fatores externos ao sistema e seu processo de desenvolvimento. Podem
incluir requisitos de interoperabilidade com sistemas de outras
organizações, requisitos legais (tais como requisitos de privacidade) e
requisitos éticos.
45
FIGURA 23 - Estratégia de Elicitação de Requisitos Não Funcionais
46
entrada e as noções e impactos são itens dessa entrada, nos quais toda referência a outras
entradas deve ser sublinhada (princípio da circularidade).
A busca de requisitos não funcionais deverá ter como auxílio os requisitos
funcionais encontrados, o que significa dizer que o engenheiro de software, de posse do
documento que define os requisitos funcionais do sistema, deverá fazer uma busca em
cada requisito funcional descrito no documento, procurando identificar eventuais RNFs
a eles associados. Entretanto, alguns desses requisitos não funcionais, como por
exemplo segurança de acesso a dados do sistema, podem ser globais ao sistema não
estando relacionado a um determinado requisito funcional, e sim, presente em diversas
partes do sistema, ou mesmo no sistema como um todo.
Um instrumento importante no auxílio a identificação de RNFs pode ser o uso
de um checklist de RNFs como guia. A Figura 24 mostra um checklist que poderá ser
usado como ponto de partida. Essa lista não pretende ser completa e sim um apanhado
dos RNFs mais comuns, sendo portanto aconselhável que a medida que se identifique
um RNF não constante da lista que esta seja atualizada.
47
É importante que não sejam identificados apenas os RNFs de forma genérica,
como por exemplo, especificar desempenho como um RNF existente e nada mais. É
necessário que o requisito não funcional genérico seja instanciado (detalhado) até a
identificação do que o sistema precisa possuir ou fazer para que esse RNF seja satisfeito.
Seguindo o que foi apresentado no capítulo anterior, a POA, não é uma nova
metodologia de programação, e sim um suplemento para a POO, a qual não é substituída
pela POA, e sim complementada por esta. Essa evolução de tecnologia diz respeito a
melhorias e facilidades para novas implementações e manutenibilidade no que diz
respeito a um sistema, onde os interesses globais são fatorados em módulos separados
do código principal, aumentando assim a compreensão do sistema.
Esta separação de interesse dividida em módulos apresenta um melhor nível
de abstração dos dados, interesse esse considerado como aspecto, conceito principal
utilizado pela programação. Os aspectos são separados em classes individuais para que
com o auxílio de Pointcut, Joinpoint, Advices e o compilador Weaving as classes de
aspectos sejam executadas junto ao fluxo principal do sistema.
Para compreender o que considerar como um aspecto, se faz necessário que
sua identificação seja realizada ainda na fase de modelagem, e para se ter auxílio, pode
se levar em consideração a licitação de requisitos, como principal os não funcionais, os
quais expressam condições de comportamento e restrições que devem prevalecer.
Os Requisitos não Funcionais, estão normalmente relacionados a Requisitos
Funcionais, porém nem todo RNF necessita virar um aspecto. Pode se levar em
consideração e também auxiliar em sua escolha, como por exemplo, o impacto desse
requisito no sistema, sua abrangência em mais de uma classe e sua necessidade de
evolução. Realizando a separação desses aspectos, e possível evoluir no
desenvolvimento do sistema orientado a aspecto.
48
3 MODELAGEM DO SISTEMA
3.1.1 UML
49
A UML serve de interesse a qualquer pessoa que participe na produção,
desenvolvimento ou manutenção de um software. Pois prevê situações ainda não
identificadas na fase de desenvolvimento, facilitando assim para que se chegue ao final
de um software com maior aproveitamento do projeto.
50
os diagramas de UML, o mais abstrato, flexível e informal, sendo utilizado
principalmente no início da modelagem do sistema, embora venha a ser
consultado e possivelmente modificado durante todo o processo de engenharia
e sirva de base para a modelagem de outros diagramas”. (GUEDES, 2005).
51
3.3.1 Requisitos Funcionais
52
Descrição:
O sistema deve permitir a realização de transferências entre contas. Antes de
realizar essa operação a agência e a conta do cliente devem ser informadas. A
efetivação da operação depende da confirmação da senha do cliente.
Restrições lógicas: Usuário precisa confirmar a senha da conta.
53
QUADRO 11 - Verificação de saldo para transferência
RF8. O saldo da conta para realizar a transferência deve ser maior do que o
valor transferido
Descrição:
O sistema deve verificar se o saldo da conta de origem é maior do que o valor de
transferência da conta de destino, caso contrário, apresentar mensagem de alerta.
54
(FONTE: Próprio Autor)
RF8. O sistema deve validar os dados da conta de acesso através de uma senha
Descrição:
Para garantir a segurança do acesso, o sistema deve solicitar uma senha de
confirmação de conta, para assim garantir que a operação a ser realizada é válida.
55
O quadro 16 apresenta a lista de requisitos não funcionais do sistema.
56
FIGURA 28 - Diagrama de classe
3.5 Operações
57
FIGURA 29 - Diagrama de Atividade da Função Saque
58
O sistema deve permitir que o usuário realize Depósito. Na Figura 31 será
apresentado o Diagrama de Atividade dessa funcionalidade.
59
O sistema deve permitir que o usuário realize Transferência. Na Figura 33 será
apresentado o Diagrama de Atividade.
60
3.5.4 Consulta Extrato
O sistema deve permitir que o usuário visualize seu extrato. Na Figura 35 será
apresentado o Diagrama de Atividade
61
3.6 Prototipação de interface
A Figura acima representa a tela de acesso à conta do usuário, onde devem ser
inseridos os dados da agência e conta disponibilizadas pela operadora do cartão
cadastrado. Após isso, basta acessar o botão confirmar para prosseguir.
A Figura 38, representa as opções de saque, depósito, transferência e extrato,
disponíveis para utilização do usuário, bastando clicar na opção desejada.
62
FIGURA 38 - Interface Operações
63
FIGURA 40 - Interface Saque
64
FIGURA 42 - Interface Depósito
Na Figura 43 apresenta uma opção de Extrato para consulta das últimas operações
realizadas.
65
sua estrutura e particularidades para seu funcionamento. Com isso, foi possível
apresentar as principais classes necessárias para o desenvolvimento, assim como o fluxo
de funcionamento para cada opção que estará disponível, assim como as possíveis
classes para utilização de aspectos. Também foi realizada toda prototipação de interface,
apresentando assim uma documentação inicial do sistema.
66
4 DESENVOLVIMENTO
4.1.1 XML
Segundo PEREIRA (2006), o XML traz uma sintaxe básica que pode ser utilizada
para compartilhar informações entre diferentes computadores e aplicações. Quando
combinado com outros padrões, torna possível definir o conteúdo de um documento
separadamente de seu formato, tornando simples para reutilizar o código em outras
aplicações para diferentes propósitos. Uma das suas principais características é a
portabilidade, pois, por exemplo, um banco de dados pode escrever um arquivo XML
para que outro banco consiga lê-lo.
67
Alguns dos propósitos do XML consiste em auxiliar os sistemas de informação
no compartilhamento de dados (especialmente via internet), codificar documentos e
inserir seriais nos dados comparando o texto com o de outras linguagens baseadas em
serialização (PEREIRA, 2006).
4.1.2 JSON
Segundo AUGUSTO (2009), o JSON pode substituir o XML, e faz isso muito
bem na hora de trabalhar com respostas em AJAX. A estrutura de dados fica mais
simples de trabalhar e o tempo de execução de um script lendo dados em JSON é dezenas
de vezes mais rápido do que ler um conteúdo XML.
O JSON é um formato de troca de dados que também serve para serializar objetos.
Um objeto na memória pode ser transformado em um formato independente da
linguagem e ser transportado por qualquer meio até o seu destino, de maneira
semelhante ao SOAP (SAMPAIO, 2007).
4.1.3 PostSharp
68
4.2 Programação Orientada a Objetos
69
FIGURA 45 - Classe Comuns
70
arquivos salvos, carregando assim suas informações em uma lista de
objetos do tipo Conta.
ValidPassword verifica se a senha da conta logada confere com a
digitada pelo usuário.
AddValue adiciona o valor na conta, gera um extrato e grava em
arquivo.
RemoveValue remove o valor da conta, gera um extrato e grava em
arquivo.
A Classe Repositório é uma classe polimórfica “pai”, a qual “seta” um padrão
para que se possa salvar em arquivo formatado com estilo XML ou JSON.
A Figura 47 apresenta a implementação da classe repositório.
71
FIGURA 48 - JSON e XML
É possível notar que cada uma das classes utilizou os dois métodos override, o
qual são de assinatura da classe de Repositório. Sendo assim, os dois invocam os
mesmos métodos, cada um utilizando implementações específicas.
A camada Interface apresenta todas as classes WindowsForms, o qual constitui-
se de telas do sistema.
A camada de Negócio possui a classe Itransactions e a classe Transações que é
responsável pela implementação de todos os métodos da classe de interface
Itransactions, sendo responsável pelas principais operações do sistema.
A Figura 49 serão detalhados os principais métodos de operação do sistema.
72
FIGURA 49 - Classe Transações
73
FIGURA 50 - Classe static Static
74
Os métodos utilizados nas linhas 14 e 16, preparam os estilos que serão
utilizados nas classes WindowsForm, e na linha 19 inicia a tela de login: Formlogin() o
qual irá conhecer todos os métodos apresentados pela classe Transações, instanciada
através da linha 18.
75
Note que esta função é espalhada em vários métodos, conforme apresentado nas Figuras
54 a 58.
76
(FONTE: Próprio Autor)
FIGURA 58 - Método LoadAccount() (SetWithdraw)
77
FIGURA 59 - Etapas de Desenvolvimento de Software Orientado a Aspectos
78
FIGURA 60 - Estrutura de projeto com implementação de aspecto
79
FIGURA 61 - Biblioteca PostSharp
80
FIGURA 62 - Implementação aspecto de segurança
81
Toda essa implementação de aspecto é tratada dentro dos conceitos utilizados
pela POA. No próximo tópico serão detalhados tais conceitos com exemplos utilizados
na implementação.
4.3.1.2.1 Advice
O Advice nada mais é do que o “aspecto” que está sendo centralizado em uma
nova classe. Sendo assim, é o código que será executado em um determinado momento
da interrupção do fluxo principal para execução de um código secundário. As Figuras
64, 66 e 66 representam exemplos de advices.
82
FIGURA 66 - Advice Security
4.3.1.2.2 Pointcut
4.3.1.2.3 Joinpoint
83
FIGURA 68 - Aspecto inserido no fluxo principal
84
mecanismo eficaz para o desenvolvimento de software, com o seu foco voltado à
separação de interesses.
Abaixo serão apresentadas as principais vantagens e desvantagens em utilizar
a POA
4.4.1.1 Vantagens:
Foi possível constatar que utilizando aspectos para tratar questões relativas à
segurança, log do sistema e tratamento de exceções elimina-se os códigos replicados.
Assim, a repetição de trechos de código como blocos “Trace.write” ou
"if(!conta.Authorized)" são evitados, centralizando estes códigos em classes específicas.
85
regras de negócio, sem se preocupar com o código transversal, sendo assim, para cada
nova implementação serão recuperados os códigos já criados de maneira simples e
objetiva, aumentado assim a produtividade e facilitando a evolução.
Foi feita uma contagem do número de linhas de código gerada por cada versão
do aplicativo, onde se obtiveram os seguintes resultados apresentado no Quatro 17.
86
apenas os casos principais. Portanto, a redução de código poderia ser ainda maior.
4.4.1.2 Desvantagens:
87
5 APRESENTAÇÃO DO SISTEMA
Mesmo com o foco do trabalho voltado para esse novo conceito do paradigma
orientado a aspecto e não para o produto, para mostrar a aplicabilidade da POA foi
desenvolvido um protótipo referente a operações básicas de um caixa eletrônico, com
intuito de demonstrar um comparativo da POO versus a POA. O sistema desenvolvido
permite operações como por exemplo a realização de um saque, depósito, transferência
e extrato.
O protótipo ficou dividido em 8 telas, sendo a primeira: Tela de Login prevista
na modelagem, onde permite acessar as demais opções do sistema descrita na Figura 69.
88
acesso com este novo usuário criado.
A segunda tela contém as Opções de Operações, apresentando todas as opções
disponíveis para utilização, bastando selecionar a desejada. Figura 70.
89
FIGURA 72 - Operação Saque Protótipo
90
FIGURA 74 - Operação Transferência Protótipo
Para continuar a operação basta clicar em Confirma, que o sistema irá validar
os dados da agência e conta digitada, e caso exista, será apresentada uma nova tela para
que se confirme a operação através de uma senha. Figura 75.
Nessa tela, basta digitar a senha e clicar em Confirma, que após a validação
da senha a operação será realizada.
91
A última função disponível é o extrato. Selecionando essa opção, serão
apresentadas todas as transações realizadas e salvas no histórico. Figura 76.
92
6 CONCLUSÃO
93
REFERÊNCIAS BIBLIOGRÁFICAS
BARDOU, D. Roles, Subjects and Aspects: how do they relate? In: WORKSHOP
ON OBJECT-ORIENTED TECHNOLOGY, ECOOP 98, 12, 1998, Brussels. Berlin:
Springer-Verlag, 1998. p. 418- 419 (Lecture Notes In Computer Science; v. 1543).
94
BARNES Jhon, Rationale for Ada 2012: Introduction. 2012 Reino Unido.
BATEMAN, CORFIELD, ROSS, SCOTT e WIERSMA, 2015).
BOOCH Grady; IVAR, Jacobson; RUMBAUGH, James. UML Guia do Usuário. Rio
de Janeiro: Elsevier, 2005.
Coady, Yvonne; Feeley, Mike; Smolyn, Greg; Kiczales, Gregor. Using AspectC to
Improve the Modularity of Path-Specific Customization in Operating System
Code. Columbia, 2001.
DÉCIO, Otávio C. Guia de consulta rápida: XML. São Paulo: Novatec, 2000.
ELRAD, T.; Aksit, M.; Kiczales, G.; Lieberherr, K.; Ossher, H. Discussing Aspects of
AOP. Communications of the ACM, October 2001.
95
FRANCO, Ana Paula M., Métodos e representações de suporte à aquisição de
linguagens da aplicação. Dissertação de Mestrado da PUC-Rio, Abril 1992.
GUEDES, Gilleanes T.A. UML 2 – Guia de Consulta Rápida – Segunda Edição. São
Paulo: Novatec Editora Ltda, Novembro de 2005.
96
LEITE, J.C.S.P., Oliveira, A.P.A, A Client Oriented Requirements Baseline. In
Proceedings of the Second IEEE International Symposium on Requirements
Engineering, York, UK, IEEE Computer Society Press, 1995 pp 108-115.
97
Abordagem com Java. UNICAMP, 2001.
SEABRA, Rodolfo Moacir Jr. Análise e projeto orientado a objetos usando UML e
o Processo Unificado. Disponível em: < http://www.ufpa.br/cdesouza/teaching/
es/Exemplo-RUP-Rodolfo-Seabra.pdf>. Acessado em: 01 de Ago. 2015.
APÊNDICE
98
APÊNDICE A – ARTIGO…................................................................................... 100
99
APÊNDICE A - ARTIGO
1. Introdução
Durante anos, os engenheiros de softwares lutam quanto à estruturação de códigos, a fim de
maximizar sua reutilização e diminuir o risco de defeitos de um sistema. Enquanto a (POO)
Programação Orientada a Objeto fornece uma estrutura sólida para a organização de códigos,
acaba apresentando dificuldades para reutilizar características transversais, apresentando
problemas de entrelaçamento e espalhamento de código.
O autor Kiczales (1997) e sua equipe descrevem os problemas que (POO) Programação
Orientada a Objeto foi incapaz de capturar e resolver de uma forma clara. Eles observaram que
essas preocupações transversais acabaram sendo espalhadas por todo o código, deixando este
100
com um emaranhado de código, se tornando cada vez mais difícil de desenvolver e modificar.
Eles analisaram todas as razões entre as técnicas utilizadas para identificar o motivo de se
apresentar este descontrole, resultando neste “emaranhamento”, possibilitando o surgimento de
um novo conceito de programação orientada a aspecto.
101
Figura 2. Código com características transversais
Neste caso é possível notar que o método “conectar()” se faz presente em diversas
classes, podendo também ser espalhados em diversas partes de um programa. A manutenção
para uma alteração desse método impactara em todas as classes que fazem uso deste. Por
exemplo, a Figura 2(b) representa a alteração desse método, note que neste formato o
desenvolvedor deve procurar em todo sistema o método “conectar()”, e realizar sua alteração
de forma descentralizada, necessitando de uma maior quantidade de tempo para esta atividade.
Sento assim, este código redundante distribuído pelo sistema representa o problema de
entrelaçamento, com consequência no espalhamento de código em várias classes. Esta situação
geralmente está associada a alguns problemas conhecidos, sendo eles:
Baixa produtividade – A implementação simultânea de múltiplos interesses muda o foco
do desenvolvedor do interesse principal para interesses periféricos, gerando uma baixa
produtividade.
Menor reuso de código – Devido as circunstâncias, um módulo implementa interesses
múltiplos. Outros sistemas requerendo funcionalidades similares podem não conseguir
utilizar o módulo prontamente, reduzindo ainda mais a produtividade.
Qualidade de código baixa – O Entrelaçamento produz código com problemas ocultos.
Além disso, por atender a diversos interesses de uma só vez, um ou mais desses
interesses podem não receber atenção suficiente.
Dificuldade de compressão – Fica difícil de saber exatamente o que ocorre com uma
classe ao ler o seu código, pois as chamadas referentes ao entrelaçamento estão fora da
mesma.
Problemas de manutenção – Como não se tem um código centralizado a necessidade de
alteração de uma nomenclatura irá impactar em diversos métodos do sistema, tendo que
o desenvolvedor percorrer diversas linhas de códigos até certificar que todas sejam
atualizadas.
102
Dificuldade de evolução – Atender requisitos futuros pode obrigar a um retrabalho na
implementação. Como a implementação não é modularizada corretamente, isso implica
em modificar muitos módulos.
Devido a todas as situações indesejadas expostas, em 1997 Kiczales, líder da Xerox,
coordenou uma equipe de pesquisadores dos quais preocupados com estes problemas,
estudaram os motivos destes códigos transversais, sendo os primeiros a descrever o conceito de
Programação Orientada a Aspecto.
103
Figura 4. Códigos invasivos
Comparando com a primeira versão, o código perdeu a sua elegância e simplicidade,
depois que o código foi voltado para outros objetivos “misturado” com aquele que implementa
as regras do negócio.
Deve-se considerar o que ocorre quando é necessário alterar, por exemplo, a
implementação de segurança da aplicação. No exemplo mostrado, o código é espalhado por
vários métodos, e qualquer mudança significa um grande esforço de codificação.
Por fim, pode-se dizer que este código não está devidamente encapsulado nos seus
próprios módulos. Isto aumenta a complexidade do sistema e torna a manutenção do mesmo
muito difícil.
A POA então, busca resolver este problema permitindo que o programador implemente
essas questões (segurança, log, transações, e etc.) através de aspectos. Em muitas linguagens
que implementam POA, o aspecto é constituído de uma ou mais peças de advices (fragmentos
do código, como métodos) e uma lista de joinpoints (pontos no programa principal na qual os
advices são inseridos).
104
componentes de forma sistêmica (KICZALES, 1997). Os aspectos podem afetar um ou
mais componentes, possivelmente afetando sua estrutura e comportamento. Além disso,
amplia-se o uso do termo para denotar também um relacionamento genérico de um
aspecto para um ou mais componentes
JoinPoint. São métodos bem definidos na execução do fluxo do programa que compõem
pontos de corte. Segundo (KICZALES, 2001), pontos de junção podem ser
considerados como os nós do grafo de chamada de um objeto em tempo de execução.
Nesse grafo, por exemplo, os nós incluem locais onde um objeto recebe uma chamada
de método e locais onde um atributo de um objeto é referenciado, enquanto as arestas
apresentam as relações de fluxo de controle entre os nós. Os pontos de junção são
classificados em diversos tipos, dependendo do local específico onde eles residem no
programa.
PointCut: Pode ser entendido como uma variável. Esta variável armazena uma lista
contendo as assinaturas de métodos que se tem interesse em interceptar. Esta
interceptação é feita com o objetivo de alterar o fluxo original do programa e inserir
novas chamadas, advices (RESENDE; SILVA, 2005).
Advice: é uma estrutura que denota o que um aspecto deve fazer, ou seja, qual o
comportamento do aspecto. O advice designa a semântica comportamental do aspecto.
Todo advice está associado a um pointcut, que define pontos de junção.
De acordo com o autor (NELSON, 2005), advice são construções semelhantes aos
métodos, entretanto, não podem ser chamados diretamente pela aplicação base e nem pelo
próprio aspecto, pois sua execução é feita automaticamente após o entrecorte no ponto de
junção.
Weaving - É o processo onde é feita a “mesclagem” dos módulos do sistema de acordo
com os aspectos encontrados. O weaving é como uma outra etapa de compilação.
Através de um compilador especial é possível montar o sistema final combinando os
módulos principais e os secundários pelo método weaving (tecelagem), então tem-se o
nome de weaver ao compilador. O weaver tem a capacidade de interceptar as chamadas
de métodos em tempo de compilação ou execução, conforme seu propósito, podendo
desviar o fluxo de execução e até mesmo abortar a execução do método (SILVEIRA et
al., 2004).
A linguagem de aspectos deve suportar a implementação das propriedades desejadas de
forma clara e concisa, fornecendo construções necessárias para que o programador crie
estruturas que descrevam o comportamento dos aspectos e definam em que situações eles
ocorrem, para isso vale observar algumas situações que devem ser avaliadas antes de escolher
o paradigma.
105
Outro problema com a POA é a captura não intencional de Join points através de
wilcards. Por exemplo, supõem-se que seja especificado um determinado pointcut a um advice
associado, e um wilcard para todos os métodos que tenham certo padrão de nomenclatura. Um
programador desatento pode criar um método cujo nome seja compatível com esse wilcard,
sem que seja essa a sua intenção, levando a execução inadvertida do advice. Da mesma forma,
ao renomear um método, pode-se alterar completamente a sua semântica.
“Sistemas mais fáceis de desenvolver Os aspectos tornam a integração das partes do sistema
e manter” um módulo separado, o que traz mais facilidade no
desenvolvimento.
106
programa e redirecioná-lo para seu devido advice. Tal processo precisa ser realizado de tal
forma que preserve o comportamento original (SILVA, 2011).
107
Recompor os aspectos (aspectual recomposition): nesta etapa, tem-se o integrador de
aspectos que especifica regras de recomposição para criação de unidades de
modularização. A esse processo de junção da codificação dos componentes e dos
aspectos é dado o nome de combinação (weaving).
Na Figura 6 é apresentado as etapas de desenvolvimento de software orientado a
aspectos, extraída de LADDAD (2003).
108
do método: " + args.Method); para registro da saída do método executado. A Figura 7
representa está implementação.
109
Figura 8. Aspecto de exceção
A centralização deste código em uma classe de aspecto apresenta diversos benefícios a
fase de desenvolvimento, dentre eles a principal, relacionado a melhorar a modularização, com
isso tem-se uma maior facilidade de manutenção, evolução e implementação, sendo que o
desenvolvedor poderá se focar no que é de interesse, podendo utilizar os códigos transversais,
sem se preocupar em reescrevê-los.
5. Considerações Finais
Com a utilização da POA foi possível identificar diversas vantagens apresentadas, dentre elas
podemos citar uma melhor modularização, deixando as características em comum separadas
fisicamente através de classes de aspectos, como por exemplo, classe de segurança, tratamento
de exceções e auditoria. Através dessa separação é apresentado uma menor responsabilidade
em cada parte do sistema devido a eliminação dos códigos replicados em várias classes o que
possibilita o tratamento de assuntos transversais em classes individuais.
Como as classes em aspectos passam a ter menos responsabilidades no contexto geral
do sistema o código fica mais “enxuto”, as classes de regras de negócio apresentam uma menor
complexidade lógica, mantendo em seus métodos apenas o que se propõe a fazer, ficando o
código centralizado com fácil identificação dos aspectos gerando uma facilidade em se realizar
uma manutenção. Com isso, os desenvolvedores podem ser melhor distribuídos em um projeto,
cada um focando com o que é necessário, como por exemplo, uma equipe poderá cuidar da
implementação dos aspectos de log, persistência, exceção, segurança, e outra equipe focará com
a implementação das regras de negócio. Focadas no que um método realmente se propõe a fazer
sem se preocupar com características paralelas as quais poderão ser aproveitadas em qualquer
parte do sistema. Sendo assim, para cada nova implementação serão recuperados os códigos já
criados de maneira simples e objetiva, aumentado assim a produtividade e facilitando a
evolução do sistema
A redução do número de linhas implementadas também ficou visível com a POA. Nos
testes realizados com três aspectos implementados se teve uma redução de 17% código. Sendo
essa redução proporcional à quantidade de aspectos que foram implementados pois quanto
maior a quantidade de aspectos, menos código replicado e consequentemente menos linhas de
código gerado.
Mesmo com todos os benefícios identificados é importante frisar alguns pontos
negativos que devem ser analisados antes de se adotar esse novo paradigma de programação.
Como por exemplo o fato de apresentar uma compilação mais lenta, devido ao fato de que
durante a compilação, um processo de combinação é realizado (Weaver). O qual junta as classes
110
escritas em linguagem de componentes, com as classes escritas em linguagens de aspectos. A
criação desse código intermediário, que precede a compilação, gera atrasos. Também existe
uma dificuldade para refatorar um software já produzido orientado a objeto, pois a geração de
aspectos está interligada com a fase de modelagem, e muitos sistemas passaram por
implementações e evoluções não documentadas, sendo necessário um novo projeto de
modelagem de forma a identificar todos os aspectos para implementação.
Também deve-se destacar a limitação nos materiais de pesquisa. Apesar da existência
de alguns bons livros, a POO leva bastante vantagem sobre a POA nesse quesito, pois é um
paradigma já consolidado e amplamente difundido.
References
GARCIA, Rogel. O que é Programação Orientada a Aspectos? Disponível em: <
http://www.javaframework.org/portal/2010/04/14/o-que-programao-orientada-a-aspectos/
> acessado em: 04 de Fev. 2015.
HECHT, Marcelo Victora. Análise Automática de código para Programação Orientada a
Aspectos. Disponível em: <https://www.lume.ufrgs.br/bitstream/handle/10183/31118/
000779425.pdf> acessado em: 10 de Out. 2015.
KICZALES, G. et al. Aspect-Oriented Programming. In: European Conference on Object-
Oriented Programming, 1997. London.
KICZALES, G. et al. An overview of AspectJ. In: European Conference on Object Oriented
Programming, 2001. London.
LADDAD, Ramnivas. AspectJ in Action, Second Edition. Enterprise AOP with Spring
Applications. Greenwich, London, 2009.
NELSON, Torsten. Aspectos, Treinamento e Consultoria em Engenharia de Software. Belo
Horizonte, 01 de novembro de 2005.
RESENDE, Antônio M. Pereira; SILVA, Claudiney Calixto. Programação Orientada a
Aspectos em Java: Desenvolvimento de Software Orientado a Aspectos. Rio de Janeiro –
Brasport, 2005.
SILVA, Antônio Carlos Júnior. REFATORAÇÃO DE SISTEMAS ORIENTADOS A
OBJETOS PARA AUXILIAR A CONSTRUÇÃO DE UM TESTBED PARA
MANUTENÇÃO DE SOFTWARE ORIENTADO A ASPECTOS Disponível em
<http://www.cin.ufpe.br/~tg/2011-2/acsj.pdf> acessado em: 10 de Nov. 2015.
SILVEIRA, Fábio F. et al. Uma abordagem sobre atualização dinâmica em componentes de
sistemas orientados a objetos. São Paulo, 2004.
111