Professional Documents
Culture Documents
EDICIONS UPC
Primera edici: setembre de 1999
Reimpressi: setembre de 2000
Segona edici: febrer de 2001
Sn rigorosament prohibides, sense l'autoritzaci escrita dels titulars del copyright, sota les sancions
establertes a la llei, la reproducci total o parcial d'aquesta obra per qualsevol procediment, inclosos la
reprografia i el tractament informtic, i la distribuci d'exemplars mitjanant lloguer o prstec pblics.
PFGZ
+PVTQFWEEK
+PVTQFWEEKCNFKUUGP[FGUQHVYCTG
+PVTQFWEEKCNOCTSWKVGEVWTCFGNUQHVYCTG
+PVTQFWEEKCNURCVTQPUFGFKUUGP[
2CVTCTSWKVGEVPKEGPECRGU
#TSWKVGEVWTCNIKECKHUKECFGNU5KUVGOGUFO+PHQTOCEK
&KUUGP[QTKGPVCVCQDLGEVGUGP7/.
+PVTQFWEEKCNFKUUGP[QTKGPVCVCQDLGEVGUGP7/.
%QPEGRVGUFO7/.RGTCNFKUUGP[
&KUUGP[FGNC%CRCFG&QOKPK
L'URGEKHKECEKFOWPGZGORNGIGUVKFOWPENWDFGVGPPKU
L0QTOCNKV\CEKFGNOGUSWGOCEQPEGRVWCNFOGURGEKHKECEK
L#RNKECEKFGRCVTQPUFGFKUUGP[
L2CVT+VGTCFQT
L2CVT%QPVTQNCFQT
L#UUKIPCEKFG4GURQPUCDKNKVCVUC1DLGEVGU
L2CVT'UVCV
L2CVT/VQFG2NCPVKNNC
L'ZGORNGFGFKUUGP[FGNCECRCFGFQOKPK
&KUUGP[FGNC%CRCFG2TGUGPVCEK
+PVTQFWEEK
L2CVT/QFGNL8KUVCL%QPVTQNCFQT
&KUUGP[FGNC%CRCFG)GUVKFG&CFGURGTUKUVPEKCGP$&11
7
Introducci al disseny de software 1
Independent de
la tecnologia Especificaci Qu ha de fer el sistema?
Especificaci del sist. sw.
Dependent de
la tecnologia Disseny Com ho fa el sistema?
Arquitectura del sist. sw.
Implementaci
Disseny de software
Disseny de software s lactivitat daplicar diferents tcniques i principis
amb el propsit de definir un sistema amb el suficient detall per permetre la
seva construcci fsica (implementaci).
Punt de partida:
Resultat de lespecificaci: (Qu ha de fer el sistema?)
. Especificaci de dades (Model de Dades)
. Especificaci de processos (Models Funcional i de Comportament)
. Especificaci de la interacci amb lusuari (Model de la Interfcie)
Tecnologia (Amb quins recursos)
. Recursos hardware i software disponibles
. Requeriments no funcionals del sistema
Bibliografia
10
Components
Vistes
Propietats de larquitectura
Principis de disseny
Determinaci de larquitectura
Bibliografia
11
Components
Un component s una part fsica i reemplaable dun sistema que :
s conforme a, i
proporciona una realitzaci
dun conjunt dinterfcies especificades contractualment.
Dinmiques
. Tracten de les connexions temporals i les interaccions dinmiques entre els
components
. No sn visibles fcilment en el codi
. Exemples: Protocols client-servidor, protocols daccs a bases de dades
12
Vistes
Una vista:
representa un aspecte parcial de larquitectura,
mostra propietats especfiques
Disseny Implementaci
Casos ds
Procs Desplegament
Casos ds: Com lusuari o analista veu el funcionament del sitema (cas ds, interacci)
Disseny: Descriu la soluci software (classes, interacci entre objectes )
Implementaci: Fitxers i components del sistema implementat (llibreries, executables)
Procs: Mecanismes de concurncia i sincronitzaci dels processos del sistema
Desplegament: Nodes que composen la topologia hardware del sistema instalat
Propietats de larquitectura
Canviable:
Extensible: Noves funcionalitats o millores dels components
Portable: Canv is plataforma hardware, sistemes operatius, llenguatges
Mantenible: Detecci i reparaci derrors
Reestructurable: Reorganitzaci de components
Interoperable
Capacitat de dues o ms entitats software dintercanviar funcionalitat i dades
Eficient
Temps de resposta, rendiment, s de recursos
Fiable:
Tolerncia a fallades: Prdua de connex i i recuperaci posterior
Robustesa: Protecci contra ls incorrecte I el tractament derrors inesperats
Provable
Facilitar les proves del sistema
Reusable: Assolir el que es vol amb lajuda del que es t
Reusar software ja existent
Fer software per a ser reusat
Integritat conceptual: Harmonia, simetria i predictibilitat
13
Principis de disseny
Abstracci
Encapsulament
Ocultaci dinformaci
Modularitzaci
Separaci de concerniments
Acoblament i cohesi
Suficincia, completesa i primitivitat
Separaci de poltica i implementaci
Separaci dinterfcie i implementaci
nic punt de referncia
Divideix-i-vencers
14
Per exemple:
Determinaci de larquitectura:
Dues vies complementries
Donats els requeriments del sistema degudament especificats, aplicar un conjunt passos genrics de
forma ordenada i sistemtica definits en un mtode
- procs molt guiat
- procs independent
Mtode
del problema
Especificaci Arquitectura
15
Bibliografia
16
Heterogenetat destils.
Bibliografia
Context:
Situaci on es presenta el problema de disseny
Problema:
Problema a resoldre
Forces: Aspectes que shan de considerar en la soluci
Soluci:
Esquema de soluci del problema, que equilibra les forces.
Dos aspectes:
. Esttic
. Dinmic
17
Patr arquitectnic:
Un patr arquitectnic expressa un esquema dorganitzaci estructural
fonamental per a sistemes software.
Proporciona un conjunt de subsistemes predefinits, especifica les seves
responsabilitats, i inclou regles i guies per organitzar les relacions entre ells.
Patr de disseny:
Un cop determinat el patr arquitectnic, un patr de disseny dna un
esquema per refinar els seus subsistemes o components, o les relacions
entre ells.
Descriu lestructura :
+ duna soluci a un problema que apareix repetidament
+ de components que es comuniquen entre ells
Resol un problema de disseny general en un context particular
Modisme:
Usats en la fase dimplementaci per a transformar una arquitectura en un
programa escrit en un llenguatge especfic.
Descriu lestructura duna soluci depenent del llenguatge de programaci
Crida i retorn:
estils arquitectnics ms usats, tradicionalment en grans sistemes
software
. Programa principal i subrutina
. Orientaci a objectes
. En capes
Centrat en dades:
per sistemes que requereixen accs a dades compartides
. Repositori
. Pissarra
Flux de dades:
per sistemes que donades unes dades dentrada realitzen una srie de
transformacions per obtenir unes dades de sortida
. Batch sequencial
. Tubs i filtres
18
Objecte Objecte
Op1() Op3()
Op2()
Objecte
Op4()
19
Client1 Client2
Client6 Repositori
Client3
(dades compartides)
Client5 Client4
20
Client1 Client2
Client5 Client4
cinta
llistats
21
Tubs i filtres
Procs2
Procs3
Procs6
Model-Vista-Controlador
T * Observador
1 actualitzar()
Model
dades
Vista
afegir(o:Observador)
treure(o:Observador)
inicialitzar(m:Model)
notificar() Controlador
ferControlador() Amb
obtenirDades()
mostrar() 1 1
servei()
actualitzar() inicialitzar(m:Model, v:Vista)
tractarEsdeveniment()
actualitzar()
22
Creaci:
Patrons de disseny relatius a com es creen classes i objectes
Estructurals:
Patrons de disseny relatius a com diferents classes i objectes es poden
combinar per definir estructures ms grans
Comportament:
Patrons de disseny relatius a com les classes i objectes interaccionen i
com sels hi han dassignar responsabilitats
. Assignaci de responsabilitats (Controlador, Expert, Creador)
. Iterador
. Estat
. Mtode Plantilla
. Observador
23
Patrons Arquitectnics:
- Patr Arquitectnic en 3 Capes (Presentaci, Domini i Gesti de Dades)
- Patr Orientaci a Objectes (dins de cada capa)
- Patr Model-Vista-Controlador (en la Capa de Presentaci)
Patrons de Disseny:
- Iterador
- Controlador
- Expert
- Creador
- Estat
- Mtode Plantilla
Bibliografia
Software Architecture
M. Shaw; D. Garlan
Prentice Hall, 1996, Cap. 2.
24
Context
Problema
Soluci:
Estructura
Comportament
Beneficis i inconvenients
Variants
Bibliografia
Context
25
Problema
Cal dissenyar un sistema amb la caracterstica dominant dincloure aspectes dalt i baix
nivell, on les tasques dalt nivell es basen en les de baix nivell.
Les tasques dalt nivell no es poden implementar utilitzant directament els serveis de la
plataforma, a causa de la seva complexitat. Calen serveis intermediaris.
En el futur, pot ser necessari construir altres sistemes, amb els mateixos
aspectes de baix nivell que aquest (Reusabilitat)
26
Soluci
Tots els components duna mateixa capa han de treballar al mateix nivell
dabstracci.
Soluci: Estructura
Sistema Software
usa
Client Capa N Nivell ms alt dabstracci
Capa N - 1
Dispositius Fsics
27
Soluci: Comportament
(Comunicaci de dalt a baix)
tasca
petici
resultat
28
Soluci: Comportament
(Comunicaci de baix a dalt)
notificaci
Soluci: Comportament
(Comunicaci bi-direccional)
petici
Protocol FTP
FTP FTP
resposta
Protocol TCP
TCP TCP
Protocol IP
IP IP
Protocol Ethernet
Ethernet Ethernet
Connexi fsica
29
30
Beneficis i inconvenients
Beneficis:
Reutilitzaci de les capes en altres contexts (interfcie i abstracci ben
definides)
Suport a lestandaritzaci (nivells dabstracci comunment acceptats)
Totes les dependncies sn locals (canvis locals)
Portabilitat
Facilitat de prova
Canviabilitat
Inconvenients:
Menor eficincia
Feina innecessria o redundant
Dificultat en establir la granularitat i nombre de capes
Variants
Una capa pot usar els serveis de totes les capes que estan per sota della
Una capa pot sser parcialment opaca
Conseqncies
31
Bibliografia
32
Bibliografia
passiva
Domini
Sistema
Informaci
activa
Passiva:
Mantenir una representaci consistent de lestat del domini:
. Capturar els esdeveniments que ocorren al domini
. Actualitzar lestat del sistema dinformaci com a conseqncia daquests
esdeveniments
. Assegurar la consistncia de la representaci
Activa:
Respondre a consultes sobre lestat del domini.
Produir reaccions quan es donen certes condicions predefinides.
33
...... esdeveniments
presentaci:
men seleccionat
bot premut
mostrar finestra
Sistema imprimir lnia
dInformaci ...
operacions
entrada/
...... sortida
......
Responsable de la interacci
amb lusuari
Capa Presentaci
Responsable de la implementaci
Sistema Capa del Domini de les funcionalitats del sistema
dInformaci
Capa de Gesti de dades
Responsable de la interacci
Sistemes gesti bases de dades/fitxers amb el SGBD/F
......
34
......
esdeveniments
presentaci
Tractament de:
Sassabenta peticions usuaris Finestres
Presentaci Ordena execuci accions Dilegs, Mens
Comunica resultats accions Botons
als usuaris Llistats
esdeveniments externs
consultes
respostes
resultats
Domini
La Capa del Presentaci coneix com presentar les dades a lusuari, per ignora
quines transformacions cal fer per donar resposta a les peticions de lusuari
Presentaci
esdeveniments externs
consultes
respostes
resultats
Sassabenta esdeveniments Sassabenta consultes
Domini En controla la validesa Obt els resultats
Canvia lestat del domini Comunica respostes
Executa accions encomanades
operacions de consulta i
modificaci a les dades
resultats
respostes
Gesti de dades
La Capa del Domini coneix com satisfer les peticions de lusuari, per ignora on es
guarden les dades i com es presenten a lusuari
35
Domini
operacions de consulta i
modificaci de les dades
resultats
respostes
Permet que el domini pugui ignorar on sn les dades.
Gesti de Les funcions concretes daquesta capa depenen del
Dades sistema de gesti de dades que susi. operacions de consulta i
modificaci en el llenguatge de
les bases de dades i fitxers
resultats
respostes
Sistemes de gesti bases de dades/fitxers
La capa del Gesti de Dades coneix on i com estan emmagatzemades les dades, per
desconeix com tractar-les
operacions de consulta i
modificaci en el llenguatge de
Gesti de dades les bases de dades i fitxers
resultats
Esque. SGBDi ...... SGFj respostes
......
Sencarrega de mantenir una
representaci persistent i concreta
de lestat del domini
36
REBUTS
Procs de dades discret Afegir rebut
Estmul: nou rebut (correcte)
Presentaci
Domini
37
......
......
......
Propietats de larquitectura:
Interfcie:
Presentaci - portable, reusable i canviable
(canvis a la interfcie sn locals)
Sistema
dInformaci Domini/Gesti de dades
Implementaci de funcionalitats:
- Poc portable, canviable i reusable
(molta dependncia del SGBD, el format i
Sistemes gesti bases de dades/fitxers localitzaci de les dades)
......
38
......
Propietats de larquitectura:
Implementaci de funcionalitats:
Presentaci/Domini - Poc portable, canviable i reusable
(molta dependncia de la interfcie, del GUI i
Sistema el disseny de pantalles)
dInformaci
Gesti de dades Accs a les dades:
- portable, reusable i canviable
(canvis en format, localitzaci i SGBD sn
Sistemes gesti bases de dades/fitxers locals)
......
......
Propietats de larquitectura:
Presentaci canviable
reusable
portable
Sistema Domini
dInformaci
Gesti de dades Tots els canvis sn locals
......
39
Bibliografa
Analysis Patterns
Martin Fowler
Addison-Wesley, 1997, cap. 12.
40
41
Implementaci
43
Dependncia tecnolgica:
Propietats que es volen assolir (requeriments no funcionals)
Recursos tecnolgics disponibles
famlia de llenguatges de programaci
famlia de sistema gestor de bases de dades
etc.
determina
44
En UML:
Es fan servir els mateixos models al disseny que a lespecificaci
La visi (enfocament) dels models s molt diferent a ambdues etapes:
Persona Ciutat
Treb-a Empresa
nom * * * T-prov-a * nom
nom
visita-provs(): ll-ciutats nm-hab
ll-ciutats = {nom-c}
45
Possibles coses a fer, des del punt de vista del domini de la soluci:
afegir informaci derivada (atributs i/o associacions)
simplificar jerarquies de generalitzaci / especialitzaci (eliminar subclasses)
afegir classes dobjectes redundants
considerar classes abstractes
etc.
Especificaci Disseny
Especificaci: el sistema software es veu com una sola classe dobjectes que
engloba tota la informaci i totes les operacions.
46
Esquema Conceptual:
Quins sn els conceptes rellevants del mn real de referncia ?
Diagrames de seqncia:
Defineixen la interacci entre les classes dobjectes per respondre un
esdeveniment extern.
47
Bibliografia
48
Classe dobjectes:
descriu un conjunt dobjectes que comparteixen atributs, associacions,
operacions i mtodes.
representa un concepte dins el sistema que sest modelitzant:
un concepte del mn real (a lespecificaci)
un concepte software equipat amb una implementaci (a disseny)
49
Persona
dni: String
Idioma
nom: String
adrea: String * Parla 1..* nom: String
telfon: Integer /nm-parl.: Integer
canvi-adrea(a:String): Boolean nou-parlant(dni:String)
telfon?(): Integer
afegir-idioma(nom:String)
Public (+): qualsevol classe que pot veure la classe, veu latribut
Protected (#): noms la prpia classe i els seus descendents veuen latribut
Private (-): noms la prpia classe veu latribut
Persona
Suposarem que els atributs sn privats,
+ dni: String
# nom: String a no ser que especifiquem una altra
- adrea: String = C/Nou visibilitat
- telfon [0..1]: Integer
50
Atributs: mbit
Atribut dinstncia:
representa una propietat aplicable a tots els objectes duna classe
cada objecte pot tenir un valor diferent daquest atribut
Atribut de classe:
propietat aplicable a la classe dobjectes com a tal
tots els objectes duna classe comparteixen el valor daquest atribut
Persona
dni: String
nom: String
adrea: String
edat: Integer
edat-promig: Real atribut de classe
Associacions: sintaxi
Navegabilitat
* Parla 1..* Persona a Idioma
Persona Idioma
#parlants +idiomes Idioma a Persona
* Parla 1..*
Persona Idioma Persona a Idioma
+idiomes
{propietats}
Navegabilitat:
indica si s possible o no travessar una associaci binria duna classe a una altra
si hi ha navegabilitat, lassociaci defineix un pseudoatribut (que correspon al rol
daquell sentit de navegaci) de la classe a partir de la qual es pot navegar
suposarem que les associacions sn privades, a no ser que sindiqui el contrari
51
Associacions: qualificador
Qualificador:
permet seleccionar un conjunt dobjectes relacionats amb un objecte qualificat
mitjanant una associaci.
un objecte, conjuntament amb el valor del qualificador, determina un nic objecte
(de vegades un conjunt dobjectes) de laltre extrem de lassociaci.
s un ndex en el recorregut de lassociaci
objecte
Ciutat Hotel qualificat
1 * Ciutat
T
nom-c: String nom-h: String nom-h
1 qualificador
R.I. textuals: T
0..1
- no hi pot hav er dues ciutats amb idntic nom-c
- una ciutat no pot tenir dos hotels amb nom-h Hotel
Associacions: ordenaci
52
Agregaci i Composici
Mail Cotxe
* * 1
...
1 1 1 1 0..5
isQuery
sequential
Public (+): loperaci pot ser invocada des de qualsevol objecte guarded
concurrent
Protected (#): pot ser invocada pels objectes de la classe i els seus descendents
Private (-): noms els objectes de la prpia classe poden invocar loperaci
53
Operacions: mbit
Operaci dinstncia:
loperaci s invocada sobre objectes individuals
Operaci de classe:
loperaci saplica a la classe prpiament dita
Exemple: operaci constructora, que serveix per donar dalta
noves instncies duna classe.
Alumne
Operaci constructora:
nom: String
edat: Integer Suposarem que, si no sindica el contrari,
cada classe dobjectes t una operaci
nom?(): Integer constructora amb tants parmetres com
nova-assig (nom-a:String): Boolean atributs t la classe.
alumne (nom: String, edat:Integer)
promig-edat(): Real Si es consideren altres constructores,
caldr definir-ne la seva signatura.
Operacions: contractes
Sistema
54
Contractes: exemple
Persona
Idioma
dni: String * Parla 1..*
nom: String
nom: String
R.I. textuals:
- Claus de les classes no associatives: (Persona, dni); (Idioma,nom)
Generalitzaci / Especialitzaci
Generalitzaci:
relaci taxonmica entre una classe ms general (superclasse) i una altra
ms especfica (subclasse)
la superclasse descriu les caracterstiques comunes a totes les subclasses
cada subclasse descriu un conjunt especfic de caracterstiques
Classe abstracta:
classe que no pot ser instanciada directament (no t objectes propis).
55
Herncia
Herncia:
en una generalitzaci, les subclasses incorporen (hereten) lestructura i el
comportament definits a la superclasse.
EmpleatUniversitari
nom: String
sou: Integer superclasse
nom?(): String
assigSou(Integer)
tipus {disjoint, complete}
Professor Administratiu
plus-lloc: Integer nm-h-extres: Integer
subclasses,
superclasse
plus?(): Integer def-h-ext(Integer)
contracte {disjoint, incomplete}
Polimorfisme
Operaci polimrfica:
operaci que saplica a diverses classes duna jerarquia tal que la seva
semntica depn de la subclasse concreta on saplica
EmpleatUniversitari
operaci concreta: t mtode nom: String operaci abstracta: no t mtode
associat a la mateixa classe sou: Integer associat a la classe on est declarada
nom?(): String
pagarSou():Integer
tipus {disjoint, complete}
Professor Administratiu
plus-lloc: Integer nm-h-extres: Integer
pagarSou(): Integer pagarSou(): Integer
contracte {disjoint, incomplete}
56
Herncia mltiple
Una classe pot ser subclasse directa dun nombre arbritari de superclasses
Una classe pot heretar atributs i operacions de diverses classes.
Es produeix un conflicte si una mateixa caracterstica apareix a diverses
superclasses.
Docent Investigador
assignatura: String categoria: String
escola: String escola: String
donarClasse() publicar(a: article)
corregir() donarClasse()
...
...
Professor-Universitat
Diagrames dinteracci
57
Diagrames de seqncia
:Client p:Producte
Creaci dobjecte
oper(a) Existncia dobjecte
:Transacci
op1(a,b) op2(a,c)
op3(c,d)
temps
op4(b)
Focus de control Autoinvocaci doperaci
resultat
result
Destrucci dobjecte
Notaci:
op3(c,d)
:Client instncia (objecte) invocaci de loperaci op3
amb retorn de control
c:Client instncia amb nom Client classe dobjectes
Professor Administratiu
plus-lloc: Integer preu-h-extra: Integer
nm-h-extres: Integer
s-base-alt?():Boolean
pagarSou(): Integer pagarSou(): Integer
s-base-alt? (a Professor)
sou-base? (invocada a Professor)
:Professor
:Professor
s-base-alt? sou-base?
sou-base?
string sou-b
retorna cert si sou-b
ms alt que K
boolean
58
Professor Administratiu
plus-lloc: Integer preu-h: Integer
nm-h: Integer
s-base-alt?():Boolean
pagarSou(): Integer pagarSou(): Integer
:Administratiu
:EmpleatUniv :Professor
pagarSou
pagarSou pagarSou sou-base?
retorna sou-b
retorna sou-b
enter sou-b + (nm-h x preu-h)
+ plus-lloc
enter
enter
Bibliografia
59
61
Model de Casos ds
Esquema Conceptual
Diagrames de seqncia del sistema
Contractes de les operacions del sistema
Administraci Reserves
Admetre soci Fer reserva
Canvi compte corrent Anul.lar reserva
Administrador Alta familiar Consultar reserves
Baixa soci Veure reserves no usades Persona
Baixa familiar
Facturaci
Gesti pistes
Fer rebuts
Pagar rebuts Afegir pistes
Fer crrecs de reserves Preveure manteniment
Carregar servei a soci Obtenir ocupaci pistes Encarregat
Facturaci
Total deute s pista pistes
Obtenir rebuts no pagats
Canviar parmetres club
63
Administraci
Admetre soci
Baixa Soci
Administrador
Alta Familiar
Familiar
Baixa familiar
64
Reserva
Soci
1 Amb * Familiar
dataReserva: Data
estat {disjoint, complete} 0..1 nmSoci: Integer
/deute:Import * Del CompteCorrent
Prevista NoUsada AnClient 1 1 1
data: Data nm-cc: Integer
Usada AnMant saldo: Import=0
T
data: Data s-pagada
/Correspon
0..1 *
*
Club 1 Crrec
Rebut
data: Data
ltNmSoci: Integer=0 mesEmissi: Mes
import: Import A 1
preuHoraPista: Import * pagat: Bool = false
desc.: String
preuNos:Import /import: Import
preuAnul.laci: Import
Informaci derivada:
El deute dun soci s la suma dels imports dels seus rebuts no pagats
Limport dun rebut s la suma dels imports dels crrecs de que es composa
Lassociaci correspon entre Soci i Rebut relaciona un soci amb els seus rebuts.
65
:Administrador :Sistema
Operaci: altaFamiliar (nmSoci: Integer; dni: String, nom: String, adrea: String, e-mail: String)
Classe retorn: Boolean
Semntica: Donar dalta un familiar dun soci.
Precondicions: Els parmetres tenen v alor, excepte e-mail que pot ser nul.
Postcondicions: 1. Si no existeix un Soci amb nmSoci, aleshores operaci invlida i es retorna fals.
2. En cas contrari, operaci vlida, es retorna cert i:
2.1 - Es crea un objecte de Familiar (i de Persona)
2.2 - Es crea una ocurrncia de lassociaci entre el familiar i el soci amb nmSoci
66
Bibliografia
67
Motivaci
Bibliografia
Motivaci
Al disseny hi tenim components software i no conceptes del domini
Limitaci tecnologia orientada a objectes: no permet implementar
directament tots els conceptes que hem usat a lespecificaci:
associacions n-ries, amb n > 2.
classes associatives
informaci derivada
control de les restriccions dintegritat
69
Esquema conceptual:
Interv al
Es-mant-en * data: Data
inici: Hora
* * Persona
Pista dni: String
reservant nom: String
nm: Integer *
adrea: String
Es-reserva 0..1
e-mail [0..1] : String
Reserva
dataReserva: Data
70
Si es calcula:
Desapareix (explcitament) la informaci derivada que es decideix calcular
Apareixen noves operacions per obtenir la informaci derivada que es
calcula
Si es materialitza:
Cal modificar els contractes de les operacions que provoquen canvis al
valor de la informaci que es materialitza
Selimina del diagrama de classes la indicaci que la informaci s derivada
Soci
Esquema conceptual:
nm: Integer 1
/deute: Import
1
T
*
/Correspon
Crrec
data: Data
import: Import Cal decidir si calculem o materialitzem la
desc.: String informaci derivada.
*
A Decidim:
- calcular latribut deute de Soci
0..1
- materialitzar import de Rebut
Rebut
- materialitzar lassociaci Correspon
mes: Mes
pagat: Bool = fals *
/import: Import
71
Soci
nm: Integer Cal modificar tamb els contractes
1
deute?(): Import de les operacions:
- Fer rebuts
1
T - Pagar rebuts
Dna la suma dels imports
dels rebuts no pagats *
perqu modifiquin el valor de:
Crrec - import de Rebut
data: Data - associaci Correspon
import: Import
desc.: String
*
A Correspon
0..1
Atribut Rebut
materialitzat mes: Mes Associaci
pagat: Bool = fals * materialitzada
import: Import
72
Assignaci
R.I. Textuals:
data-ini: Date
- Claus: (Empleat, codi); (Departament, nom)
- Data-ini dassignaci data-ingrs
- Un empleat no pot estar assignat alhora als departaments
de Vendes i de Control-Vendes
R.I. Textuals:
- Claus: (Empleat, codi); (Departament, nom)
- Data-ini dassignaci data-ingrs
- Un empleat no pot estar assignat alhora als departaments de Vendes i de Control-Vendes
- (Afegida) No hi pot haver dues assignacions amb els mateixos Empleat i Departament
73
Operaci normalitzada:
Bibliografia
74
Descripci general.
Soluci: Estructura.
Exemple daplicaci en UML.
Iteradors en Java: Enumeration.
Exemple daplicaci en Java.
Diccionaris.
Exemple diteraci de diccionaris.
Bibliografia.
Descripci general
Context:
Necessitat de fer recorreguts seqencials dels elements dun objecte agregat
(col.lecci dobjectes).
Problema:
Es vol accedir als elements dun objecte agregat, sense exposar lestructura
interna.
Es vol poder tenir diverses travessies pendents del mateix objecte agregat.
Es vol poder travessar els elements dun objecte agregat de formes diferents.
No es vol inflar la classe de lobjecte agregat amb operacions per les
diverses travessies possibles.
Soluci:
Treure la responsabilitat de laccs i recorregut de lobjecte agregat i assignar
aquesta reponsabilitat a una nova classe dobjectes que anomenarem
Iterador.
LIterador proporcionar una interficie per accedir i recrrer els elements de
lobjecte agregat.
75
Soluci: Estructura
Cas dun nic recorregut per agregat
Iterador
Defineix una interfcie per
Disseny Agregat first() accedir i travessar els
next() elements dun agregat
crearIterador(): Iterador
isDone() : Boolean
Defineix una interfcie per currentItem() : Object
crear un objecte Iterador
Vector
Implementaci IteradorVector
crearIterador(): Iterador first()
next()
LinkedList isDone():Boolean
IteradorLlista
currentItem():Object
first()
crearIterador(): Iterador
next()
isDone():Boolean
Llistes i Vectors currentItem():Object
Implementa la interfcie en Java
de creaci de lIterador Implementa la interfcie
que retorna una instncia definida a lIterador segons
de lIterador concret el recorregut que es vulgui fer
Soci Rebut
1 Correspon * mesEmissi : Mes
nmSoci:Integer pagador
rebuts import : Import
deute():Import pagat : Boolean = False
R.I. Textuals
- No poden existir dos socis amb el mateix nmSoci.
- Un soci no pot tenir diversos rebuts amb el mateix mesEmissi.
Es vol dissenyar loperaci deute de Soci (suma dels imports dels seus rebuts no
pagats).
76
pagat?() rebuts
acumula limport si el *
rebut no sha pagat Rebut
import?()
mesEmissi : Mes
next() import : Import
pagat : Boolean = False
Import
pagat?() : Boolean
la definici daquesta navegabilitat
import?() : Import
s conseqncia del disseny de
loperaci deute
Enumeration
next hasMoreElements(): Boolean
LinkedList head 0..1 nextElement(): Object
size : Integer 0..1 Link
tail
reset()
hasMoreElements(): Boolean 0..1
nextElement(): Object pre
currentElement(): Object
elements(): Enumeration 0..1 ListEnumeration
size():Integer
hasMoreElements(): Boolean
1 data nextElement(): Object
Object
77
:Soci :Rebut
Class Soci
{...
deute rebuts()
LinkedList rebuts
...
} :Enumeration
hasMoreElements()
Class Rebut
{...
... nextElement()
Implementaci de
} lassociaci Correspon
i la seva navegabilitat, * pagat?()
mitjanant atributs
import?()
Import
Diccionaris
La classe dobjectes Diccionari mant una col.lecci dobjectes que poden ser
accedits mitjanant una clau key.
La clau key per accedir als objectes dun diccionari ha de ser clau externa de
lobjecte al que es vol accedir.
Diccionari
size: Integer
retorna nul si no hi ha cap
objecte amb aquesta key diccionari()
get(key:Object): Object
put(key:Object, v:Object): Object
remove(key :Object): Object retorna un objecte Iterador
elements(): Iterador que travessa els objectes del
keys(): Iterador diccionari
si la clau ja existeix, subtitueix
lobjecte existent O per v, i retorna un objecte Iterador
retorna O que travessa les claus del
diccionari
Exemples dinstncies:
78
Hashtable
size : Integer
hashtable()
retorna nul si no hi ha cap get(Object key) : Object
objecte amb aquesta key
put(Object k, Object v) : Obj ect
retorna un objecte Iterador
remove(Object key) : Object
que travessa els objectes del
elements() : Enumeration diccionari
keys() : Enumeration
si la clau ja existeix, subtitueix retorna un objecte Iterador
lobjecte existent O per v, i que travessa les claus del
retorna O diccionari
Exemple dinstncia:
dicRebuts:Diccionari dicSocis:Hashtable
Club 1
R.I. Textuals
- No poden existir dos socis amb el mateix nmSoci.
Es vol calcular el deute que t el Club (suma dels deutes de tots els socis).
79
Soci
:Club dicSocis:Diccionari :Soci numSoci : Integer
deute() : Import
total_deute
elements()
:Iterador
first()
Club 1
isDone() preuHoraPista: Import
preuNos: Import
currentItem() * darrerNumSoci:Integer=0
preuAnul.laci: Import
deute()
total_deute(): Import
next()
Import
la definici de loperaci
deute sha fet anteriorment.
Bibliografia
http://www.eli.sdsu.edu/courses/spring98/cs635/notes/iterator
80
Descripci general
Controlador Faana
faana-sistema
faana-empresa
Controlador Paper
Controlador Cas ds
Controlador Transacci
Bibliografia
Descripci general
Context:
Els sistemes software reben esdeveniments externs
Un cop interceptat un esdeveniment a la Capa de Presentaci, algun
objecte de la Capa del Domini ha de rebre aquest esdeveniment i executar
les accions corresponents
Problema:
Quin objecte s el responsable de tractar un esdeveniment extern?
Soluci:
Assignar aquesta responsabilitat a un controlador
Un controlador s un objecte duna certa classe
Possibles controladors:
. Faana-Sistema: Un objecte que representa tot el sistema
. Faana-Empresa: Un objecte que representa tot el domini (empresa, etc.)
. Paper: Un objecte que representa un actor
. Cas ds: Un objecte que representa una instncia dun cas ds
. Transacci: Un objecte que representa una instncia desdeveniment extern
81
Tots els esdeveniments externs sn processats per un sol objecte controlador faana
Controladors inflats si hi ha molts esdeveniments externs
Nhi ha de dos tipus depenent el significat que li donem:
- Controlador faana-sistema
- Controlador faana-empresa
SistemaGestiClub 1
Club 1
ltNumsoci: Integer=0
preuNos: Import
preuHoraPista: Import
preuAnullaci: Import
ltNmSoci?(): Integer
incrementar-ltNmSoci()
altaSoci(dni:String, nom:String, adrea:String, e-mail:String, nm-cc:Integer, out nmSoci:Integer): Boolean
baixaSoci(nmSoci:Integer) : Boolean
altaFamiliar(nmSoci:Integer, dni:String, nom:String, adrea:String, e-mail:String): Boolean
baixaFamiliar(nmSoci:Integer, dni:String) : Boolean
canviCompteCorrent(nmSoci:Integer, nm-cc:Integer): Boolean
....
En aquest exemple hem aprofitat lobjecte Club del model conceptual i li hem afegit la
responsabilitat de ser el controlador.
82
Controlador Paper
Administrador
Controlador Cas ds
Controlador Cas ds: Un objecte que representa un cas ds
Admetre Soci
83
Classe abstracta
Transacci
AltaSoci
dni: String CanviCompteCorrent AltaFamiliar TotalDeute
nom: String
nmSoci: Integer nmSoci: Integer deute: Import
adrea: String
nm-cc: Integer dni: String
e-mail[0..1]: String executar()
resultat: Boolean nom: String
nmSoci: Integer deute():Import
resultat():Boolean adrea: String
nm-cc: Integer
executar() e-mail[0..1]: String
resultat: Boolean
resultat: Boolean FerRebuts
nmSoci?(): Integer
mesEmissi: Mes
resultat():Boolean resultat():Boolean
executar() executar() executar()
84
e-mail nmSoci
endavant plega
:Control-Interfcie
onEndav ant
...
Mostra el nmSoci
per pantalla resultat()
Obt el nmSoci
nmSoci()
endavant plega
:Control-Interfcie :Club
onEndav ant
altaSoci(...)
:AltaSoci Es dona dalta
executar() un soci
...
Mostra el nmSoci
per pantalla
resultat() Obt el nmSoci
nmSoci?()
85
Bibliografia
86
87
Acoblament
B
Hi ha un acoblament de la classe A a la classe B si:
A t un atribut de tipus B
A t una associaci navegable amb B
B s un parmetre o el retorn duna operaci de A
Una operaci de A referncia un objecte de B
A
A s una subclasse directa o indirecta de B atribut : B
operac(b : B) : B
Persona
dni: String
nom: String
adrea: String
e-mail [0..1]: String
tipus {disjoint, complete}
deute(): Import
Restriccions dintegritat:
Claus de classes no associatives (Persona, dni)
No hi poden hav er dos socis amb el mateix nmSoci
Suposicions:
Lassociaci Amb t nav egabilitat doble
88
creassocAmb(s)
Sassocia el familiar f al soci
afegirFamiliar(f:Familiar)
89
f:Familiar
creassocAmb(s)
Persona
dni: String Transacci
nom: String
adrea: String executar()
e-mail [0..1]: String
tipus {disjoint, complete}
Familiar Alta_familiar
nmSoci: Integer
Amb *
Soci dni: String
nom: String
nmSoci: Integer
adrea: String
1
deute(): Integer e-mail [0..1]: String
afegirFamiliar(dni:String, nom:String, resultat: Boolean
adrea:String, e-mail:String):Boolean
executar()
resultat():Boolean
90
Cohesi
Cohesi duna classe s una mesura del grau de relaci i de concentraci de les
diverses responsabilitats duna classe.
Cohesi: exemple
Club 1
ltNumsoci: Integer=0
preuNos: Import
preuHoraPista: Import
preuAnullaci: Import
ltNmSoci?(): Integer
incrementar-ltNmSoci()
altaSoci(dni:String, nom:String, adrea:String, e-mail:String, nm-cc:Integer, out nmSoci:Integer): Boolean
baixaSoci(nmSoci:Integer) : Boolean
altaFamiliar(nmSoci:Integer, dni:String, nom:String, adrea:String, e-mail:String): Boolean
baixaFamiliar(nmSoci:Integer, dni:String) : Boolean
canviCompteCorrent(nmSoci:Integer, nm-cc:Integer): Boolean
....
91
Patr Expert
Context:
Assignaci de responsabilitats a objectes
Problema:
Decidir a quina classe hem dassignar una responsabilitat concreta
Soluci:
Assignar una responsabilitat a la classe que t la informaci necessria per
realitzar-la
Laplicaci del patr requereix tenir clarament definides les responsabilitats
que es volen assignar (postcondicions de les operacions)
No sempre existeix un nic expert, sin que poden existir diversos experts
parcials que hauran de collaborar.
Beneficis:
Es mant lencapsulament baix acoblament
Conducta distribuda entre les classes que tenen la informaci
alta cohesi
Interval
data: Data
Pista
1
Transacci inici: Hora nm: Integer
La
1
executar() En
* *
Reserva *
Per
Baixa_familiar datReserva: Data reservant
1
numsoci: Integer
dni: String Persona
resultat: Boolean dni: String
executar() nom: String
resultat():Boolean adrea: String
e-mail [0..1]: String
92
93
:Soci
elimassocAmb(p)
:Familiar :Soci
:Soci
familiar-de(nmSoci) familiar-de(nmSoci)
nmSoci?()
Boolean fals
compara si nmSoci
coincideix
p:Persona
eliminarReserves()
reserves()
:Iterador
first() :Reserva
isDone() operaci
currentItem() pendent de
* eliminar() definir
next()
94
Transacci Soci
numSoci: Integer
executar()
deute(): Integer 1
nmSoci?(): Integer
familiar-de(nmSoci:Integer): Boolean Amb
Baixa_familiar
*
numsoci: Integer
dni: String
Familiar
resultat: Boolean
familiar-de(nmSoci:Integer): Boolean
executar()
baixa()
resultat():Boolean
Patr Creador
Context:
Assignaci de responsabilitats a objectes
Problema:
Qui ha de tenir la responsabilitat de crear una nova instncia duna classe.
Soluci:
Assignar a una classe B la responsabilitat de crear una instncia duna
classe A si se satisf una de les condicions segents:
. B s un agregat dobjectes dA
. B cont objectes dA
. B enregistra instncies dobjectes dA
. B usa molt objectes dA
. B t les dades necessries per inicialitzar un objecte dA (B t els valors dels
parmetres del constructor dA)
Beneficis:
Acoblament baix
95
Transacci Club 1
Persona
ltNumSoci: Integer=0
executar() preuHoraPista: Import dni: String
preuNos: Import nom: String
preuAnullaci: Import adrea: String
e-mail [0..1]: String
tipus {disjoint, complete}
AltaSoci
dni: String Soci Amb * Familiar
1
nom: String nmSoci: Integer
adrea: String
e-mail [0..1]: String deute(): Integer *
nm-cc: Integer Del
resultat: Boolean CompteCorrent
nmSoci: Integer 1
nm-cc: Integer
executar() saldo: Integer
resultat():Boolean
nmSoci?(): Integer Restriccions dintegritat:
Claus de classes no associatives (Persona, dni), (CompteCorrent, nm-cc)
No hi poden hav er dos socis amb el mateix nmSoci
96
dicPersones: Diccionari
executar
get(nmSoci) :Club
Comprova que no existeix
cap soci amb nmSoci get(dni)
Comprova que no existeix get(nm-cc)
cap persona amb dni
ltNumSoci()
Comprova que existeix un Incrementa latribut ltnumSoci i
compte corrent cc amb nm-cc retorna el nou valor
s:Soci
assigCompte(cc) Associem al soci el
compte corrent
put(nmSoci,s)
put(dni,s) Afegim el nou soci
als diccionaris
AltaSoci t totes les dades necessries per inicialitzar Soci, excepte nmSoci
Alta Soci acoblat amb els tres diccionaris, Club i Soci. Soci acoblat amb CompteCorrent
executar :Club
nouSoci get(dni)
Comprova que no
get(nmSoci)
existeix cap soci get(nm-cc)
amb nmSoci ni
cap Persona amb s:Soci
dni
assigCompte(cc) Associem al
soci el compte
Comprova que
existeix un corrent
compte corrent put(dni,s)
cc amb nm-cc
Boolean put(nmSoci,s)
Afegim el nou soci
Incrementa latribut als diccionaris
ltnumSoci
Club rep les dades necessries per inicialitzar Soci, excepte nmSoci.
Alta Soci acoblat amb Club. Club acoblat amb els tres diccionaris i Soci. Soci acoblat amb CompteCorrent
Disminueix la cohesi de Club (si no t altres responsabilitats relatives a Soci) i augmenta el seu acoblament.
97
Bibliografia
98
Descripci general.
Soluci: Estructura.
Aspectes a considerar.
Exemple 1.
Conseqncies.
Exemple 2.
Bibliografia.
Descripci general
Context:
En una jerarquia despecialitzaci, la semntica duna operaci s diferent a
les diverses subclasses per les que pot passar un objecte.
El comportament dun objecte depn del seu estat en temps dexecuci, que
s variable en el decurs del temps.
Problema:
La tecnologia actual no permet que un objecte canvi dinmicament de
subclasse.
Les estructures condicionals per tractar el comportament en funci de lestat
no sn desitjables ja que afegeixen complexitat i/o duplicaci de codi.
Soluci:
Crear una classe per cada estat que pugui tenir lobjecte context.
El canvi de subclasse se simula pel canvi de lassociaci amb la classe estat.
Basant-se en el polimorfisme, assignar mtodes a cada classe estat per
tractar la conducta de lobjecte context.
Quan lobjecte context rep un missatge que depn de lestat, el reenvia a
lobjecte estat.
99
Soluci: Estructura
Context 1 Estat
estat
requesta() tractament()
estat tractament()
EstatConcret1 EstatConcret2
tractament() tractament()
Estats no compartits:
Cada objecte context t el seu propi objecte estat, que inclou tota la
informaci rellevant daquell objecte en aquell estat.
Estats compartits:
Diversos objectes context poden usar els mateixos objectes estat, si els
objectes estat no tenen atributs/associacions.
Un objecte estat pot no tenir atributs/associacions:
Si no els necessita.
Si en t, per es defineixen en lobjecte context.
Dues variants:
Lobjecte context els passa a lestat quan els necessita.
Els objectes estat els obtenen del context quan els necessiten.
100
Exemple 1: Problema
Esquema conceptual de lespecificaci i diagrama destats dInterruptor:
Interruptor
referncia: String
data en la que
es va tancar {disjoint,complete} obrir
linterruptor estat
Tancat Obert
tancar
Tancat Obert
datatanc: Data tempsob:Integer temps que estar
obert l interruptor
R.I. Textuals:
Claus classes no associatives: (Interruptor, referncia)
consum():Integer {disjoint,complete}
Tancat Obert
datatanc: Data tempsob:Integer
consum():Integer consum():Integer
101
102
Aquesta operaci es
Estat utilitzada per les
operacions de canvi
1 tipus():String destat del Context
Aquesta operaci gestiona el
Interruptor 1
consum():Integer per saber quin s el
canvi destat dobert a tancat referncia: String seu estat
{disjoint,complete}
tancar(dt:Data): Bool
obrir(to:Integer):Bool
Aquesta operaci gestiona el consum():Integer Tancat Obert
canvi destat de tancat a obert datatanc: Data tempsob:Integer
consum():Integer consum():Integer
Estat
Interruptor
1 1 tancar(dt:Data,i:Interruptor):Bool
referncia: String obrir(to:Integer,i:Interruptor):Bool
tancar(dt:Data):Bool consum():Integer
Aquestes operacions deleguen
obrir(to:Integer):Bool
la responsabilitat del canvi {disjoint,complete}
consum():Integer
destat als objectes estat
mod_assoc(e:Estat)
103
Dues opcions:
A: Crear-los quan es necessiten i destruir-los quan ja no sn necessaris.
B: Crear-los dentrada i no destruir-los mai.
Opci A:
Preferible quan:
Lestat inicial no es coneix en temps dexecuci.
Els contextos rarament canvien destat.
Evita la creaci dobjectes estat que no susaran.
Opci B:
Preferible quan :
Lobjecte context canvia destat molt sovint.
Evita la destrucci dobjectes que poden ser necessaris ms endavant.
Els costos de creaci (instanciaci) es paguen un sol cop.
No hi ha costos de destrucci.
Estat
Interruptor
1 1 tancar(dt:Data,i:Interruptor):Bool
referncia: String obrir(to:Integer,i:Interruptor):Bool
tancar(dt:Data):Bool consum():Integer
obrir(to:Integer):Bool
{disjoint,complete}
consum():Integer
mod_assoc(e:Estat)
Tancat Obert
datatanc: Data tempsob:Integer
obrir(to:Integer,i:Interruptor):Bool tancar(dt:Data,i:Interruptor):Bool
tancar(dt:Data,i:Interruptor):Bool obrir(to:Integer,i:Interruptor):Bool
consum():Integer consum():Integer
Creaci del nou estat obert , No canvien lestat Creaci del nou estat tancat,
destrucci de lestat tancat i destrucci de lestat obert i
creaci de la nova associaci creaci de la nova associaci
entre Interruptor i el nou estat. entre Interruptor i el nou estat.
104
Estat
Interruptor
1 1 tancar(dt:Data,i:Interruptor):Bool
referncia: String obrir(to:Integer,i:Interruptor):Bool
tancar(dt:data):Bool consum():Integer
obrir(to:Integer):Bool
{disjoint,complete}
consum():Integer
mod_assoc(e:Estat)
Tancat Obert
datatanc: Data tempsob:Integer
obrir(to:Integer,i:Interruptor):Bool tancar(dt:Data,i:Interruptor):Bool
tancar(dt:Data,i:Interruptor):Bool obrir(to:Integer,i:Interruptor):Bool
consum():Integer consum():Integer
Diagrames de seqncia:
consum():Integer
obrir(to:Integer):Integer
105
Conseqncies
Exemple 2: Problema
Esquema conceptual de lespecificaci:
Reserva
dataReserva:Data
{disjoint,complete}
estat
Es vol dissenyar una operaci de la classe dobjectes Reserva que calcula el cost
duna reserva.
cost= 0 si la reserva est prevista o anul.lada per manteniment.
cost= preuHoraPista (de Club) si la reserva est usada.
cost= preuNos (de Club) si la reserva est no usada.
cost= preuAnul.laci (de Club) si la reserva est anul.lada pel client.
106
anClient
Anul.lada pel Client
usada Usada
NoUsada
veureSiNoUsada[ dataReserva<dataActual ]
Exemple 2: Soluci
Reserva EstatRes
1 1
dataReserva:Data cost():Integer
cost():Integer tipus():String
anMant(d:Data):Bool {disjoint,complete}
anClient(d:Data):Bool
usada():Bool
nousada():Bool
Res.Prevista ResAnMant ResAnClient ResNoUsada ResUsada
data:Data data:Data cost():Integer cost():Integer
cost():Integer
107
Exemple 2: Soluci
:ResUsada :Club
cost() preuHoraPista()
:Reserva :Estat
cost() cost()
:ResNoUsada :Club
retorna 0 cost() preuNos()
Exemple 2: Soluci
108
Bibliografia
109
Descripci general.
Soluci: Estructura.
Exemple 1.
Conseqncies.
Extensi Exemple 1.
Exemple 2.
Bibliografia.
Descripci general
Context:
La definici duna operaci en una jerarquia t un comportament com a
totes les subclasses i un comportament especfic per cadascuna delles.
Problema:
Repetir el comportament com a totes les subclasses implica duplicaci de
codi i un manteniment ms costos.
Soluci:
Definir lalgorisme (loperaci) en la superclasse, invocant operacions
abstractes (amb signatura definida en la superclasse i mtode a les
subclasses) que sn redefinides a les subclasses.
Loperaci de la superclasse defineix la part del comportament com i les
operacions abstractes la part del comportament especfic.
111
Soluci: Estructura
ConcreteClass
primitiveOperation1()
comportament especfic primitiveOperation2()
Exemple 1: Problema
Esquema conceptual de lespecificaci: Pers. Docent R.I. Textuals:
Claus classes no associatives:
Centre Docent 1 Ensenya * Professor nom: String (Centre Docent, nom);
edat: Integer (Pers.Docent, nom)
nom: String estudis: String
{disjoint,complete}
tipus
{disjoint,complete}
tipus
Nota: Suposem que els Centres Docents i el Personal Docent no poden canviar de subclasse
Es vol dissenyar una operaci de la classe dobjectes Centre Docent per calcular
el nombre dempleats que t un centre docent que tenen una edat < 25 anys.
num_empleats=num_professors+num_becaris amb edat < 25 anys si el
centre s una Universitat
num_empleats=num_professors+num_pers_en_formaci amb edat < 25
anys si el centre s una Escola dEnsenyana Secundria.
112
tipus {disjoint,complete}
1 Assignat
<25 next()
Integer
113
tipus {disjoint,complete}
1 Assignat
Conseqncies
Tcnica fonamental per a la reutilitzaci de codi.
Els mtodes plantilla porten a una estructura de control invertida:
Principi de Hollywood.
Els mtodes plantilla acostumen a cridar operacions dels segents
tipus:
Operacions concretes de la AbstractClass.
Operacions primitives (s a dir, operacions abstractes).
Operacions ganxo, que proporcionen conducta per defecte (normalment,
res), que les subclasses poden redefinir, si cal.
Operacions concretes (en ConcreteClass o en classes client).
s important que els mtodes plantilla especifiquin:
quines operacions sn ganxos (poden ser redefinides).
Quines operacions sn abstractes (han de ser redefinides):
conv que nhi hagin com menys millor.
114
R.I. Tetuals:
Escola Ens. Primria Claus classes no associatives:
(Centre Docent, nom); (Pers.Docent, nom)
edatmxima: Integer
tipus {disjoint,complete}
1 Assignat
115
:CentreDocent
op. concreta
num_professors()
num_empleats() :Centre Docent
num_pers_espec()
retorna 0
num_pers_espec() Integer
Integer
op. ganxo
mtode plantilla
El diagrames de seqncia de
num_pers_espec() per Escola
Ens. Secundria i Universitat
i num_professors() per Centre
Docent serien iguals als
de lexemple anterior
Exemple 2: Problema
Diagrama de classes normalitzat:
Persona
dni: String R.I. Tetuals:
nom: String - Claus classes no associatives: (Persona,dni)
- No poden existir dos socis amb el mateix numSoci.
adrea: String
e-mail[0..1]: String
{disjoint,complete}
Es vol dissenyar dos casos ds amb un nic esdeveniment per consultar les
dades dun soci:
El primer cas ds obt el nom i el deute dun soci a partir del nmSoci en cas
dexistir, i retorna fals en cas contrari.
El segon obt el nom i ladrea tamb a partir del nmSoci en cas dexistir, i
retorna fals en cas contrari.
116
Exemple 2: Soluci
Transacci Persona
executar() dni:String
nom: String
adrea: String
e-mail[0..1]: String
TransConsultaUnSoci nom(): String
adrea(): String
Cert si el soci amb
numSoci: Integer {disjoint,complete}
numSoci existeix. Fals
en cas contrari. nom: String
resultat:Boolean
executar() Soci
Operaci plantilla
Operaci primitiva
obtDades(s:Soci) numSoci: Integer ....
deute(): Import
TrCUS-1 TrCUS-2
deute: Import adrea: String ....
obtDades(s: Soci ) obtDades(s: Soci )
Exemple 2: Soluci
Diagrames de seqncia:
:TransConsultaUnSoci dicSocis:Diccionari
executar get(numSoci)
error, si el soci
s:Soci
no existeix nom()
obtDades(s)
117
Bibliografia
118
Especificaci:
Esquema Conceptual
Cassos ds
Diagrama dEstats
Normalitzaci:
Diagrama de classes normalitzat
Contractes operacions normalitzats
Diagrames de Seqncia
R.I. Textuals:
- Claus classes no associatives: (Persona, dni); (Data, data); (Ciutat, nom)
- Una Ciutat no pot tenir ms dun Hotel amb el mateix nom
- Un viatge confirmat es fa a un Hotel de la mateixa ciutat on es fa el viatge
- Una persona no pot tenir ms dun viatge confirmat amb una mateixa data dinici
Informaci derivada:
- nmv: s el nombre de viatges confirmats daquella Persona
- T-pressupostats: s igual al conjunt de viatges pressupostats duna Persona
Suposicions:
- Latribut derivat nmv sha de calcular i lassociaci derivada T-pressupostats sha de materialitzar.
- Les associacions Amb i T-pressupostats tenen navegabilitat doble
119
Especificaci: Cas ds
Quines-Persones
:Sistema
:Empleat/da
Qui?(nom-c, nom-h, ll-per): ok?
Operaci: qui? (nom-c: String, nom-h: String, out ll-per: Llista-noms) Llista-noms= { nom }
Classe retorn: Boolean
Precondicions: Els arguments han de tenir valor
Semntica: Retorna la llista de noms de persones que shan allotjat alguna vegada a
lhotel nom-h de la ciutat nom-c.
Postcondicions:
1. Si lhotel nom-h no s de la ciutat nom-c o b no hi cap persona que shi hagi
allotjat, llavors operaci invlida i es retorna Fals
2. En cas contrari, operaci vlida, es retorna Cert i la llista que cont els noms de
totes les persones que shan allotjat alguna vegada a lhotel.
Especificaci: Cas ds
Confirmar-Viatge-al-Mar
:Sistema
:Empleat/da
Confirmar-mar(dni, nom-c, data, nom-h): ok?
Operaci: confirmar-mar (dni: Integer, nom-c: String, data: Date, nom-h: String)
Classe retorn: Boolean
Precondicions: Els arguments han de tenir valor
Semntica: Confirmar un viatge a una ciutat de mar i assignar-li lhotel
Postcondicions:
1. En el segents casos, operaci invlida i retorna Fals:
1.1 Si la ciutat nom-c no s de mar
1.2 Si no existeix un viatge de la persona a la ciutat i per a la data especificats
1.3 Lhotel nom-h no s de la ciutat nom-c
2. En cas contrari, operaci vlida, es retorna Cert i:
2.1 El viatge passa a estar Confirmat
2.2 Es crea una nova ocurrncia de lassociaci Amb entre el viatge confirmat i lHotel
120
reservar
Pressupostat Reservat
confirmar
confirmar
Confirmat
R.I. Textuals:
- Claus classes no associatives: (Persona, dni); (Data, data); (Ciutat, nom)
- Una Ciutat de Mar no pot tenir ms dun Hotel amb el mateix nom
- Un viatge confirmat es fa a un Hotel de la mateixa ciutat on es fa el viatge
- Una persona no pot tenir ms dun viatge confirmat amb una mateixa data dinici
- Per una persona i una data no poden existir ms de tres viatges a ciutats diferents
- No poden existir dos viatges de la mateixa persona a la mateixa ciutat amb la
mateixa data dinici
Inf. derivada:
- nmv: s el nombre de viatges confirmats daquella Persona
- T-pressupostats: s igual al conjunt de viatges pressupostats duna Persona
Suposicions:
- Les associacions Amb i T-pressupostats tenen navegabilitat doble
121
Operaci: qui? (nom-c: String, nom-h: String, out ll-per: Llista-noms) (No es modifica)
Classe retorn: Boole
Precondicions: Els arguments han de tenir valor
Semntica: Retorna llista de noms de persones que shan allotjat alguna vegada a lhotel nom-h
de la ciutat nom-c.
Postcondicions:
1. Si lhotel nom-h no s de la ciutat nom-c o b no hi cap persona que shi hagi allotjat, llavors
operaci invlida i es retorna Fals
2. En cas contrari, operaci vlida, es retorna Cert I la llista que cont els noms de totes les
persones que shan allotjat alguna vegada a lhotel.
Operaci: confirmar-mar (dni: Integer, nom-c: String, data: Date, nom-h: String)
Classe retorn: Boolean
Precondicions: Els arguments han de tenir valor
Semntica: Confirmar un viatge a una ciutat de mar i assignar-li lhotel
Postcondicions:
1. En el segents casos, operaci invlida i retorna Fals:
1.1 La ciutat nom-c no s de mar
1.2 No existeix un viatge de la persona a la ciutat per a la data especificats
1.3 Lhotel nom-h no s de la ciutat nom-c
1.4 Ja existeix un viatge confirmat de la persona i data especificats
2. En cas contrari, operaci vlida, es retorna Cert i:
2.1 El viatge passa a estar Confirmat
2.2 Es crea una nova ocurrncia de lassociaci Amb entre el viatge confirmat i lHotel
2.3 Si el viatge era Pressupostat, selimina la instncia de lassociaci T-pressupostat entre
Pressupostat i Persona
122
T-pressupostats 1 1
De
1 estat *
Estat Hotel
0..1
{disjoint, complete} nom: String
Amb
*
Pressupostat Reservat Confirmat
*
preu: Import avan: Import
Suposicions:
- Les associacions Amb i T-pressupostats tenen navegabilitat doble
Transacci
executar()
Allotjats Confirmar-Mar
nom-c: String dni: Integer
nom-h: String nom-c: String
ll-per: Llista-noms data: Date
resultat: Boolean nom-h: String
resultat: Boolean
executar()
resultat(): Boolean executar()
noms(): Llista-noms resultat(): Boolean
qui? (nom-c: String, nom-h: String, confirmar-mar (dni: Inmteger, nom-c: String, data: Date,
out ll-per: Llista-noms): Boolean nom-h: String): Boolean
123
Experts
Diagrama Seqncia
qui? (nom-c, nom-h, out ll-per)
:Confirmat
:Allotjats confirmat-a(h)
dicHotel:Diccionari amb() No s
necessari
executar() explicitar-la
get(nom-c+nom-h) Boolean
= h?
existeix
hotel? h:Hotel :Estat
:Mar
qui() confirmat-a(h)
viatges-a(h) viatges()
fals
:Iterador
first()
is_done() :Viatge
current_item() :Estat
confirmat-a(h) confirmat-a(h)
* :Persona
nom?()
String
next()
Comprovar si
llista buida Llista-noms
Llista-noms
124
executar()
get(nom-c+nom-h)
h:Hotel
existeix hotel?
qui()
confirmats()
:Iterador
first()
is_done() :Confirmat
current_item()
:Viatge
viatger()
:Persona
* viatger()
nom?()
String
String
next()
Comprovar si obtenir el viatge obtenir la persona
llista buida Llista-noms
125
confirmar(v, h)
:Estat
nouconfirmat(v, h)
nouconfirmat(v, h)
e:Confirmat
:Persona
h:Hotel
associarAmb(h)
eliminaTePres(e) creassocAmb(e)
cert
v:Viatge
modifassocEstat(e)
:Reservat
confirmar(v, h)
nouconfirmat(v, h)
cert
:Confirmat :Estat
:Confirmat confirmat?() confirmat?()
confirmar(v, h) cert fals
fals
126
:Confirmar-mar
dicViatge:Diccionari Comprova no existeix cap objecte
executar() estat Confirmat
dicHotel:Diccionari
get(dni+nom-c+data)
existeix viatge?
get(nom-c+nom-h)
si existeix hotel (h),
llavors est a la dicConfirmats:Diccionari
ciutat i, aquesta s v:Viatge
de mar
confirmar(h, dni, data)
get(dni+data)
:Estat
confirmar(v, h)
Boolean Mateixa operaci
que abans
La restricci Una persona no pot tenir ms dun viatge confirmat amb la mateixa
data dinici permet identificar els viatges confirmats amb (dni+data).
:Persona
cert
eliminaTePres(e)
cert
:Estat
nouconfirmat(v, h)
e:Confirmat
h:Hotel
associarAmb(h)
creassocAmb(e)
v:Viatge
modifassocEstat(e)
127
Ciutat
Data
Persona nom: String
dni: Integer data: Date 1
La navegabilitat de les
nom: String
associacions Viatge-Data, Viatge-
mmv(): Integer 1
1 inici {incomplete} Ciutat i De, no queden definides
eliminaTPres(e:Pressupostat) pels diagrames de seqncia.
Viatge-Ciutat
nom?(): String Viatge-Data Mar
Viatge-Pers
1
* * * 1
Viatge De
* Transacci
confirmar(h:Hotel, dni:Integer, data:Date):Boolean Hotel
modifassocEstat(e:Estat) executar()
nom: String
viatger(): String
qui(): Llista-noms
1 crearassocAmb(e:Confirmat)
confirmats(): Iterador
T-pressupostats 1 estat
0..1
Allotjats Confirmar-Mar
Estat nom-c: String dni: Integer
nom-h: String nom-c: String
confirmar(v:Viatge, h:Hotel):Boolean ll-per: Llista-noms data: Date
nouconfirmat(v:Viatge, h:Hotel) resultat: Boolean nom-h: String
viatger(): String Amb resultat: Boolean
executar()
resultat(): Boolean executar()
{disjoint, complete} noms(): Llista-noms resultat(): Boolean
* *
Pressupostat Reservat Confirmat
preu: Import avan: Import confirmar(v:Viatge, h:Hotel):Boolean
confirmar(v:Viatge, h:Hotel):Boolean confirmar(v:Viatge, h:Hotel):Boolean associarAm b(h:Hotel)
128
Capa Presentaci
Introducci
Patr Model-Vista-Controlador
Introducci
129
......
esdeveniments
presentaci
S'assabenta peticions Tractament de:
Presentaci Ordena execuci accions Finestres, Mens
Comunica resultats accions Botons, Llistats
esdeveniments externs
consultes
resultats
Domini respostes
130
Disseny Extern
Exemples:
Mecanismes interacci: escriure comandes, tecles funci, apuntar
objectes/mens amb ratol o pantalla tctil, comandes orals ...
Presentaci de informaci: formats grfics, imatges, textual, vdeo;
presentaci a pantalla o en llistat imprs; ...
131
Memria a curt termini usuari mnima (no cal recordar llistes de codis o
comandes complexes, ...)
132
Disseny Intern
Disseny Intern
Estructura lgica de la
Capa Presentaci (GUI):
esdeveniments de presentaci
esdeveniments de sistema
Capa Domini
133
Disseny Intern
Presentaci Informaci
Recepci de les dades a presentar a lusuari (pantalla, impressora).
Presentaci de les dades en els formats especfics de lusuari.
Disseny Intern
Presentaci Informaci
Patr Model-Vista-Controlador
134
Punt de Partida
Acci Resposta
1. Introduir nom, adrea i e-mail del soci 2. Se li assigna nmero de soci
3. Es dna dalta com a nou soci
4. Introduir numero de compte on carregar
pagament de rebuts.
5. Es guarda el compte on carregar rebuts
6. Introducci nom, adrea i e-mail dels familiars
7. Es donen dalta els seus familiars
e-mail C Ok
endavant plega
Assignaci Compte
endavant plega
135
Bibliografia
Collins, D.
Designing Object-Oriented User Interfaces.
Benjamin/Cummings Publishing Company, 1995.
(Cap. 1, 5, 6, 11)
Shneiderman, B.
Designing the User Interface.
Strategies for Effective Human-Computer Interaction (3 edici).
Addison-Wesley, 1998. (Cap. 2)
Larman, C.
Applying UML and Patterns.
An Introduction to Object-Oriented Analysis and Design.
Prentice Hall, 1998. (Cap. 16)
136
Patr Model-Vista-Controlador
Descripci General
Soluci: Estructura
Comportament
Conseqncies
Implementaci
Exemple
Bibliografia
Context:
Sistemes software interactius amb interfcies dusuari flexibles.
Problema:
La informaci proporcionada pel sistema software i el seu comportament han de
reflectir immediatament les manipulacions de la informaci.
137
Soluci:
Descomposar el sistema en tres components:
Model (procs): inclou la implementaci de les funcionalitats i les dades
del sistema.
Vista (sortida): mostra la informaci a lusuari final
Controlador (entrada): responsable de gestionar la interacci amb lusuari
Amb * Observador
1 actualitzar
Model
dades
Vista
Controlador
afegir(observador)
treure(observador)
inicialitzar (model)
notificar()
ferControlador() inicialitzar(model, vista)
obtenirDades() 1 T 1
activar() tractarEsdev (esdev .)
servei()
actualitzar() actualitzar()
mostrar()
138
afegir(observador)
treure(observador) Permet a la Vista i al Controlador obtenir dades modificades
notificar() del Model (1 operaci per cada tipus dinformaci a presentar)
obtenirDades()
servei() Implementa les funcionalitats del sistema que pot invocar
el Controlador (1 operaci per cada funcionalitat)
Controlador:
Lusuari interactua amb el sistema nicament mitjanant controladors
Gestiona els esdeveniments de presentaci i de modificaci del model
generats per lusuari.
La forma com rep aquests esdeveniments depn de la plataforma utilitzada
per interactuar amb lusuari (Manipulador desdeveniments).
Tradueix els esdeveniments de presentaci en:
invocacions a serveis proporcionats pel Model.
peticions de funcionalitats prpies de la Vista.
El comportament del Controlador pot dependre de lestat del Model.
Controlador
associa el controlador a la Vista i al Model
rep un esdeveniment
inicialitzar (model, vista) el valor del parmetre determina la funcionalitat a tractar
tractarEsdev (esdev .)
actualitzar() actualitza el comportament del controlador
139
inicialitzar(m,v)
afegir(c)
...
A partir daqu ja es poden comenar a
tractar els esdeveniments
140
<- Capa Presentaci <- Capa Domini -> Capa Presentaci ->
:Controlador :Model
:Vista
actualitzar
:Model
obtenirDades
actualitzar mostrar
obtenirDades
141
Conseqncies
Beneficis:
Es poden tenir diverses Vistes associades a un mateix Model.
En temps dexecuci puc tenir diverses vistes obertes.
Les Vistes i Controladors estan sincronitzats davant canvis en el Model.
Fcil reutilitzaci de Vistes i Controladors.
Alta portabilitat de la Capa Presentaci.
Acoblament baix entre Capa Domini i Capa Presentaci.
Inconvenients:
Afegeix complexitat a sistemes amb interfcies simples.
Alt acoblament entre Vista i Controlador.
No hi ha encapsulament de dades depenents de la plataforma grfica, per
facilitar portabilitat.
Variants al Patr:
Patr Presentaci-Abstracci-Control.
Patr Document-Vista.
Aspectes a considerar
142
Correspon
1 *
*
Club 1
Del CompteCorrent
1 tot-deute: Import
nmcc: Date
saldo: Import
- Es vol visualitzar contnuament per pantalla el deute total del club de tennis
- El deute total del club de tennis es modifica mitjanant ferRebuts i pagRebut
- El comportament del controlador no depn de lestat del model
Club 1 ContTotalDeute
VistaTotalDeute
tot-deute: Import
tot-deute?(): Import mostrar()
pagRebut (nmSoci,mes) set-text(imp) operaci de presentaci dinformaci
ferRebuts (data)
143
c:Club
v:VistaTotalDeute
inicialitzar(c)
afegir(v)
ferControlador
ctr:ContTotalDeute
inicialitzar(c,v)
afegir(ctr)
...
A partir daqu ja es poden comenar a
tractar els esdeveniments
ctr:ContTotalDeute c:Club
dicReb:diccionari
tractarEsdev
pagRebut
(pagRebut(nmSoci,mes)) get
(nmSoci,mes)
:Rebut
boole boole
dec-deute
144
:Iterador
first
isDone :Observador
* currentItem
actualitzar
next
actualitzar
op. ganxo: no fa res perqu el comportament
del controlador no depn de lestat del model
:VistaTotalDeute
set-text
145
Correspon
1 *
Del
...
1
CompteCorrent Club 1
Bibliografia
146
Persistncia en BDOO
147
Objectiu de lestndard:
Portabilitat
Estructures de dades
de laplicaci
Cpia i traducci
Transparncia
de dades
Representaci
relacional
SGBDR
148
Preprocessador Compilador PL
declaracions
Aplicaci
metadades SGBDOO binari
Runtime
Linkador
accs dades
Base de Aplicaci
executable
dades
149
150
151
152
Model dObjectes: BD
153
154
155
Java binding
156
157
Server
Cache Manager
network
Client Application
Java binding
Exemple dutilitzaci del Java binding amb ObjectStore/1
Definici de lesquema
Persona abstract class Persona {
String nom;
dni:String
String adreca;
nom: String
String email;
adrea: String
e-mail[0..1]: String // Constructor:
public Persona(String nom, String adreca, String email) {
this.nom = nom; this.adreca = adreca; this.email = email;
1 Familiar }
Soci *
public String obtenir_nom() { return nom; }
numSoci: Integer public String obtenir_adreca() { return adreca; }
public String obtenir_email() { return email; }
deute():Import public void posar_nom(String nom) { this.nom = nom; }
afegirFamiliar(..) public void posar_adreca(String adreca) { this.adreca = adreca; }
hihaFamiliar(nom: public void posar_email(String email) { this.email = email; }
String):Boolean }
class Familiar extends Persona {
Soci s;
public Familiar(String nom, String adreca, String email,Soci s) {
super(nom,adreca,email);
this.s=s;
s.posar_familiar(this);
}
}
158
Java binding
Exemple dutilitzaci del Java binding amb ObjectStore/2
import COM.odi.*;
import COM.odi.coll.*;
class Soci extends Persona {
int numSoci;
Set familiars;
// Constructor:
public Soci(String nom, String adreca, String email,int numSoci,Placement placement) {
super(nom,adreca,email);
this.numSoci=numSoci;
familiars=NewCollection.createSet(placement) ;
}
public int obtenir_numSoci() { return numSoci; }
Java binding
Exemple dutilitzaci del Java binding amb ObjectStore/3
Definici dels programes
import COM.odi.*;
public
class Exemple {
public static void main(String argv[]) {
String dbName = argv[0];
// Aquesta linia inicialitza ObjectStore
ObjectStore.initialize(null, null); operaci de la classe Database
Database db = createDatabase(dbName);
readDatabase(db);
}
159
Java binding
Exemple dutilitzaci del Java binding amb ObjectStore/4
Bibliografia
160