Programació Orientada a Aspectes
Primer es parlava de programació estructurada, després va venir la programació orientada a objectes i ara ve la programació orientada a aspectes.
Tots els paradigmes de programació obeeixen la mateixa màxima: Divideix el problema i venç.
En la programació estructurada, s'agafa el problema i en el primer pas es descriu el programa com si fos la llista de la compra, i a continuació es va refinant cada una de les frases de la llista, fins que s'arriba a escriure-ho tot en un llenguatge de programació que entengui la màquina:
programa botiga_menjar
{
repeteix_per_sempre
{
si entra_client
{
espera_fins_que_troba_dependenta_lliure
aten_client
si client_compra_cigrons comptabilitza_articles_per_pes
si client_compra_mongetes comptabilitza_articles_per_pes
si client_compra_pizza comptabilitza_articles_per_unitat
}
}
}
funcio aten_clinet { … }
funcio entra_clinet { … }
El problema de la porgramació estructurada és que per programes molt grossos, el nombre de funcions a escriure és molt gran i per tant per trobar un error, cal llegir-se tot el programa des del primer nivell, fins al nivell que falla per entendre-ho tot.
En la programació orientada a objectes, es mira de dividir el problema definint quins actors actuen en el problema i quines funcions faran cada un dels actors. L'avantage d'aquest paradigme, a banda de la millora en l'organització de les funcions, és que els objectes permeten herència i polimorfisme, per tant podem definir un concepte article genèric en comptes d'un codi especial per a cada tipus d'article. El programa quederia:
programa botiga_roba
{
repeteix_per_sempre
{
si client.entra
{
espera_fins dependenta.lliure
dependenta.aten_client
si client.compra(article) article.comptabilitza
}
}
}
objecte article
{
funcio comptabilitza { … }
}
objecte mongetes es_un article
{
funcio comptabilitza { comptabilitza_per_pes }
}
objecte pizza es_un article
{
funcio comptabilitza { comptabilitza_per_unitat }
}
El problema de la programació orientada a objectes és que hi ha funcions que no se sap ben bé quin objecte se n'ha de fer responsable. Per exemple en la funcio comptabilitza, toca una mica de tot: articles, caixa i comptabilitat. Per tant qui se n'ha de fer càrrec de la funció?
La programació orientada a aspectes permet treure a fora aquestes funcions que no tenen un propietari clar. El funcionament és molt senzill, es defineix una condició i sempre que el programa fa una acció que compleix la condició es llença el codi associat.
Per exemple si es vol guardar un registre de tot el què fa el programa, tan sols hem de definir les condicions següents:
Abans_de qualsevol_funció( f ) de qualsevol_objecte( o ) fes:
registre.escriu( " S'ha entrat en la funció f de l'objecte o " )
Despres_de qualsevol_funció( f ) de qualsevol_objecte( o ) fes:
registre.escriu( " S'ha sortit de la funció f de l'objecte o " )
Així podriem definir un aspecte Compatilitat de la següent manera:
aspecte Comptabilitat
{
Despres_de_la_funcio comptabilitza dels_objectes article fes:
{
si article.per_pes
{
article.calcula_pes
article.mira_preu_per_kg
dependenta.calcula_preu
…
}
}
}
Per aprendre començar a practicar de veritat podeu veure aquesta guia sobre el llenguatge de progrmació AspectJ.
AspectJ és un llenguatge de programació derivat del JAVA creat per un equip de Xerox PARC, entre ells el professor Gregor Kiczale.
Per la gent que sap programar bases de dades, tot això del tema d'aspectes veurà que funciona molt semblant a un TRIGGER SQL.
[@more@]