Naked Objects

Post on 06-Jun-2015

1.010 views 0 download

description

Apresentação no laboratório de banco de dados da USP sobre naked objects

Transcript of Naked Objects

Validação do Projeto Conceitual com Naked Objects

Marcos Eduardo Bolelli Broinizi

Universo Online

Mestrado IME 2006

Introdução

Objetivoagilidade e precisão no projeto conceitual

sem prejuízo na precisão => abstrações de dados

Hipótesevalidação do projeto conceitual com a

participação do especialista de domínio

Introdução Justificativas

requisitos de dados => projeto conceitualdiagramas ER e UML

precisão de representação das abstrações de dados difícil validação pelo especialista de domínio

ferramentas existentes não priorizam a interação entre o especialista de

domínio e as abstrações de dados

Introdução

PropostaValidação precisão e agilidade

abstrações de dados => precisão iniciativa Naked Objects

usuário: solucionador de problemas especialista de domínio: responsável por solucionar os

problemas de especificação conceitual de dados

O que é Naked Objects?

Um padrão arquitetural no qual objetos do domínio são expostos diretamente ao usuário ao invés de serem escondidos atrás de estruturas convencionais de interface de usuário.

Um arcabouço que permite definir objetos como classes em Java seguindo um conjunto pré-estabelecido de convenções de código, tornando possível criar automaticamente uma interface de usuário orientada a objetos.

Ambiente Naked Objects

Criando um Naked Object public class Patient extends AbstractNakedObject { private final TextString name = new TextString();

private final InternalCollection appointments = new InternalCollection(Appointment.class, this);

public TextString getName(){ return name;

} public InternalCollection getAppointments() { return appointments; }

public Title getTitle(){ return getName().getTitle();

} }

Arcabouço NO

Classes ou tipos de entidade são representados por meio de ícones a partir dos quais é possível criar novas instâncias.

Uma instância também é representada como um ícone ou como um formulário listando os atributos dessa instância e seus valores.

Valores dos atributos podem ser editados por meio dos formulários das instâncias.

Métodos podem ser invocados por meio de um menu de contexto. Métodos cujo parâmetro seja uma instância de um outro objeto podem ser executados arrastando uma instância parâmetro e soltando-a sobre a instância alvo da execução.

Fundamentos – Naked Objects

Criação automática da interface gráfica

Objetos expostos diretamente ao usuário

Exploração dos requisitos de um sistema

Ciclos rápidos: prototipação e validação

Anotações – limites NO Não permite definir restrições de inserção nas

coleções Grande volume de código para definir uma

abstração simples como o relacionamento Dificuldade em alterar características, como a

cardinalidade muitos trechos de código devem ser alterados criação de novos métodos e/ou exclusão de outros

Não apresenta a agilidade esperada para explorar requisitos de dados com base nas abstrações

Anotações – superando os limites do NO

Extensão do arcabouço – novas coleções Anotações

permitem acrescentar dados adicionais às definições de classes NO

uma ferramenta interpreta as anotações criando o código necessário

pequeno volume de códigomodificações muito mais simples e rápidas

Fundamentos - abstrações

Classificação classe ou entidade nome e atributos

Relacionamento cardinalidade

Fundamentos - abstrações

Generalização-especialização

total ou parcial disjunta ou sobreponível especialização definida por

predicado

Fundamentos - abstrações

Composição física ou lógica

Fundamentos - abstrações

Objeto-relacionamento entidade que representa o relacionamento

Anotações - Classificação Identificar a classe como um tipo de

entidade do domínio de aplicação @Entity public class Book extends AbstractNakedObject { ... private final WholeNumber edition = new WholeNumber(); ... public WholeNumber getEdition() { return edition; } ... }

Anotações - Generalização Identificar hierarquias de dados entre as

entidades Entidade pai da relação

@Generalization( completeness = Completeness.Partial, disjointness = Disjointness.Overlapping)Class Person { WholeNumber age; ...}

Anotações - Especialização

Entidade filha

@Specialization( specializes = Person.class)@EntityClass Student{ ...}

Anotações – Especialização definida por predicado Extensão da anotação de Especialização

@PredicatedSpecialization( specializes = Person.class, fieldName = "age", operator = Operator.greaterThanEqualTo, value = "18")@EntityClass Employee{ ...}

Anotações - Relacionamento Identificar associações que representam

relacionamentos quaisquer entre duas entidades do domínio

@Entity public class Publisher extends AbstractNakedObject{ ... private final ExtendedInternalCollection items = new ExtendedInternalCollection("Items",Item.class, this); ... public ExtendedInternalCollection getItems(){ return items; } ... }

Anotações - Relacionamento @Entity public class Item extends AbstractNakedObject{ ... @RelationshipAssociation( cardinality = Cardinality.ManyToOne, relatedWith = Publisher.class, fieldRelatedName = "items", ) private Publisher publisher; ... public Publisher getPublisher() { … } public void setPublisher(Publisher publisher) { … } ... }

Anotações - Composição Identificar uma associação de todo e parte, ou seja, uma

associação na qual uma das entidades é composta pela outra

@Entity public class Volume extends AbstractNakedObject{ ... private PeriodicItem periodicItem; public PeriodicItem getPeriodicItem() { … } public void setPeriodicItem(PeriodicItem periodicItem) { … } ... }

Anotações - Composição @Entity public class PeriodicItem extends AbstractNakedObject{ ... @CompositeAssociation( cardinality = Cardinality.OneToMany, relatedWith = Volume.class, fieldRelatedName = "periodicItem", compositeType = CompositeType.Physical )private final ExtendedInternalCollection volumes = new ExtendedInternalCollection("Volumes",Volume.class, this);

public ExtendedInternalCollection getVolumes() { return volumes; } ... }

Anotações – Objeto-relacionamento

Identificar uma associação que possui um destaque suficiente no domínio de aplicação para ser representada como uma entidade, mas mantendo características de associação entre duas entidades existentes

Anotações – Objeto-relacionamento

@Entity public class Patient extends AbstractNakedObject { private final TextString name = new TextString(); private final ExtendedInternalCollection appointments =

new ExtendedInternalCollection("Appointments", Appointment.class, this);

public ExtendedInternalCollection getAppointments() { return appointments; } ... }

Anotações – Objeto-relacionamento

@Entity public class Appointment extends AbstractNakedObject { private final TextString date = new TextString(); private Patient patient; //with getters and setters private Dentist dentist; ... public TextString getDate() { return date; } … }

Anotações – Objeto-relacionamento @Entity public class Dentist extends AbstractNakedObject { ... private final TextString name = new TextString(); @RelationshipObject( cardinality = Cardinality.ManyToMany, relatedWith = Patient.class, fieldRelatedName = "dentist", compositeClass = Appointment.class, compositeFieldName = "appointments", compositeFieldRelatedName = "patient" ) private final ExtendedInternalCollection appointments = new ExtendedInternalCollection("Appointments",

Appointment.class, this); public ExtendedInternalCollection getAppointments() { return appointments; } ... }

Ferramenta

Fim

broinizi@ime.usp.br