Naked Objects

29
Validação do Projeto Conceitual com Naked Objects Marcos Eduardo Bolelli Broinizi Universo Online Mestrado IME 2006

description

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

Transcript of Naked Objects

Page 1: Naked Objects

Validação do Projeto Conceitual com Naked Objects

Marcos Eduardo Bolelli Broinizi

Universo Online

Mestrado IME 2006

Page 2: Naked Objects

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

Page 3: Naked Objects

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

Page 4: Naked Objects

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

Page 5: Naked Objects

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.

Page 6: Naked Objects

Ambiente Naked Objects

Page 7: 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();

} }

Page 8: Naked Objects

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.

Page 9: Naked Objects

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

Page 10: Naked Objects

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

Page 11: Naked Objects

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

Page 12: Naked Objects

Fundamentos - abstrações

Classificação classe ou entidade nome e atributos

Relacionamento cardinalidade

Page 13: Naked Objects

Fundamentos - abstrações

Generalização-especialização

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

predicado

Page 14: Naked Objects

Fundamentos - abstrações

Composição física ou lógica

Page 15: Naked Objects

Fundamentos - abstrações

Objeto-relacionamento entidade que representa o relacionamento

Page 16: Naked Objects

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; } ... }

Page 17: Naked Objects

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; ...}

Page 18: Naked Objects

Anotações - Especialização

Entidade filha

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

Page 19: Naked Objects

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{ ...}

Page 20: Naked Objects

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; } ... }

Page 21: Naked Objects

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) { … } ... }

Page 22: Naked Objects

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) { … } ... }

Page 23: Naked Objects

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; } ... }

Page 24: Naked Objects

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

Page 25: Naked Objects

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; } ... }

Page 26: Naked Objects

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; } … }

Page 27: Naked Objects

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; } ... }

Page 28: Naked Objects

Ferramenta

Page 29: Naked Objects

Fim

[email protected]