Professional Documents
Culture Documents
Versin2.4
Abril2015
1Interaccinentredoscomponentes
1.1Digresin:porqucomponente?
2Interfacesentrantesysalientes
2.1Interfazentrante
2.2Interfazsaliente
3Ambientes
3.1Todoenunsololugar
3.2Distintosambientes
4Interfacessincrnicasyasincrnicas
4.1Interfacessincrnicas
4.2Interfacessincrnicas
4.2.1Buffers
5AlgunaspalabrassobrelasFachadas(Faades)
5.1AdvertenciassobreelFaade
5.2MalosusosdelFaade
6Ejercicioprctico:compracontarjetadecrdito
6.1Interfazsaliente
6.1.1Cmoquedalacompraenelcdigo
6.1.2ManejodeErroresenlainterfaz
6.2Interfazentrante
6.2.1Cmodefinirlainterfazentrante
1de18
Diseodeinterfacesentrecomponentes
Volvemosunavezmsadecirqueunsistemaesunconjuntodecomponentesquese
relacionanparalograrunobjetivocomn.Ahorabien,cmoserelacionanesos
componentes?
SupongamosqueA"necesitaalgo"deB.Loquenosvaainteresaresverqualternativas
tengoparamodelaresalneapunteada.
Algunascosasatenerencuenta:
Direccinysentidodelacomunicacin:
silacomunicacinvadeAhaciaB(controldirecto)oalrevs(inversinde
control)
silacomunicacinentreAyBesbidireccionalounidireccional
SiAyBestnambosenelmismoambiente
Manejodeerrores
qupasasihayunerrordeconexinconB1
qupasasihayerrorcuandoBprocesaelpedidodeA
Gradodedependencia:
siAesperaractivamenteaqueBterminedeprocesar(esdecir,sila
comunicacinessincrnica)2opuedecontinuartrabajandosinbloquearse
(comunicacinasincrnica)
siAnecesitaalgnresultadodeBosisimplementedebenotificarloy
olvidarse(fireandforget)
determinarsiinteresaqueBproceseelpedidodeAenformaexitosaparaqueA
hagaotrascosasenlamismatransaccin
determinarsisenecesitareprocesar(enformamanualoautomtica)determinados
mensajesdeAaB
determinarsisenecesitaobtenerunlog(llevarunregistro)delospedidosenviadosa
B
etc
Lasdecisionesquetomemosimpactarnen
elgradoyformadeacoplamientoentrelos
componentesdenuestrosistem
a.Poreso,acontinuacintrataremosvariasdeestas
cuestiones.
1
2
Leertambinapuntedemanejodeerrores
Leertambin
apuntedecomunicacinentrecomponentes
2de18
Diseodeinterfacesentrecomponentes
Lospatronesqueveremosacontinuacinsonaplicablesacualquieradeestosniveles,ms
alldequeloscomponentesqueelijamosennuestrosejemplosseanpequeospor
cuestionesdidcticas.
Nosencontramosdiseandouncomponente.Primero,respondamosunapreguntafcil
respectoalproblemadelacomuncacin:estamosdiseandolaformadequeotros
componentes"hablen"conelnuestro,olaformadeconectarnosaotrocomponente?Es
decir,estamosdiseandounainterfazentranteosaliente?
Analicemosamboscasos.
Cuidado:esimportantenotarquelatecnologaenlaqueestnimplementadoslos
componentesquesecomunicarnconelnuestropodrasermuydiferenteaaquellacon
laquetrabajamos.
Cuandoestamosenestasituacin,tenemosquepensarcualeslainformacinquenuestro
componente(B,enelejemplo)necesitapararesolversutarea,ycmonosconviene
3de18
Diseodeinterfacesentrecomponentes
recibirla.Tendremosqueconsiderarquelasdecisionesquetomemosimpactarnencuan
fcilesparaotrosmiembrosdeunequipodedesarrollousarestecomponente.
Ahoranosencontramosenlasituacincontraria:estamosdesarrollandouncomponenteque
necesitadelegarenotrociertastareas.Ahoratenemosquepreocuparnosporproveerla
informacinqueste(enelejemplo,B)necesita,adaptndonosalaformaquenospropone
decomunicacin.
3 Ambientes
Debemosentenderqueeldiseodelacomunicacinentrecomponentesesbastante
diferentecuandoloscomponentesestnenelmismoodiferenteambiente.
AyBpuedensermdulosqueconvivenenelmismoambiente.
Aqunotenemosmayoresrestriccionesencuantoalacomunicacin.Siestamostrabajando
conobjetosestoestansencillocomoenviarunmensajeaunobjetoyya.
AyBsepiensancomocomponentesquetienenunaseparacinlgicaentres:
PorqueAoBpuedenestardesarrolladosporotros(objetosdelaJDK,de
frameworksdeterceraspartes,degruposdetrabajoquenoformanpartedela
mismagerenciaalaquepertenecemos,etc.)
AuncuandoAyBsoncomponentesquenosotrosmismosdesarrollamos,tratamos
dereducirsuacoplamiento.Ojo,loscomponentestienenrelacinentresyestmuy
bienquelatengannoquieroeliminarlainteraccin,sevitarqueAconozca
4de18
Diseodeinterfacesentrecomponentes
demasiadodeBoviceversa.Entoncespuedopensarunainterfazquemepermita
cambiarimplementacionesposiblesparaB:
porquenotengoimplementadoBperonecesitoirtesteandoA,entoncesarmo
unaimplementacinmnimadeBquerespondaalmensajedeAparaluego
reemplazarlaporlaimplementacinrealdeB
porqueBnotieneelalcancecerradoyquierodejarlapuertaabiertaparalos
cambiosquesequevanavenir
oporcualquierotraraznquelojustifique
Enelsegundocaso,AyBestnimplementadosendistintoslugares(componenteremoto),
distintastecnologasoinclusodesarrolladosbajodiferentesparadigmas.
Sibienesimposibleindependizarsecompletamentedecuestionescomolatecnologaola
ubicacindeestoscomponentes3 (estnlamismacomputadora?Odebemosaccederlos
atravsdelareddeInternet?),intentaremosqueestonosafectelomenosposible.
Porqu?Porquenosinteresaminimizarelacoplamientoentreloscomponentes.As,sipor
ejemploestamosdesarrollandocomponentesbajoelparadigmadeobjetos,nosinteresar
disearlasinterfacesbajoesteparadigma.
Siparapoderhacerqueloscomponentessecomuniquenconalgomuydiferente,ser
necesariaunatransformacin,peronoserpartedemicomponente,sinoqueserun
elementoindependientequesdependerdelatecnologa,peroquedeberaestar
desacopladodelainterfaz.
Entonceselobjetivoesseparar
lalgicadecomunicacinanivelnegocio:ququierodecir,quinformacindebo
pasar,quesperorecibir,querroresdenegociopodranocurrir
delalgicadetransformacinquefueranecesaria.
T es el componente que hace algn tipo de transformacin. Puede estar en alguno de los
dos ambientes, o en otro ambiente aparte. No es objetivo de la materia desarrollar el
componenteT.
Losrequerimientosnofuncionales,aligualqueeldiablo,estnenlosdetalles
5de18
Diseodeinterfacesentrecomponentes
Otrapreguntaaresponderes:cuandoelcomponenteAsecomunicaconB,enqugrado
necesitaAlosresultadosdeB?Tenemosdosopciones:comunicacionessincrnicasy
asincrnicas.
Sedacuandouncomponenteleenvaunmensajeaotro,stesequedaesperandoaqueel
otrotermine.Estaeslaformaenquetrabajaelenvodemensajesenobjetos,laejecucin
deprocedimientosenimperativo,olaaplicacindefuncionesenfuncional.
Estambinlaformamssimpledetrabajar,porqueesfcilrazonarsobreella:siun
componenteAleenvaunmensajeaotroB,yluegoAleenvootromensajeaC,sabemos
conseguridadquelarespuestadeCllegardespusdelarespuestadeB.
Unejemplo:nosinteresaconocerlacotizacindeldlardelafechadehoy.Sinos
paramosdesdeelcomponenteAypensamosenhablarconuncomponenteBque
obtienelacotizacin,unaopcinsincrnicaeslasiguiente:
BigDecimal precioFinal =
calculadoraPrecios.obtenerPrecioFinal(dolarHoy)
LacontradeestaformadecomunicarnosesquesilacomunicacinentreAyBeslentao
pococonfiable 4,detendrlaejecucindelcomponenteAporquizsdemasiadotiempo.
CuandoAestencondicionesdecontinuarsutrabajomientrasBcalculaelresultado,o
incluso,cuandoaAnoleimportaelresultadodeB,podemosimplementarinterfaces
asincrnicas.
Enestecaso,AleenviarunmensajeaBparasolicitareliniciodelatarea,conlos
parmetrosquenecesite,yluegocontinuarsuflujodeejecucin.YentantoB,cuando
tengaelresultadolatarealisto,dealgunaformacomunicaraAdeestesuceso.Algunas
formasdehacerloson5:
depositarelresultadodelaoperacinenalgnlugardememoriacompartida,elcual
Aperidicamenterevisa
guardarunareferenciaaA,yenviarunmensajeastecuandohayaterminado
4
5
Locualrequerirmuchasvecesreintentarlaoperacin
Verelapuntedepatronesdecomunicacinentrecomponentes
6de18
Diseodeinterfacesentrecomponentes
guardaruncallback
Ejemplo:podemosconstruirunainterfazasincrnicaparanuestrocotizadordela
siguienteforma:
1. EnunprimeromomentoelcomponenteAdisparaelmensaje
cotizador.obtenerCotizacion()
2. ...pasaeltiempo,yelcotizador(componenteB)ponelarespuestaenelcotizador
cotizador.setUltimaCotizacion(cotizacion)
3. Mstarde,elcomponenteAirabuscarlarespuestaacotizador.ultimaCotizacion
Otambinpodramosusarcallbacks(bloquesdecdigo):
Comocasoextremos,podradarsequeaAnoleimportaraqueBrealmenteleresponda
algo,sinotansoloqueseveanotificado.Enestecaso,Aslosedebeenviarleunmensaje
aBconlainformacinquenecesite,sinpreocuparseporcapturarunresultado.
Unainterfazsincrnicaquenoexponeunresultado,esmsfcilmenteconvertibleauna
interfazasincrnicaqueunaquesexponeunresultado.
4.2.1 Buffers
Muchasveces,parapoderlidiarconelasincronismoyelhechodequeAnoprocesar
instantneamenteelresultadodeB,oqueBnoiniciarinstantneamentelatareasolicitada
porA,esquenecesitaremosunbufferquealmacenetemporalmenteelresultadoy/o
parmetrosdelatarea.
SibienestebufferpuedeserunapartedelcomponenteBynomereceunestudioaparte,
otrasvecesestebufferesexterno,ytantoAcomoBdebernempezarahablarconbuffer,
enlugardeentreellos.
7de18
Diseodeinterfacesentrecomponentes
1. A
envaelmensajealbuffer(enlugardeenvirseloa
B
)
2. Unprocesotomalainformacindelbuffer,
a. envaunmensajea
B
b. ylarespuestadeesemensajeseenvaaA.
DesdelaperspectivadeA,necesitamosunainterfazentrantepararecibirelresultado,conlo
cualloqueanteserauncasodeusoahorasondos:
elpedidodeunaaccinaB
el procesamiento de la respuesta de B ante ese pedido, donde se acepta orechaza
latransaccin.
DesdelaperspectivadeBtenemosvariasopciones:
si el buffer tiene cierta inteligencia, entonces B no se ve afectado por el mecanismo
sincrnico / asincrnico de la interfaz: sigue siendo una interfaz entrante y no hay
muchoscambiosenlaimplementacin.
si por el contrario B toma la responsabilidad de avisar el resultado a A, la interfaz
entrante disparar a su vez una interfaz saliente con resultado ok o error una vez
procesadoelpedido.Estoseveenlafigurasiguiente:
8de18
Diseodeinterfacesentrecomponentes
Poresosesueleutilizar
enalgunoscasos
paramodelarinterfacesentrantes.
Ejemplo
: tenemos un sistema de pedidos. Cada pedido tiene lneas o tems (
x cantidad de
producto
y
), un criterio que define la urgencia y cuidado de los productos que conformanel
pedidoyunestadoquedefinequhacerantedeterminadasacciones.
Paragenerarunpedido,
a. quieroagregar5kilosdequesoparmesano,2kilosdedulcedebatata
9de18
Diseodeinterfacesentrecomponentes
b. tambinquieroasignarleelestado(porejemplo,defaultenpendiente)
c. ysetearleeltipodepedido.
SipensamosmtodosenPedidoparafacilitarestastareas:
a. paraagregaruntem
public
voidaddItem(
intcantidad, Producto producto) {
this
.items.add(
newItem(cantidad, producto);
}
b. paraasignarestadodefault:
publicPedido() {
...
this
.estado =
newPendiente();
}
c. paraseteareltipodepedido
public
voidsetTipoPedidoMaximaSeguridad() {
this
.tipoPedido =
newMaximaSeguridad();
}
Entonces el Pedido est actuando como un Faade: el que genera un pedido nuevo no
necesitaconocerlostems,nilassubclasesdeestadonilassubclasesdeltipodepedido.
10de18
Diseodeinterfacesentrecomponentes
Ejemplo
:enlainactivacinapareceunobjetoInactivacionFaade
QuhaceelmtodoinactivardeInactivacionFaade?
public
voidinactivar(Cliente cliente) {
cliente.inactivar();
}
Noagreganingnvalor,solamenteforwardeaelpedidoalcliente.
Adems, si elobjetivodelFaadeesverunconjuntodeobjetoscomosifueranunosoloeso
noseestcumpliendo:estamosrecibiendounobjetoclientecomoparmetro
public
voidinactivar(
Cliente cliente
){
cliente.inactivar();
}
Corolario
: solamente usar Faade cuando usamos un objeto que simplifica la interaccin
con un mdulo de un sistema quepuedeserbastantecomplejo (comoenelcasodePedido
quepermitecentralizarlasaccionessobrelosdemsobjetosquemanejansuestado).
Corolario 2:
En el comn de los casos la interfaz entrante se modela con unmensajeaun
objetodenegocioyconesonosalcanza.
>>InactivarFaade
11de18
Diseodeinterfacesentrecomponentes
public
voidinactivar(Cliente cliente) {
cliente.setEstado(
"I"
);
}
Ahoraveremoscmomodelarunainterfazatravsdeunejemploconcreto
Tenemosunsistemadeventasdeuncomerciocualquieraquetienecuentacorrientecon
susclientes.Necesitamosquecadaventaqueserealicecontarjetadecrditonotifiqueal
sistemaCreditSysteminformando:
Nmerodetarjetadecrdito
Montodelaventa
Descripcindelaoperacin
Comercioorigen
Fechayhora
Tenemosunbosquejodeldiagramadeclases:
12de18
Diseodeinterfacesentrecomponentes
No nos importa cmo se termina de resolver el mtodo comprar, slo nos interesa agregar
una responsabilidad ms: disparar la interfaz saliente contra el sistema de Tarjeta de
Crdito.
Yenrealidadnodicenadaporquenoesrelevanteparaestamateria.
Podemospensarmuchassolucionestcnicas:
RPC(RemoteProcedureCall)
Socketpuro
WebService
Sabemosqueunaabstraccinpuedeimplementarseenobjetosdemuchasmaneras:
Conunobjeto
Conunaclase
Conunainterfaz(ladeJava)
Conunmtodo
Conunmensaje
etc.
Este objeto S ser de una clase que implemente la interfaz que estamos definiendo ahora.
13de18
Diseodeinterfacesentrecomponentes
Lo importante es que yo no necesite cambiar la firma del mtodo cuando tenga que
implementarlacomunicacinposta.
Algunasopcionesposiblesparadefinirlainterfaz:
a. notificarCompra(Integer numeroTarjeta, BigDecimal monto, String operacion,
String CUITComercioOrigen, Date fechaCompra)
c. notificarCompra(Compra compra)
Endefinitiva,loimportantees:
reconocerquenecesitamosponerlaresponsabilidadenunainterfazy
saberquinformacinvaanecesitarelquetermineimplementandoesainterfaz
El
contrato (la definicin del mensaje con los parmetros)
es lo que se pide en la
materia.
14de18
Diseodeinterfacesentrecomponentes
Yeldiagramadeclasesqueda:
TODO:Cambiarlafirmadelmtodo
sinnecesidaddedeterminarlaimplementacindedichainterfaz.
Una opcin posible es acceder al sistema Credit System desde un nico punto de acceso
global(
Singleton
).
>>Cliente
public
voidcomprar(Producto producto) {
...
if(
this
.tieneTarjetaDeCredito()) {
TarjetaCreditoPosta.getInstance().notificarCompra(
this
,
"Compra xx"
, Comercio.CUIT_Origen,
newDate());
}
...
}
producto,
15de18
Diseodeinterfacesentrecomponentes
>>Cliente
public
void
comprar(Productoproducto){
...
for
(ICompraObservercompraObserver:
this
.comprasObservers){
compraObserver.notificarCompra(
this
,producto,
"Compraxx"
,
Comercio.CUIT_Origen,
new
Date())
}
...
}
Ambas opciones son vlidas, aunque es importante recalcar que si nuestra intencin es
nicamente disparar una interfaz saliente y no nos interesa poder activar o desactivar esa
interfaz, el Observer es un caso de sobrediseo: nuestra solucin provee una complejidad
mucho mayor al problema que quiere resolver. Por otra parte s es correcto que pensemos
en el Observer cuando en el evento que activa la notificacin a esa interfaz saliente hay
otrosinteresadosoexisteesaposibilidad.
Si seguimos pensando dentro del paradigma de objetos, los errores los manejamos con
excepcionesynoconcdigosderetorno.
Querrorespodemosrecibir?
Errores en la conexin con el hostremoto,errorenla comunicacin(ruidoocortede
conexin),erroresdepermisoenelacceso,erroresenelformatodelmensaje,etc.
Erroresdeprogramaalejecutarelprocesamientodelmensaje
Errores denegocio:Elclientenoexiste,Elmontono puedesuperarlos$1.000 por
operacin,etc.
Los dos primeros son errores de sistema/programa. En el ltimo caso tenemos errores de
16de18
Diseodeinterfacesentrecomponentes
negocio. Dependiendo de cada caso quizs tengamos que contemplar acciones posibles o
simplementemostrarelmensajedeerrorenlapantalla(interfazdeusuario).
newSystemException(
"... <formato del mensaje con error> ..."
)
;
}
if(codigoError == 30015) {
throw
new BusinessException(
"El monto no puede superar los $ 1.000 por
operacin"
)
;
}
...
}
Losclientesinactivosnopuedenhacercompras.
Estamosmodelandoahoraunainterfazentrantecombinandodosescenariosposibles:
17de18
Diseodeinterfacesentrecomponentes
Para el caso a): un mdulo que reside en el mismo ambiente del negocio (o no,
dependiendodequtecnologaelijamosparadesarrollarlainterfazdeusuario)
Parab):uncomponenteexterno
Alosfinesprcticosdeesteapuntenoimportamucho
cmosecodificaelmtodoinactivar()
quvalidacinhayqueagregaralmtodocomprar()
sabemosquehabrunimpactoenesosmtodosynosalcanzaconeso.
Nro.cliente
Fecha
Activar/Inactivar
102875
10/11/2009
18de18