Este documento apresenta uma proposta de arquitetura para customização de sistemas usando mecanismos de injeção de dependência. A monografia discute os problemas relacionados à customização de softwares, revisa técnicas atuais e propõe uma arquitetura baseada em identificação de contexto e injeção de dependência para permitir customizações com baixo impacto e fácil manutenção.
Sistemas Operacionais - Aula 6 - Estrutura do Sistema Operacional
Apresentação monografia - Proposta de uma Arquitetura para Customização de Sistemas usando Mecanismos de Injeção de Dependência - UFMG
1. Monografia de Final de Curso
Proposta de uma Arquitetura
para Customização de Sistemas
usando Mecanismos de Injeção
de Dependência
Aluno: Charles Wellington de Oliveira Fortes
Orientador: Prof. Marco Túlio Valente
2. Proposta de uma Arquitetura para Customização de Sistemas usando Introdução
Mecanismos de Injeção de Dependência
Monografia de Final de Curso
Independente de seu porte ou ramo de negócio, as
empresas possuem necessidades particulares
Estas particularidades são muitas vezes repassadas
aos softwares que lhes apóiam, seja criando
softwares específicos ou adaptando funcionalidades de
softwares vendidos como produto ou serviço
3. Proposta de uma Arquitetura para Customização de Sistemas usando Introdução
Mecanismos de Injeção de Dependência
Monografia de Final de Curso
Nesta monografia iremos focar nas formas como estas
necessidades são inseridas nos
softwares, caracterizando o que chamamos de
customização de softwares
O que significa em resumo, inserir as funcionalidades
específicas de uma empresa em um software já existente
(COELHO, 2007)
4. Proposta de uma Arquitetura para Customização de Sistemas usando Introdução
Mecanismos de Injeção de Dependência
Monografia de Final de Curso
Segundo Otávio P. Coelho – Arquiteto da Microsoft – em seu artigo sobre
técnicas de customização de software os software (COELHO, 2007), a
customização de softwares não se limita a introdução de
modificações no sistema, ela acarreta uma série de complexidades
e demanda um grande esforça de implementação.
5. Proposta de uma Arquitetura para Customização de Sistemas usando Introdução
Mecanismos de Injeção de Dependência
Monografia de Final de Curso
“Quando realizada pela empresa fabricante do software, a
customização pode ser, por vezes, uma fonte de
renda, por outras, de prejuízo.”
(COELHO, 2007)
6. Proposta de uma Arquitetura para Customização de Sistemas usando Problema
Mecanismos de Injeção de Dependência
Mesmo em se tratando de empresas do mesmo
Monografia de Final de Curso
ramo/setor, cada uma apresenta situações singulares
decorrente de sua cultura
organizacional, fluxo de
trabalho, especialização/diferencial dentre outros
Encontrar o melhor caminho para a adaptação de um
software de pouco
impacto e de fácil
desenvolvimento e manutenção tarefa que não
vem sendo fácil para os arquitetos e engenheiros de
software
7. Proposta de uma Arquitetura para Customização de Sistemas usando Objetivo Geral
Analisar as formas de customização utilizadas por
Mecanismos de Injeção de Dependência
algumas empresas do setor
Monografia de Final de Curso
Propor uma alternativa de arquitetura que permita que um
software seja adaptado com o mínimo de impacto em sua
versão padrão, sendo que a adaptação é simples de ser feita e
fácil de ser mantida.
8. Proposta de uma Arquitetura para Customização de Sistemas usando Objetivo Específico
Mecanismos de Injeção de Dependência
Pesquisar e comparar as formas utilizadas por diversas
Monografia de Final de Curso
empresas de software para a adaptação de seus
produtos, elicitando seus pontos positivos e
negativos.
Apresentar os resultados de qualidade e complexidade
obtidos por empresas que utilizam as formas mais comuns de
adaptação de software e propor uma alternativa.
9. Proposta de uma Arquitetura para Customização de Sistemas usando Objetivo Específico
Abordar as técnicas e padrões utilizados na arquitetura
Mecanismos de Injeção de Dependência
proposta, sendo elas
Monografia de Final de Curso
Inversão de Controle com Injeção de
Dependência
Reflexão computacional.
Apresentar a arquitetura proposta e como desenvolvê-la.
10. Proposta de uma Arquitetura para Customização de Sistemas usando Metodologia
Mecanismos de Injeção de Dependência
Monografia de Final de Curso
Pesquisa em materiais bibliográficos
Realização de pesquisa online sobre as formas
de customização adotadas
Aplicação prática em um projeto real
11. Proposta de uma Arquitetura para Customização de Sistemas usando Leis da Evolução de Software
Mecanismos de Injeção de Dependência Referencial teórico
Monografia de Final de Curso
Evoluções podem ser feitas para atender a demandas
tecnológicas do ambiente (LEHMAN, 2000)
ou as necessidades
específicas de um cliente
(COELHO, 2007).
12. Proposta de uma Arquitetura para Customização de Sistemas usando Leis da Evolução de Software
Mecanismos de Injeção de Dependência Referencial teórico
Monografia de Final de Curso
Este processo resulta em um aumento da complexidade e queda
da qualidade do código fonte, o que eleva os custos da
manutenção do software, podendo ir de 40% do custo de
desenvolvimento (BROOKS, 1995)
podendo inclusive excedê-los (SOMMERVILE, 2007).
13. Proposta de uma Arquitetura para Customização de Sistemas usando Leis da Evolução de Software
Mecanismos de Injeção de Dependência Referencial teórico
Monografia de Final de Curso
Durante o processo de alteração de um trecho do código fonte de um
software, mesmo que para manutenções corretivas, esbarramos com a
probabilidade de 20-50% de criar defeitos, além do aumento dos
custos e necessidade de cobertura dos testes (BROOKS, 1995).
14. Proposta de uma Arquitetura para Customização de Sistemas usando Padrões de Projetos
Mecanismos de Injeção de Dependência Referencial teórico
Monografia de Final de Curso
Alexander (ALEXANDER, 1979) define que um
padrão é uma
solução para um problema em determinado
contexto, podendo estes serem combinados para resolver um
problema complexo
15. Proposta de uma Arquitetura para Customização de Sistemas usando Inversão de Controle
Mecanismos de Injeção de Dependência Referencial teórico
Monografia de Final de Curso
foi proposta pois os módulos de alto nível não deveriam
depender diretamente dos módulos de implementação.
Passando assim a apontar estas dependências para
abstrações e transpassar o controle a eles (MARTIN, 2000).
16. Proposta de uma Arquitetura para Customização de Sistemas usando Inversão de Controle
Mecanismos de Injeção de Dependência Referencial teórico
Monografia de Final de Curso
Martin Fowler explica que a inversão de controle é
uma característica comum dos
frameworks, são um conjunto de “containers que
ajudam a montar componentes de projetos
diferentes em uma aplicação coesa”
(FOWLER, 2004)
17. Proposta de uma Arquitetura para Customização de Sistemas usando Injeção de Dependência
Mecanismos de Injeção de Dependência Referencial teórico
Monografia de Final de Curso
a injeção de dependência passa a poder
construir o objeto concreto na memória
conforme o contexto de
necessidade para aquela
abstração
(FOWLER, 2004)
18. Proposta de uma Arquitetura para Customização de Sistemas usando Reflexão para Instanciação de Classes
Mecanismos de Injeção de Dependência Referencial teórico
Monografia de Final de Curso
A reflexão computacional fornece objetos que encapsulam
assemblies, módulos e tipos, e pode ser usada para criar
instâncias de tipos dinamicamente, ligar o tipo a um objeto
existente ou obter as definições de tipagem de um objeto existente
(NET FRAMEWORK DEVELOPER'S GUIDE, 2010)
19. Proposta de uma Arquitetura para Customização de Sistemas usando Pesquisa
Mecanismos de Injeção de Dependência Proposta de Arquitetura
Monografia de Final de Curso
Distribuída de forma Online através do Google Docs
Respondida por 36 profissionais de nível sênior atuantes na área de
desenvolvimento ou arquitetura de software
Os profissionais representam uma única
empresa, localizadas nas cidades de Belo
Horizonte (MG), São Paulo (SP), Rio de Janeiro
(RJ) e Porto Alegre (RS)
20. Proposta de uma Arquitetura para Customização de Sistemas usando Pesquisa
Mecanismos de Injeção de Dependência Proposta de Arquitetura
Monografia de Final de Curso
Tipos de Customização segundo (COELHO, 2007)
Branchs: Cópia do código fonte pra cada cliente
Versionamento: Generalização das customizações para
atender a todos os clientes, como nova funcionalidade do
software
Fluxo condicional: Customização implementada no fonte
mas acessada através de uma validação condicional do tipo
if (condição) { [...] instruções [...]; }
Uso de linguagem de programação: Uso de linguagem de
programação específica do software para extensão.
21. Monografia de Final de Curso
Proposta de uma Arquitetura para Customização de Sistemas usando
Mecanismos de Injeção de Dependência
Pesquisa
Versionamento
Incidência de erros
Proposta de Arquitetura
Impactos
Complexidade
22. Proposta de uma Arquitetura para Customização de Sistemas usando Pesquisa
Proposta de Arquitetura
Branchs
Mecanismos de Injeção de Dependência
Monografia de Final de Curso
Prós Contras
O produto se torna mais atraente para o cliente A complexidade aumenta com regras de negócios
quando pode ser customizado à sua vontade. específicas de cada customização.
Redução do custo total de desenvolvimento do Precisam ser feito mais testes e um longo processo de
software e qualidade final é alta após processo de QA. Mas a qualidade final é alta.
QA.
Mantém um possível problema isolado a um cliente É preciso manter várias versões de um mesmo código.
específico.
rápida entrega difícil manutenção
Cada cliente recebe o que solicitou. Um erro comum encontrado deverá ser corrigido nos
fontes de todos os clientes.
Cada cliente é independente na customização do Uma implementação feita em um cliente deve ser
softaware. replicada para todos os clientes caso se queira essa
funcionalidade.
Facilidade de correção Gerenciar muitas branchs
23. Monografia de Final de Curso
Proposta de uma Arquitetura para Customização de Sistemas usando
Mecanismos de Injeção de Dependência
Pesquisa
Versionamento
Incidência de erros
Impactos
Proposta de Arquitetura
Complexidade
24. Proposta de uma Arquitetura para Customização de Sistemas usando Pesquisa
Proposta de Arquitetura
Versionamento
Mecanismos de Injeção de Dependência
Monografia de Final de Curso
Prós Contras
Baixa complexidade do código fonte Clientes que necessitam de situações muito
específicas não são atendidos
As novas funcionalidades ajudam na Funcionalidades que atendem a menos
evolução do produto e com isto a clientes são implementadas por último
conquistar mais clientes
Facilidade de manutenção
25. Monografia de Final de Curso
Proposta de uma Arquitetura para Customização de Sistemas usando
Mecanismos de Injeção de Dependência
Pesquisa
Incidência de erros
Fluxos Condicionais
Impactos
Proposta de Arquitetura
Complexidade
26. Proposta de uma Arquitetura para Customização de Sistemas usando Pesquisa
Proposta de Arquitetura
Fluxos Condicionais
Mecanismos de Injeção de Dependência
Monografia de Final de Curso
Prós Contras
Facilidade de Implementar Dificuldade de controlar os recursos específicos
e gerais
Entrega rápida Dificuldade de gerenciamento e rastreabilidade
dos requisitos e testes
Erros afetam um grande numero de clientes
27. Monografia de Final de Curso
Proposta de uma Arquitetura para Customização de Sistemas usando
Mecanismos de Injeção de Dependência
Pesquisa
Incidência de erros
Uso de linguagem de programação
Impactos
Proposta de Arquitetura
Complexidade
28. Proposta de uma Arquitetura para Customização de Sistemas usando Pesquisa
Proposta de Arquitetura
Uso de linguagem de programação
Mecanismos de Injeção de Dependência
Prós Contras
Monografia de Final de Curso
Adequação a regra de negocio do cliente. Dificuldade de manutenção.
Maior facilidade de implementação Pela facilidade de se customizar, esse modelo é
utilizado de forma abusiva carregando o cliente de
customizações desnecessárias.
desacoplamento. Alto custo.
Como os aplicativos são voltados para clientes
específicos o reaproveitamento deles é pequeno.
Mudanças no processo de negócio do cliente podem
afetar as funcionalidades implementadas no
software, podendo gerar necessidade de alterações
nas regras de negócio códigos da aplicação.
29. Proposta de uma Arquitetura para Customização de Sistemas usando Proposta
Mecanismos de Injeção de Dependência Proposta de Arquitetura
Identificação do contexto
Monografia de Final de Curso
O sistema deve possuir um contexto de execução que
identifique o que trataremos por CustomizationType
30. Proposta de uma Arquitetura para Customização de Sistemas usando Proposta
Mecanismos de Injeção de Dependência Proposta de Arquitetura
Identificação do contexto
Monografia de Final de Curso
O gerenciador de contexto da aplicação será tratado
com o nome AppContext
31. Proposta de uma Arquitetura para Customização de Sistemas usando Proposta
Mecanismos de Injeção de Dependência Proposta de Arquitetura
Inserindo a injeção de comportamento
Monografia de Final de Curso
A solução consiste em alterar o método responsável
por resolver as dependências da Inversão de Controle
que iremos tratar com o nome resolver
Ele deverá possuir um método “resolve”, que passará
a verificar antes qual o tipo está sendo passado no
parâmetro e deve tentar localizar o tipo
correspondente a ele, baseando-se no
CustomizationType dentro do AppContext
32. Proposta de uma Arquitetura para Customização de Sistemas usando Proposta
Mecanismos de Injeção de Dependência Proposta de Arquitetura
Método Resolver
Monografia de Final de Curso
Quando o método resolve for chamado, a primeira
coisa que ele deve fazer é buscar o
CustomizationType dentro do AppContext.
De posse do tipo de customização corrente,
o resolver irá tentar carregar um tipo, que é o
resultado da concatenação do nome do tipo
solicitado com o CustomizationType do
contexto
var newTypeName = typeof(T).FullName +
AuthContext.CurrentContext.CurrentUser.Company.Parameters.AccessType;
Type newType = Type.GetType(newTypeName);
33. Proposta de uma Arquitetura para Customização de Sistemas usando Proposta
Mecanismos de Injeção de Dependência Proposta de Arquitetura
Método Resolver
Monografia de Final de Curso
O tipo customizado deve estar no mesmo espaço de
trabalho que o tipo originalmente passado ao método
resolve. Após estes passos, caso o newType seja um
objeto nulo, o resolver irá recuperar o objeto instanciado
baseado no próprio tipo enviado no parâmetro genérico
(<T>), caso contrário, ele usa reflection para carregar o
objeto customizado
34. Proposta de uma Arquitetura para Customização de Sistemas usando Proposta
Proposta de Arquitetura
Método Resolver
Mecanismos de Injeção de Dependência
private static T Resolve<T>()
Monografia de Final de Curso
{
object obj = null;
var newTypeName = typeof(T).FullName +
AppContext.CurrentCompany.CustomizationType;
Type newType = Type.GetType(newTypeName);
if (newType != null)
obj = _dependencyResolver.GetType()
.GetMethod("Resolve")
.MakeGenericMethod(newType)
.Invoke(_dependencyResolver, null);
if (obj == null)
obj = _dependencyResolver.Resolve<T>();
return (T)obj;
}
35. Proposta de uma Arquitetura para Customização de Sistemas usando Proposta
Proposta de Arquitetura
Método Resolver
Mecanismos de Injeção de Dependência
Monografia de Final de Curso
Neste exemplo, caso o contexto ativo for o de uma
empresa “Empresa A” (CustomizationType =
“CustomerA”) que possui uma customização para o
serviço de usuário (UserService), o método resolve irá
procurar por uma classe UserServiceCustomerA no
mesmo espaço de trabalho de UserService
36. Proposta de uma Arquitetura para Customização de Sistemas usando Proposta
Proposta de Arquitetura
Método Resolver
Mecanismos de Injeção de Dependência
Monografia de Final de Curso
Neste mesmo exemplo, caso o contexto ativo seja de
uma empresa “Empresa B” (CustomizationType =
“CustomerB”) que não possui customização em
UserService ou uma “Empresa C” que não possui um
customizationType, o sistema irá retornar o “UserService”
que é o comportamento padrão do sistema
37. Proposta de uma Arquitetura para Customização de Sistemas usando Proposta
Proposta de Arquitetura
Criando customizações
Mecanismos de Injeção de Dependência
Monografia de Final de Curso
As customizações são feitas criando uma nova classe
que herde da classe a ser customizada, sendo que seu
espaço de trabalho deve ser o mesmo espaço de
trabalho da classe a ser customizada, e seu nome seja a
junção do nome da classe a ser customizada com o
nome do CustomizationType
38. Proposta de uma Arquitetura para Customização de Sistemas usando Proposta
Proposta de Arquitetura
Criando customizações
Mecanismos de Injeção de Dependência
Monografia de Final de Curso
Para customizar a classe de validação de empresa
(CompanyValidator), adicionando novas validações
específicas para um cliente, teremos por exemplo
39. Proposta de uma Arquitetura para Customização de Sistemas usando Proposta
Proposta de Arquitetura
Criando customizações
Mecanismos de Injeção de Dependência
Monografia de Final de Curso
namespace Sample.Core.Validation
{
public class CompanyValidatorCompanyA : CompanyValidator
{
public override bool ValidateRemove(Company toBeRemoved,
out IList<string> brokenRules)
{
base.ValidateRemove(toBeRemoved, out brokenRules);
[…]//condições de validação
brokenRules.Add(CompanyAResources.RootCompanyCantBeDeleted);
return brokenRules.Count == 0;
}
}
}
40. Monografia de Final de Curso
Proposta de uma Arquitetura para Customização de Sistemas usando
Mecanismos de Injeção de Dependência
Proposta
Organização das Customizações
Proposta de Arquitetura
41. Proposta de uma Arquitetura para Customização de Sistemas usando Resultados
Implementado pela empresa Prime Systems em projeto de médio
Mecanismos de Injeção de Dependência
porte de 6 meses de duração
Monografia de Final de Curso
Atuação de 5 profissionais, sendo 3 desenvolvedores
sênior e dois arquitetos sênior
A técnica foi usado no sistema para diferenciar o comportamento do
software quando este é:
• Empresas de um cliente
• A empresa que administra o sistema
• Empresas de teste e demonstração
42. Proposta de uma Arquitetura para Customização de Sistemas usando Resultados
Mecanismos de Injeção de Dependência
O Sistema é um software desenvolvido para a plataforma web e
Monografia de Final de Curso
vendido na forma de serviço pela Prime Systems, onde diversas
empresas contratam estes serviços.
Ao se cadastrar no Sistema, as empresas ganham um identificador
único que é utilizado sempre que um usuário da empresa tem que
acessar o Sistema, informando sempre o código da instancia, o
nome do usuário e a senha.
O sistema possui um cadastro de empesas, usuários, alguns ativos
específicos, monitoramento de operações e diversas configurações,
dentre as quais perfis de usuários, permissões de acesso, dentro
outros.
43. Proposta de uma Arquitetura para Customização de Sistemas usando Resultados
Mecanismos de Injeção de Dependência
O modelo foi aplicado para diferenciar, no
Monografia de Final de Curso
momento em que o usuário acessa o sistema,
qual o tipo de acesso sua empresa possui,
baseado em uma característica que foi informada
no momento de seu cadastro.
O desenvolvimento inicial, tido como fluxo convencional, foi o do
acesso do tipo “Cliente”, sendo utilizadas o modelo para diferenciar
a “empresa raiz” (que representa a Prime Systems, administradora
do sistema) e a “Empresa Falsa”, que é usada para testes e
demonstrações.
44. Proposta de uma Arquitetura para Customização de Sistemas usando Resultados
Mecanismos de Injeção de Dependência
Monografia de Final de Curso
A técnica foi bem avaliada por todos os envolvidos no projeto,
sendo ressaltada a facilidade de implementação e a boa separação
dos interesses, pois pode-se obter as mudanças de comportamento
necessárias ao tempo em que o código se manteve limpo e com
pouco possibilidade de um afetar o outro.
45. Proposta de uma Arquitetura para Customização de Sistemas usando Conclusão
Mecanismos de Injeção de Dependência
Monografia de Final de Curso
A proposta de arquitetura não provem a uma solução final para os
problemas acerca da customização de software, porém é uma
opção funcional e prática que pode ser aplicada e exercitada afim
de se refiná-la e aprimorá-la
46. Proposta de uma Arquitetura para Customização de Sistemas usando Referências
1/2
ALEXANDER, C. I. S. . S. M. The Timeless Way of Building. New York: Oxford University
Mecanismos de Injeção de Dependência
Press, 1979.
Monografia de Final de Curso
BROOKS, F. P. The mythical man-month: essays on software engineering. 2ª. ed. [S.l.]: Addison-
Wesley, 1995.
COELHO, O. P. Técnicas para Customização de Software. Microsoft MSDN Brasil, 2007. Disponivel
em: <http://www.microsoft.com/brasil/msdn/tecnologias/arquitetura/Customizacao_Software.mspx>.
Acesso em: 16 Janeiro 2012.
FOWLER, M. Inversion of Control Containers and the Dependency Injection, 2004. Disponivel em:
<http://martinfowler.com/articles/injection.html>. Acesso em: 20 Janeiro 2012.
GOUSSET, M. et al. Professional Application Lifecycle. 1ª. ed. Indiana: Wiley Publishing, 2012.
LEHMAN, M. M. Rules and Tools for Software Evolution Planning and Management. Imperial College
- Department of Computing, 2000. Disponivel em:
<http://www.doc.ic.ac.uk/~mml/feast2/papers/pdf/611_2.pdf>. Acesso em: 15 Janeiro 2012.
LEHMAN, M. M. Feedback, Evolution And Software Technology - Brief Introduction. FEAST, 2001.
Disponivel em: <http://www.doc.ic.ac.uk/~mml/feast/>. Acesso em: 15 Janeiro 2012.
47. Proposta de uma Arquitetura para Customização de Sistemas usando Referências
2/2
Mecanismos de Injeção de Dependência
Monografia de Final de Curso
MARTIN, R. C. http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf. Object
Mentor, 2000. Disponivel em:
<http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf>. Acesso em: 24 Janeiro
2012.
NET FRAMEWORK DEVELOPER'S GUIDE..NET Framework Developer's Guide: Reflection Overview.
MSDN, 2010. Disponivel em: <http://msdn.microsoft.com/en-us/library/f7ykdhsy(VS.71).aspx>. Acesso
em: 2010 julho 10.
PRESSMAN, R. S. Engenharia de Software. 3ª. ed. São Paulo: MAKRON Books do Brasil, 1995.
SHALLOWAY, A. Design patterns explained: a new perspective on object-oriented design. New York:
Addison-Wesley Publishing Co., 2002.
SOMMERVILE, I. Engenharia de Software. 8ª. ed. São Paulo: Pearson, 2007.