APOO 4b
APOO 4b
Orientados a Objeto
com UML e Padrões
Parte IV
Projeto (1B)
by Creator
An empty collection
that will eventually
hold SalesLineItem 1.1: create()
instances.
:SalesLineItem
by Creator
2: spec := specification(upc)
3.1: create(spec, qty)
1.1: create()
:Product 3.2: add(sl)
by Expert
Catalog
sl: SalesLineItem
2.1: spec := find(upc)
message to the
collection (container)
object itself :Product :SalesLineItem
Specification
becomeComplete()
{
isComplete := true
}
by Controller by Expert
Sale--total()
{
tot := 0 1*: [for each] sli := next() SalesLineItem
for each SalesLineItem, sli :SalesLineItem
tot := tot + [Link]()
return tot
}
2.1: pr := price()
by Expert
by Expert
prodSpec:
ProductSpecification
SalesLineItem--subtotal()
{
return quantity * [Link]()
}
makePayment(cashTendered) 1: makePayment(cashTendered)
:POST :Sale
1.1: create(cashTendered)
:Payment
makePayment(cashTendered) 1: makePayment(cashTendered)
:POST s :Sale
2.1: add(s)
completedSales: Sale
Sale--balance()
{ return [Link]() - total() }
2: t := total()
Instancia objeto de domínio inicial, enviando-lhe
uma mensagem create
Objeto inicial pode ou não tomar conta da
execução
– Em aplicações interativas, controle da execução
normalmente fica com a camada de Apresentação
– Se objeto inicial toma conta da execução, uma
mensagem run (ou equivalente) pode ser enviada
num segundo diagrama de colaboração
© Nabor C. Mendonça 2001 12
Diagrama de Interação — inicializar
Candidatos para objeto de domínio inicial:
– Uma classe representando o sistema como um todo
Ex.: POST
– Uma classe representado o negócio ou organização
como um todo
Ex.: Loja (melhor — uma Loja pode conter vários
POSTs)
Instâncias de objetos persistentes
– Se poucas, criar de uma vez, durante inicialização
– Se muitas, criar sob demanda, conforme são
requisitadas
© Nabor C. Mendonça 2001 13
Diagrama de Interação — inicializar
Diagrama de colaboração parcial
Pass a reference to the
ProductCatalog to the
POST, so that it has
permanent visibility to it.
by Creator
1: create()
1.1: create()
1.2.2*: add(ps)
pc: :Product
ProductCatalog Specification
ps:
ProductSpecification
Asterix in sequence number
indicates the message occurs in
a repeating section.
Object Store
UPC Quantity
Total
Tendered Balance
presses button
Enter Item End Sale Make Payment
Cashier
onEnterItem()
1: enterItem(upc, qty)
Domain
post : POST sale : Sale
Layer
prodCatalog : ProductCatalog
POST--enterItem(upc, qty)
{
...
spec = [Link](upc)
...
}
2: spec := specification(upc)
3.1: create(spec, qty)
:Product
Catalog
sl : SalesLineItem
Sale--makeLineItem(ProductSpecification spec, int qty)
{
...
SalesLineItem--SalesLineItem(ProductSpecification spec, int qty)
sl = new SalesLineItem(spec, qty);
{
...
...
} productSpec = spec; // parameter to attribute visibility
...
}
© Nabor C. Mendonça 2001 18
Visibilidade Declarada Localmente
Existe de A para B quando B é declarado como um
objeto local dentro de um método de A
– Temporária — persiste apenas dentro do escopo do
método de A (permanente se B é atribuído a um
atributo de A)
– Duas maneiras comuns de alcançar:
1. Criar nova instância e atribuir para variável local
2. Atribuir objeto de retorno de um método para
variável local
1: [new sale] create()
enterItem(upc, qty)
:POST 3: makeLineItem(spec, qty) :Sale
2: spec := specification(upc)
POST--enterItem(upc, qty)
:Product {
Catalog ...
// local visibility via assignment of returning object
ProductSpecification spec = [Link](upc);
...
}
© Nabor C. Mendonça 2001 19
Visibilidade Global
Existe de A para B quando B é global para A
– Permanente — persiste enquanto A e B existirem
Forma menos comum de visibilidade em sistemas
desenvolvidos utilizando OO
– Maneira mais comum (mas não recomendada) de
atingir é atribuir nova instância a uma variável global
Alternativa recomenda:
– Padrão Singleton (GoF)
1: msg()
:A :B
«association»
2: msg()
:C
«parameter»
3: msg()
:D
«local»
4: msg()
:E
«global»
Sale
POST
Captures date
isComplete : Boolean
1 1 time
enterItem()
makeLineItem()
Concept; abstraction
POST Sale
Design Class Diagram
Captures date
isComplete : Boolean
endSale() 1 1 time
enterItem()
makePayment() makeLineItem()
Software component
quantity description
price
UPC
Payment
amount
description
price
endSale() specification() upc
enterItem()
makePayment()
description : Text
price : Quantity
endSale() specification(upc: Integer) : ProductSpecification upc : UPC
enterItem(upc : Integer, qty : Integer)
makePayment(cashTendered : Quantity)
Houses
1
1 1 Describes
Sale
POST date : Date
*
isComplete : Boolean SalesLineItem
Captures time : Time Contains
quantity : Integer
endSale() 1 1 1 1..*
becomeComplete()
enterItem() subtotal()
makeLineItem()
makePayment()
makePayment()
total()
1
Logs-completed * Paid-by
Payment
amount : Quantity
1
attribute
attribute : type
attribute : type = initial value
classAttribute
/derivedAttribute
...
method1()
method2(parameter list) : return type
abstractMethod()
+publicMethod()
-privateMethod()
#protectedMethod()
classMethod()
...
No sistema POST: todos os atributos são privados
e todos os métodos são públicos
Object Store
UPC Quantity
Total
Presentation Tendered Balance
Application Authorize
Record sales
Logic payments
Storage
Database
Presentation POSTApplet
Storage
Database
Isolamento da lógica da aplicação em
componentes separados
Distribuição através de diferentes computadores
e/ou processos
Alocação de desenvolvedores para camadas
específicas
O sistema inteiro pode ser considerado dentro do
escopo de um único pacote — o pacote Sistema
Notação para pacotes na UML:
Domain Concepts
Domain
High-level
Relational Database Object Database
Object- Communication Reporting
Interface Interface
oriented
Services
Layer
Examples:
1. Java Applets,
Application Frameworks &
MFC Documents and Views,
Support Libraries 2
VisualAge Visual Parts
2. JDK, MFC, STL
Low-level
Services
Layer
(object and
non-object
oriented)
Relational Object
Database Database
Domain
Vertical Layers
Services
Horizontal Partitions
Usada para oferecer um interface pública comum
para um pacote de serviço
Classes de outros pacotes comunicam-se apenas
com a fachada, a qual colabora com as outras
classes internas (privadas) para oferecer o serviço
Suporta baixo acoplamento
© Nabor C. Mendonça 2001 43
Sem Visibilidade para Janelas — O Padrão
Separação Modelo-Visão
Objetos do modelo (domínio) não devem ter
conhecimento sobre ou estar diretamente
acoplados a objetos da visão (apresentação)
Classes de domínio encapsulam qualquer
informação e comportamento relacionados à
lógica da aplicação
Classes de apresentação responsáveis apenas por
operações de entrada/saída
UPC Quantity
Total
Presentation (View) Layer Tendered Balance
(e.g., POSTApplet)
Enter Item End Sale Make Payment
Better. Worse.
Mecanismo mais comuns:
– Padrão Editor-Assinante (ou Observador)
– Callbacks
– Notificação de eventos
Domain
Relational Database
Object Database Interface
Interface
Relational Object
Database Database