ABAP Objects: Tutorial Tutorial para implementar el patrón de diseño “decorator” inShare
En este tutorial de ABAP Objects conoceremos conceptualmente los patrones de diseño y aprenderemos cómo implementar, paso a paso, el patrón de diseño "decorator", y probaremos su uso mediante un prorama ejemplo en ABAP! ABAP! Los patrones de diseño son modelos ("frameworks") de diseño estandarizados, utilizados en la programación orientada a objetos, ue buscan ofrecer una solución le#ible, prototipada y reusable a ciertos problemas de diseño ue ocurren en forma recurrente en un determinado conte!to #uando se utilizan de manera correcta, los patrones de diseño a$udan a lograr un software reutilizable $ mantenible, aumentando la e!tensibilidad $ la portabilidad del sistema Los patrones de diseño tienen ue %er fundamentalmente con el diseño $ la interacción de los objetos, $ son utilizados a tra%&s de todo el espectro de entornos '' l presente artculo analizar* la implementación en el mundo de ABAP OO, paso a paso, de un patrón de diseño conocido como " $ecorator", a tra%&s de un ejemplo +na %ez e!plicada en forma conceptual la solución $ su implementación en -. se lo testear* en un programa de prueba La utilización de patrones de diseño e!ige conocer las caracter%sticas particulares del entorno OO &ue se est' utili(ando / en otras palabras, es necesario conocer a u& paradigma dentro del mundo de objetos pertenece -. '', $ alunas consideraciones teóricas del patrón de diseño "decorator" en particular #omo se %er* en la pró!ima sección, no todos los lenguajes '' organizan el conocimiento de la m isma manera, $ ha$ cuestiones de jerarua de clases, herencia, $ conducta del compilador ue afectan el fucnionamiento de los patrones n %irtud de ello, antes de desarrollar el ejemplo haremos una bre%e clasificación de los distintos paradigmas en los lenguajes de programación orientados a objetos 0o es el alcance de este tip e!plicar estos paradigmas en detalle, s ino identificar en u& grupo se encuentra -. 'bjects Si el lector se encuentra familiarizado con los distintos paradigmas de los lenguajes orientados a 'bjetos, puede omitir la lectura de las dos pró!imas secciones
O)er)ie* de los dierentes paradimas de los lenuajes orientados a objetos Los lenguajes de programación orientados a objetos se pueden clasif icar en dos grupos, dependiendo de u& manera orani(an el conocimiento 1 .or una parte est*n los lenguajes ue organizan el conocimiento de manera jer*ruica, mediante clases, $ por otra, los ue lo hacen a tra)+s de prototipos! El primer caso, por ejemplo, es el de los lenguajes m*s populares como 2a%a, 3-0et , Smalltalk, #44, 'bjecti%e5# Abap OO tambi+n pertenece a este rupo! l segundo grupo, ue utiliza prototipos, est* compuesto por lenguajes menos c onocidos como "Self"
6entro de los lenguajes ue conforman el primer grupo se pueden encontrar dos grandes di%isiones1 lenguajes tipados $ notipados1 Los tipados son au&llos en ue el compilador )eriica tipos #uando se define un atributo o par*metros de entrada o salida del m&todo de una clase en 2a%a por ejemplo, se debe especificar de u& tipo son dichos par*metros n los notipados, no e!isten los tipos l lenguaje no controla l os tipos de %ariable ue declara ste es el caso de Smalltalk $ 'bjecti%e5#, por ejemplo Abap OO pertenece al rupo de los tipados, de -ec-o, &uienes -ayan proramado en Abap OO y .a)a, puede apreciar &ue tienen muc-as similitudes y +sto se debe a &ue ambos pertenecen al mismo paradima!
6ada la naturaleza de cada grupo, la implementación de un patrón de dis eño depende del paradima al cual pertene(ca el lenuaje n el caso de los tipados, como el compilador %erifica tipos, es necesario -eredar de una superclase o implementar una intera( para &ue dos objetos sean polimóricos! ste es el caso de bap 'bjects n contraste, los lenguajes no tipados, al no tener "tipos", dicha superclase o interfaz 0' es necesaria para ue dos objetos sean polimórficos
.ag 7 de 78
ABAP Objects: Tutorial para implementar el patrón de diseño “decorator”
/eneralidades de los patrones de diseño #omo se dijera en la introducción, un patrón de dis eño es un modelo de solución reusable $ prototipada a un problema de diseño ue se plantea una $ otra %ez en forma recurrente dentro del mundo de la programación orientada a objetos La definición de un patrón de diseño inclu$e1 7) 0ombre del patrón: #onsiste en una o dos palabras ue describen el problema de diseño 8) El problema: specifica cu*ndo aplicar el patrón $ e!plic a el conte!to 9) 1a solución: 0o describe un diseño concreto ni una implementación en partic ular, $a ue el mismo se puede aplicar en diferentes situaciones n cambio, el patrón pro%ee una descri pción abstracta de un problema de diseño $ de u& manera un conjunto de elementos (clases $ objetos) lo resuel%en :) 1as consecuencias: Son los resultados ue se obtienen al aplicar un patrón ;nclu$en su impacto en la fle!ibilidad, e!tensibilidad $ la portabilidad del sistema
Objeti)o y necesidad del patrón de diseño “$ecorator” Supóngase ue se desea agregar a la %ista de un te!to un botón, un
elementos adicionales como scroll, borde, input, te!t bo! $ table e!isten 97 combinaciones posibles? ) n segundo lugar, si surge una nue%a funcionalidad (un button en la %ista por ejemplo), es tanto el nue%o código ue se debe programar ue resulta inmantenible @eredar el borde de una clase es otra solución incorrecta, $a ue todas las subclases heredaran el borde sto es infle!ible, porue la elección se lle%ara a cabo nue%amente de forma est*tica Decorator es un patrón de diseño ue resuel%e el problema de añadir din*micamente funcionalidades adicionales a un objeto .ara ello, propone una solución al problema ue consiste en encapsular la )ista de te#to en otro objeto &ue area el borde! n t&rminos de programación dicha encapsulación es una relación de composición, la cual mediante polimorfismo, se puede lle%ar a cabo de manera din*mica
Si bien en el el presente tutorial se %a a e!plicar el patrón "decorator", e!isten muchos otros como por ejemplo Singleton, Composite, State, Strategy y Template Method #ada uno propone una solución general para un problema particular recurrente en diseño
Enunciado del ejercicio a desarrollar Se reuiere armar el pedido de un caf& para el bar “El almacén del buen Café” n este bar un caf& puede ser de diferente tipo1 <#appuccino=, <#af& Latte=, <mericano=, ) La descripc ión $ precio deberan ser1 <#appuccino, crema, canela= $ B78>, respecti%amente Si el mismo ingrediente se encuentra dos %eces, no es necesaria la palabra ) con doble crema (B7), alcanza con ue la descripción sea1 <istretto, crema, crema= $ el precio1 B7D
.ag 8 de 78
ABAP Objects: Tutorial para implementar el patrón de diseño “decorator”
An'lisis de cómo se )a a utili(ar “decorator” Supongamos ue "l almac&n del buen #af&" tiene un pedido Cappuccino con los ingredientes crema $canela .odemos pensar ue los inredientes son decoradores del cappuccino n primer lugar, el cliente desea un Cappuccino, entonces se crea un objeto cappuccino Luego el cliente uiere crema, entonces se crea dicho objeto ingrediente (crema) $ se hace ue
Einalmente el cliente uiere canela, entonces se crea el objeto canela $ se lo compone con la crema
l cómputo de la descripción total se obtendr* de manera recursi%a como se puede %er en el siguiente diagrama de secuencia1
l c*lculo del precio final del pedido se obtendr* de forma an*loga l m&todo et2price34 en lugar de retornar la concatenación de dos
.ag 9 de 78
ABAP Objects: Tutorial para implementar el patrón de diseño “decorator”
5mplementación de la solución en Abap OO .lanteado el enunciado del problema a resol%er, en los pró!imos pasos se %a a implementar la solución en -. .ara ello se %an a crear las tres clases, $ se definir*n los atributos $ los m&todos correspondientes Einalmente, se crear* un programa de prueba para testear la solución 0ota: l presente tip supone ue el lector $a s e encuentra familiarizado en cómo crear clases, definir m&todos $ atributos Si &ste no es el caso, es recomendable la lectura del tip Futorial -. 'bjects1 .arte 8, en donde aprender* esos conceptos necesarios para el seguimiento del presente Futorial
n este Futorial, se crear*n las clases de manera lobal , mediante la transacción 6E78 o 6E9 6e todas maneras, si el lector lo desea, puede optar por lle%ar a c abo la creación de las mismas de forma local en un programa Los pasos para la implementación de la soluci ón son los siguientes1 ;4 Se crea la clase <2=A>E en la transacción 6E78 o 6E9! 94 +na %ez creada la clase <2=A>E , en la solapa de “5nteraces” se declara la intera( <2BEB5$A $ se hace doble5click para crearla1
.ag : de 78
ABAP Objects: Tutorial para implementar el patrón de diseño “decorator”
?4 Luego dentro de la interfaz <2BEB5$A, se hace click en la solapa
.ara el tipo asociado a price se eligió un elemento de dato ue tiene el s iguiente formato1
legir algGn elemento de dato ue tenga caractersticas similares Si tiene las tablas de %uelos (S.EL;, SE L;H@F, S-''I) puede elegir el elemento de dato 62P@5=E! 4 Se hace click en la solapa de “et-ods= de la interfaz <2BEB5$A $ se declaran los m&todos de instancia1
.ag > de 78
ABAP Objects: Tutorial para implementar el patrón de diseño “decorator”
Se selecciona el m&todo /ET2$E6=@5PT5O0 $ se oprime el botón Parameters! Luego, en la nue%a pantalla se define el par*metro de retorno @2$E6=@5PT5O0
n*logamente se define el par*metro de retorno @2P@5=E en el m&todo /ET2P@5=E Aecuerde definir como tipo asociado el mismo tipo con ue definió el atributo n el c aso de este tutorial ser* >2=O>>EE2P@5=E 4 Se acti%a la interfaz <2BEB5$A C4 Se regresa a la clase <2=A>E #omo &sta implementa la interfaz <2BEB5$A, debe implementar sus m&todos Se dice ue la clase <2=A>E usa los m&todos $ los atributos de la interfaz <2BEB5$A
D4 Se prosigue a escribir la implementación de los m+todos! .ara ello se hace doble5click en<2BEB5$A/ET2$E6=@5PT5O0
.ag J de 78
ABAP Objects: Tutorial para implementar el patrón de diseño “decorator”
5mplementación:
KF@'6 zbebidaMgetdescription rdescription N zbebidaMdescription 06KF@'6
Luego se escribe la implementación del m&todo /ET2P@5=E de manera an*loga 5mplementación:
KF@'6 zbebidaMgetprice rprice N zbebidaMprice 06KF@'6 74 Se agrega el m&todo #'0SFA+#F'A en la solapa de < et-ods= $ se definen los siguientes par*metros1
La implementación del m+todo =O06T@F=TO@ es la siguiente1
.ag D de 78
ABAP Objects: Tutorial para implementar el patrón de diseño “decorator”
KF@'6 constructor zbebidaMdescription N idescription zbebidaMprice
N iprice
06KF@'6 G4 Se acti%a la clase <2=A>E ;84 Se crea la clase <250/@E$5E0TE n la solapa ”5nteraces” 3al igual ue como se hizo con la clase <2=A>E4, se declara la interfaz <2BEB5$A! ;;4 6entro de la clase <250/@E$5E0TE, en la solapa de “et-ods” se agregan los m&todos=O06T@F=TO@ $ 6ET2=A>E2=OPFE6TO (los m&todos /ET2$E6=@5PT5O0 $ /ET2P@5=E aparecen autom*ticamente porue la clase implementa la interfaz, al igual ue ocurrió con la clase <2=A>E ) n la solapa de atributos se agrega la %ariable de instancia cae2compuesto con el tipo asociado <2BEB5$A
La solapa de m+todos uedar* como se ilustra a continuación1
O la solapa de los atributos , como sigue1
;94 Se procede a definir los par*metros de los cuatro m+todos e implementarlos ;9!;4 K&todo =O06T@F=TO@: se realiza e!actamente igual al m&todo #'0SFA+#F'A de la clase <2=A>E , con los mismos par*metros $ la misma implementación (.uede hacer "cop$5paste" del código) ;9!94 K&todo 6ET2=A>E2=OPFE6TO: Par'metros:
.ag P de 78
ABAP Objects: Tutorial para implementar el patrón de diseño “decorator”
5mplementación:
KF@'6 setcafecompuesto cafecompuesto N icafecompuesto 06KF@'6 ;9!?4 K&todo /ET2$E6=@5PT5O0 n ese caso no ha$ ue definir ningGn par*metro $a ue los mismos surgen de la interfaz <2BEB5$A! 5mplementación:
KF@'6 zbebidaMgetdescription 6F1 desc FO. string, descfinal FO. string desc N cafecompuesto5Qgetdescription( ) #'0#F0F desc zbebidaMdescription ;0F' descfinal S.AF6 -O R, R rdescription N descfinal 06KF@'6 ;9!4 K&todo /ET2P@5=E 5mplementación:
KF@'6 zbebidaMgetprice 6F1 parcialprice finalprice
FO. zgfcoffeeprice,
FO. zgfcoffeeprice
parcialprice N cafecompuesto5Qgetprice( ) finalprice N parcialprice 4 zbebidaMprice rprice N finalprice
.ag de 78
ABAP Objects: Tutorial para implementar el patrón de diseño “decorator”
06KF@'6 0ota: Aecuerde incluir el elemento de dato correspondiente para las %ariables parcial2price $ inal2price! ;?4 cti%e la clase <250/@E$5E0TE como Gltimo paso del desarrollo ;4 l lector puede testear las clases como desee continuación se muestra el códio de un prorama Abap de prueba , en donde se %a a realizar la composición de los objetos
T"555555555555555555555555555555555555555555555555555555555555555555555T T" eport #$%&E'($%ED)D* T" +"555555555555555555555555555555555555555555555555555555555555555555555T
T" T" +"555555555555555555555555555555555555555555555555555555555555555555555T
A.'AF zpruebapedido 6F1 cappuccino crema
FO. AE F' zingrediente,
canela
FO. AE F' zingrediente,
description price
FO. AE F' zcafe,
FO. string,
FO. zgfcoffeeprice
+++Se crean los obetos
#AF '-2#F cappuccino U.'AF;0H idescription N R#appuccinoR iprice
N R77R
#AF '-2#F crema U.'AF;0H
.ag 7C de 78
ABAP Objects: Tutorial para implementar el patrón de diseño “decorator”
idescription N RcremaR iprice
N R7R
#AF '-2#F canela U.'AF;0H idescription N RcanelaR iprice
N RC>R
Se eali.a la composicion
crema5Qsetcafecompuesto( U.'AF;0H icafecompuesto N cappuccino ) canela5Qsetcafecompuesto( U.'AF;0H icafecompuesto N crema ) +++Se obtiene la descripcion y el precio
description N canela5QzbebidaMgetdescription( ) price
N canela5QzbebidaMgetprice( )
VA;F1 R6escripcion1 R,description, W,R.recio1 R,price
6alida resultante por pantalla:
.ag 77 de 78
ABAP Objects: Tutorial para implementar el patrón de diseño “decorator”
=onsideraciones adicionales: ;4 0otar ue en e l prorama de prueba , la composición se realizó E” ue encapsule la composición de los objetos La forma de implementar la clase ueda librada al lector 94 0otar tambi&n ue para poder implementar el patrón se reuirió ue los objetos de la clase =A>E e 50/@E$5E0TE sean polim!rficos/ n los lenguajes tipados, se necesita heredar de una superclase o implementar una interfaz para ue dos objetos sean polimórficos s por eso ue se usó la interfaz BEB5$A!Se podra haber utilizado una clase abstracta, pero se optó por usar una interfaz $a ue no se encuentra una superclase apropiada ue tenga como subclases a #E e ;0HA6;0F ;gualmente si el lector lo desea, puede probar la alternati%a de usar una clase abstracta/ ?4 'bser%ar ue no se creó una clase para cada inrediente $ ue las mismas heredan de una superclase ;0HA6;0F Se creó una Hnica clase porue todos los inredientes tienen la misma forma de calcular s u costo $ su descripción (mismo comportamiento) Suponga ahora ue el precio de la leche est* dado por >Cml $ ue el cliente puede decidir c u*ntos ml de leche uiere n este caso el precio de la leche %a a depender de un atributo adicional ue es la cantidad solicitada .or lo tanto en este caso tiene sentido crear una clase abstracta ;0HA6;0F con subclases L#@ $ #0L por ejemplo 4 nalizar cómo cambia la implementación del patrón en los lenguajes no5tipados como Smalltalk n ese caso no se necesitara de la interfaz o clase abstracta --;6, $a ue en dichos lenguajes no se reuiere de herencia para ue dos objetos sean polimórficos Es por esta ra(ón &ue se e#plicó a &u+ paradima pertenece Abap OO! 4 'bser%ar ue para in%ocar los m&todos et2price34 $ et2description34 se utilizó la forma un$obeto0nombre$interfa.1un$metodo2 3/ 6e esta manera ueda e!puesto el uso de la interfaz, lo cual no es con%eniente .ara lograr una mejor encapsulación se recomienda el uso de
.ag 78 de 78