Naked Objects

1.210 visualizações

Publicada em

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

Publicada em: Tecnologia
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
1.210
No SlideShare
0
A partir de incorporações
0
Número de incorporações
39
Ações
Compartilhamentos
0
Downloads
19
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Naked Objects

  1. 1. Validação do Projeto Conceitual com Naked Objects Marcos Eduardo Bolelli Broinizi Universo Online Mestrado IME 2006
  2. 2. Introdução <ul><li>Objetivo </li></ul><ul><ul><li>agilidade e precisão no projeto conceitual </li></ul></ul><ul><ul><ul><li>sem prejuízo na precisão => abstrações de dados </li></ul></ul></ul><ul><li>Hipótese </li></ul><ul><ul><li>validação do projeto conceitual com a participação do especialista de domínio </li></ul></ul>
  3. 3. Introdução <ul><li>Justificativas </li></ul><ul><ul><li>requisitos de dados => projeto conceitual </li></ul></ul><ul><ul><li>diagramas ER e UML </li></ul></ul><ul><ul><ul><li>precisão de representação das abstrações de dados </li></ul></ul></ul><ul><ul><ul><li>difícil validação pelo especialista de domínio </li></ul></ul></ul><ul><ul><li>ferramentas existentes </li></ul></ul><ul><ul><ul><li>não priorizam a interação entre o especialista de domínio e as abstrações de dados </li></ul></ul></ul>
  4. 4. Introdução <ul><li>Proposta </li></ul><ul><ul><li>Validação precisão e agilidade </li></ul></ul><ul><ul><ul><li>abstrações de dados => precisão </li></ul></ul></ul><ul><ul><ul><li>iniciativa Naked Objects </li></ul></ul></ul><ul><ul><ul><ul><li>usuário: solucionador de problemas </li></ul></ul></ul></ul><ul><ul><ul><ul><li>especialista de domínio: responsável por solucionar os problemas de especificação conceitual de dados </li></ul></ul></ul></ul>
  5. 5. O que é Naked Objects? <ul><li>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. </li></ul><ul><li>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. </li></ul>
  6. 6. Ambiente Naked Objects
  7. 7. Criando um Naked Object <ul><ul><li>public class Patient extends AbstractNakedObject { </li></ul></ul><ul><ul><li>private final TextString name = new TextString(); </li></ul></ul><ul><ul><li>private final InternalCollection appointments = </li></ul></ul><ul><ul><li>new InternalCollection(Appointment.class, this); </li></ul></ul><ul><ul><li>public TextString getName(){ </li></ul></ul><ul><ul><li> return name; </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>public InternalCollection getAppointments() { </li></ul></ul><ul><ul><li>return appointments; </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>public Title getTitle(){ </li></ul></ul><ul><ul><li> return getName().getTitle(); </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>} </li></ul></ul>
  8. 8. Arcabouço NO <ul><li>Classes ou tipos de entidade são representados por meio de ícones a partir dos quais é possível criar novas instâncias. </li></ul><ul><li>Uma instância também é representada como um ícone ou como um formulário listando os atributos dessa instância e seus valores. </li></ul><ul><li>Valores dos atributos podem ser editados por meio dos formulários das instâncias. </li></ul><ul><li>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. </li></ul>
  9. 9. Fundamentos – Naked Objects <ul><li>Criação automática da interface gráfica </li></ul><ul><li>Objetos expostos diretamente ao usuário </li></ul><ul><li>Exploração dos requisitos de um sistema </li></ul><ul><li>Ciclos rápidos: prototipação e validação </li></ul>
  10. 10. Anotações – limites NO <ul><li>Não permite definir restrições de inserção nas coleções </li></ul><ul><li>Grande volume de código para definir uma abstração simples como o relacionamento </li></ul><ul><li>Dificuldade em alterar características, como a cardinalidade </li></ul><ul><ul><li>muitos trechos de código devem ser alterados </li></ul></ul><ul><ul><li>criação de novos métodos e/ou exclusão de outros </li></ul></ul><ul><li>Não apresenta a agilidade esperada para explorar requisitos de dados com base nas abstrações </li></ul>
  11. 11. Anotações – superando os limites do NO <ul><li>Extensão do arcabouço – novas coleções </li></ul><ul><li>Anotações </li></ul><ul><ul><li>permitem acrescentar dados adicionais às definições de classes NO </li></ul></ul><ul><ul><li>uma ferramenta interpreta as anotações criando o código necessário </li></ul></ul><ul><ul><li>pequeno volume de código </li></ul></ul><ul><ul><li>modificações muito mais simples e rápidas </li></ul></ul>
  12. 12. Fundamentos - abstrações <ul><li>Classificação </li></ul><ul><ul><li>classe ou entidade </li></ul></ul><ul><ul><li>nome e atributos </li></ul></ul><ul><li>Relacionamento </li></ul><ul><ul><li>cardinalidade </li></ul></ul>
  13. 13. Fundamentos - abstrações <ul><li>Generalização-especialização </li></ul><ul><ul><li>total ou parcial </li></ul></ul><ul><ul><li>disjunta ou sobreponível </li></ul></ul><ul><ul><li>especialização definida por predicado </li></ul></ul>
  14. 14. Fundamentos - abstrações <ul><li>Composição </li></ul><ul><ul><li>física ou lógica </li></ul></ul>
  15. 15. Fundamentos - abstrações <ul><li>Objeto-relacionamento </li></ul><ul><ul><li>entidade que representa o relacionamento </li></ul></ul>
  16. 16. Anotações - Classificação <ul><li>Identificar a classe como um tipo de entidade do domínio de aplicação </li></ul><ul><li>@Entity </li></ul><ul><li>public class Book extends AbstractNakedObject { </li></ul><ul><li>... </li></ul><ul><li>private final WholeNumber edition = new WholeNumber(); </li></ul><ul><li>... </li></ul><ul><li>public WholeNumber getEdition() { </li></ul><ul><li>return edition; </li></ul><ul><li>} </li></ul><ul><li>... </li></ul><ul><li>} </li></ul>
  17. 17. Anotações - Generalização <ul><li>Identificar hierarquias de dados entre as entidades </li></ul><ul><li>Entidade pai da relação </li></ul><ul><ul><li>@Generalization( </li></ul></ul><ul><ul><li>completeness = Completeness.Partial, </li></ul></ul><ul><ul><li>disjointness = Disjointness.Overlapping </li></ul></ul><ul><ul><li>) </li></ul></ul><ul><ul><li>Class Person { </li></ul></ul><ul><ul><li>WholeNumber age; </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>} </li></ul></ul>
  18. 18. Anotações - Especialização <ul><li>Entidade filha </li></ul><ul><ul><li>@Specialization( </li></ul></ul><ul><ul><li>specializes = Person.class </li></ul></ul><ul><ul><li>) </li></ul></ul><ul><ul><li>@Entity </li></ul></ul><ul><ul><li>Class Student{ </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>} </li></ul></ul>
  19. 19. Anotações – Especialização definida por predicado <ul><li>Extensão da anotação de Especialização </li></ul><ul><ul><li>@PredicatedSpecialization( </li></ul></ul><ul><ul><li>specializes = Person.class, </li></ul></ul><ul><ul><li>fieldName = &quot;age&quot;, </li></ul></ul><ul><ul><li>operator = Operator.greaterThanEqualTo, </li></ul></ul><ul><ul><li>value = &quot;18&quot; </li></ul></ul><ul><ul><li>) </li></ul></ul><ul><ul><li>@Entity </li></ul></ul><ul><ul><li>Class Employee{ </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>} </li></ul></ul>
  20. 20. Anotações - Relacionamento <ul><li>Identificar associações que representam relacionamentos quaisquer entre duas entidades do domínio </li></ul><ul><ul><li>@Entity </li></ul></ul><ul><ul><li>public class Publisher extends AbstractNakedObject{ </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>private final ExtendedInternalCollection items = </li></ul></ul><ul><ul><li>new ExtendedInternalCollection(&quot;Items&quot;,Item.class, this); </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>public ExtendedInternalCollection getItems(){ </li></ul></ul><ul><ul><li>return items; </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>} </li></ul></ul>
  21. 21. Anotações - Relacionamento <ul><ul><li>@Entity </li></ul></ul><ul><ul><li>public class Item extends AbstractNakedObject{ </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>@RelationshipAssociation( </li></ul></ul><ul><ul><li>cardinality = Cardinality.ManyToOne, </li></ul></ul><ul><ul><li>relatedWith = Publisher.class, </li></ul></ul><ul><ul><li>fieldRelatedName = &quot;items&quot;, </li></ul></ul><ul><ul><li>) private Publisher publisher; </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>public Publisher getPublisher() { </li></ul></ul><ul><ul><li>… </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>public void setPublisher(Publisher publisher) { </li></ul></ul><ul><ul><li>… </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>} </li></ul></ul>
  22. 22. Anotações - Composição <ul><li>Identificar uma associação de todo e parte , ou seja, uma associação na qual uma das entidades é composta pela outra </li></ul><ul><ul><li>@Entity </li></ul></ul><ul><ul><li>public class Volume extends AbstractNakedObject{ </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>private PeriodicItem periodicItem; </li></ul></ul><ul><ul><li>public PeriodicItem getPeriodicItem() { </li></ul></ul><ul><ul><li>… </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>public void setPeriodicItem(PeriodicItem periodicItem) { </li></ul></ul><ul><ul><li>… </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>} </li></ul></ul>
  23. 23. Anotações - Composição <ul><ul><li>@Entity </li></ul></ul><ul><ul><li>public class PeriodicItem extends AbstractNakedObject{ </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>@CompositeAssociation( </li></ul></ul><ul><ul><li>cardinality = Cardinality.OneToMany, </li></ul></ul><ul><ul><li>relatedWith = Volume.class, </li></ul></ul><ul><ul><li>fieldRelatedName = &quot;periodicItem&quot;, </li></ul></ul><ul><ul><li>compositeType = CompositeType.Physical </li></ul></ul><ul><ul><li>)private final ExtendedInternalCollection volumes = new </li></ul></ul><ul><ul><li>ExtendedInternalCollection(&quot;Volumes&quot;,Volume.class, this); </li></ul></ul><ul><ul><li>public ExtendedInternalCollection getVolumes() { </li></ul></ul><ul><ul><li>return volumes; </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>} </li></ul></ul>
  24. 24. Anotações – Objeto-relacionamento <ul><li>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 </li></ul>
  25. 25. Anotações – Objeto-relacionamento <ul><ul><li>@Entity </li></ul></ul><ul><ul><li>public class Patient extends AbstractNakedObject { </li></ul></ul><ul><ul><li>private final TextString name = new TextString(); </li></ul></ul><ul><ul><li>private final ExtendedInternalCollection appointments = </li></ul></ul><ul><ul><li>new ExtendedInternalCollection(&quot;Appointments&quot;, Appointment.class, this); </li></ul></ul><ul><ul><li>public ExtendedInternalCollection getAppointments() { </li></ul></ul><ul><ul><li>return appointments; </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>} </li></ul></ul>
  26. 26. Anotações – Objeto-relacionamento <ul><ul><li>@Entity </li></ul></ul><ul><ul><li>public class Appointment extends AbstractNakedObject { </li></ul></ul><ul><ul><li>private final TextString date = new TextString(); </li></ul></ul><ul><ul><li>private Patient patient; //with getters and setters </li></ul></ul><ul><ul><li>private Dentist dentist; </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>public TextString getDate() { </li></ul></ul><ul><ul><li>return date; </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>… </li></ul></ul><ul><ul><li>} </li></ul></ul>
  27. 27. Anotações – Objeto-relacionamento <ul><ul><li>@Entity </li></ul></ul><ul><ul><li>public class Dentist extends AbstractNakedObject { </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>private final TextString name = new TextString(); </li></ul></ul><ul><ul><li>@RelationshipObject( </li></ul></ul><ul><ul><li>cardinality = Cardinality.ManyToMany, </li></ul></ul><ul><ul><li>relatedWith = Patient.class, </li></ul></ul><ul><ul><li>fieldRelatedName = &quot;dentist&quot;, </li></ul></ul><ul><ul><li>compositeClass = Appointment.class, </li></ul></ul><ul><ul><li>compositeFieldName = &quot;appointments&quot;, </li></ul></ul><ul><ul><li>compositeFieldRelatedName = &quot;patient&quot; </li></ul></ul><ul><ul><li>) private final ExtendedInternalCollection appointments = new </li></ul></ul><ul><ul><li>ExtendedInternalCollection(&quot;Appointments&quot;, </li></ul></ul><ul><ul><li>Appointment.class, this); </li></ul></ul><ul><ul><li>public ExtendedInternalCollection getAppointments() { </li></ul></ul><ul><ul><li>return appointments; </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>} </li></ul></ul>
  28. 28. Ferramenta
  29. 29. Fim <ul><li>[email_address] </li></ul>

×