Upload
marcius-brandao
View
283
Download
4
Embed Size (px)
Citation preview
Marcius Gomes Brandão
Orientadora: Prof. Dra. Mariela Inés Cortés
Co-orientação : Prof. Msc. Ênyo J. T. Gonçalves
Mudanças são inevitáveis
Mudanças são consideradas
fáceis
Software não é construído, e sim
desenhado
Trabalho repetitivo é
automatizado
Desenvolvimento de Software é
pesquisa
Requisitos são incompletos
Software é Complexo
Software é Abstrato
Melhores práticas não estão maduras
Tecnologia muda rapidamente
Experiência em tecnologia é incompleta
Tecnologia é vasta
Introdução
Softwares são complexos!
Stepanek,2005
Introdução
50% do código e tempo de desenvolvimento
70% do código é de
infraestrutura
Maior complexidade esta no domínio
Motivação
Para o Standish Group a adoção de uma infraestrutura de software
padrão (por exemplo, frameworks de desenvolvimento) possibilita que a
equipe de desenvolvimento possa se concentrar no domínio de negócio
em vez de tecnologia
Objetivos
Orientação a Objetos
Completude Comportamental
Boas práticas de programação
Modelo flexível e fácil de manter
Rápido ciclo de desenvolvimento
Redução de prazos
Redução de custos
Redução de “Lines of Code”
Menos erros
Maior qualidade
Menor custo de manutenção
Metodologia: Embasamento teórico
Naked ObjectsRichard Pawson and
Robert Matthews, Wiley 2002
Applying Domain-Driven Design and PatternsJimmy Nilsson, Addison-Wesley,2006
Domain-Driven DesignEric Evans,Addison–Wesley,2004.
About FaceAlan Cooper,Wiley Publishing 2007
Metodologia: Projetos Reais
Metodologia: Estudos de Caso
Metodologia : Artigos científicos
“Naked Objects View
Language” “Entities – A framework Based on Naked
Objects for the Development of Transient
Web applications”
“Monitoramento e Controle de
Projetos com e-Kanban e Burndown:
Um Relato de Experiência”
“Domain-Driven Design
using Entities Framework”
Referencial teórico
Naked Objects
Domain-DrivenDesign
Naked Objects Architectural Pattern
Arquitetura padrão em 4-camadas Arquitetura com Naked Objects
O problema : quando os requisitos
mudam, geralmente temos que
propagar essas alterações
manualmente para as outras três
camadas (LÄUFER,2008).
Alterações no domínio se propagam
automaticamente para a interface do
usuário e as camadas de persistência
(PAWSON,2008).
Princípios NOP
Completude comportamental
Implementação genérica de serviços
UIs 100% geradas automaticamente
Único ponto de definição :Domain Model
Domain-Driven Design (DDD)
“código que resolve problema de domínio não se mistura com código que resolve problema de software” NILSSON(2006).
Domain-Driven Design (DDD)
Comparativo dos frameworks
NOVL
Layout Grid (Cooper2007) é um esquema em grade que fornece uma estrutura uniforme e consistente para a criação de uma interface com vários níveis de complexidade visual.
Linguagem de descrição de layout
baseada no layoutgrid
para personalização de UI
utilizando texto simples no lugar de estruturas mais sofisticadas
como SWING, CSS, XML, HTML, etc
independente de tecnologia
de rápido aprendizado e
dispensa o uso de ferramentas visuais de edição de interfaces
NOVL : Definição formal
NOVL : Diagramas de sintaxe
NOVL : Recursos
Convenção Usado para
property Nome case-sensitive da propriedade do naked object ou do controlador.
Action Nome case-sensitive do método do naked object ou do controlador.
, Separador de colunas.
; Separador de linhas.
:colspan Colspan define quantas colunas o membro deve ocupar na grade
*(readonly) O membro sempre será exibido em modo de leitura (saída de dados)
incondicionalmente.
#(writeonly) O membro sempre será exibido em modo de edição (entrada de dados)
incondicionalmente.
'label'É um texto simples que será atribuído ao próximo elemento. No caso de um membro,
substitui o rótulo padrão.
[] Define uma sub-grade.
+ Indica que o componente deve ser apresentado inicialmente no modo expandido.
- Indica que o componente deve ser apresentado inicialmente no modo recolhido.
<...>Delimita uma sub-grade que será apresentada a partir dos membros do domínio de
uma coleção.
NOVL : Mestre-Detalhe
NOVL: Estudo de caso
Usando NOVL
Arquitetura
Plataforma de desenvolvimento
JEE5
Polimorfismo
JavaServer Faces
Java Persistence API
Bean Validation
ExpressionLanguage
Reflexão
Annotations
Arquitetura
API Entities para UI
Infraestrutura para UI
BoundedControls
Filtragem
API Entities para persistência
public class Repository {Object newInstance(Class entity)void save(Object... entity)void load(Object... entity)void delete(Object... entity)List query(String query, Object... parameters)List query(String query, int start, int pageSize, Object... parameters)int executeUpdate(String query, Object... parameters)
}
public interface IRepository {void add(Object domain);int set(String domain, Object... parameters);void remove(Object domain);<T> T get(T domain);<T> T get(Class<T> domain, Object id);<T> List<T> get(String query, Object... parameters);<T> List<T> get(String query, int startIndex, int maxObjects, Object... params);long size(String query, Object... parameters); void persistAll();void clear();
}
API Entities para segurança
Implementação da arquitetura
Criando o Domain Model
Prototipação
Implementação do Domain Model
public class Order {private String number;private Customer customer;private Date orderDate;private int numberOfItems;private List<OrderLine> lines;private double totalAmount;private Status status;
public Order() { . . .}
public void addLine() { . . . } public void accept() { . . . }public void pay() { . . . }public void reject() { . . . }
private boolean isOkAccordingToSize() { . . . }private boolean isOkAccordingToCreditLimit() { . . . }
/* demais gets e sets omitidos */
public enum Status {NewOrder,Accepted,Paid,Canceled;}
}
Implementação do Domain Model@Entitypublic class Order implements Serializable {@Id @GeneratedValueprivate Integer id;
@Column(length = 8, unique = true, nullable = false)@NotEmpty(message = "Enter the number of the Order")private String number;
@ManyToOne(optional = false)@NotNull(message = "Enter the customer of the Order")private Customer customer;
@Past @Temporal(TemporalType.DATE)private Date orderDate;
@Column(precision = 4)@Min(value = 1, message = "Enter at least one line")private Integer numberOfItems = 0;
@Valid@OneToMany(mappedBy = "order",
cascade = CascadeType.ALL,orphanRemoval = true)
private List<OrderLine> lines;
@Column(precision = 8, scale = 2)private Double totalAmount;
@NotNull@Enumerated(EnumType.STRING)private Status status;
}
Instanciando o Domain Model
Instanciando o Domain Model
Mapeamento Objeto-User Interface
Mapeamento Objeto-User Interface
@Views({@View(
title="List of Orders",name="ListOfOrders",
filters="customer, Ctrl.DAO.filter()",members="number,orderDate,numberOfItems,totalAmount,status"footer="Ctrl.DAO.scroll()",
rows=10,namedQuery="From domain.Order order by number",
roles="LOGGED"),
@View(title="Add Order",name="AddOrder",
members="[Header[#number,#orderDate;#customer:2]; "+" Lines[addLine(); "
+" lines<#product,#numberOfUnits,#price>;"+" *numberOfItems]; "+" accept()] ",
namedQuery="Select new domain.Order()",roles="Admin,SalesMan")})
public class Order implements Serializable {
Contribuição geral
Desenvolvimento focado no domínio
UI robustas e consistentes
Redução de “Lines of Code” redundantes
Menos erros
Maior qualidade
Menor custo de manutenção
Rápido ciclo de desenvolvimento
Redução de prazos
Redução de custos
Contribuições da NOVL
Eliminação de uns dos principais limitadores do padrão Naked Objects
UI personalizadas
Não invalida o padrão
Independência de tecnologia
Uso SEM editores visuais de UI
Ciclo de aprendizado reduzido
Manutenção facilitada
Despreocupação da implementação da UI
Contribuições do Entities
Extensão do padrão Naked Objects
UI customizáveis
Múltiplas visões por objeto de domínio
Aplicações soberanas e transientes
Suporte a Domain-Driven Design
Essência da OO : Completude comportamental
Foco no domínio
Domínio independente da tecnologia
Trabalhos futuros
Upgrade da NOVL
Relatórios
Módulo de Testes
Outras plataformas
Perguntas?
“A simplicidade é o último grau de sofisticação”
Leonardo da Vinci.