Documentos de Académico
Documentos de Profesional
Documentos de Cultura
CENIDET
TESIS
Que para obtener el grado de
. Maestro en Ciencias en Ciencias Computacionales
presenta:
MIGUEL HERNÁNDEZ VELÁZQUEZ
Director de Tesis:
M.C. MÁXIMO LÓPEZ SÁNCHEZ
Codirector de Tesis:
M.C. ISAAC ALBERTO PARRA RAMÍREZ
s ~ p CENlDET
CENTRO DE iNFORMAClON DG'Tl
03-0334
Cuernavaca, Morelos Agosto del 2003
Cuemavaca, Mor., a 18 de Agosto de 2003
Nos es grato comunicarle, que conforme a los lineamientos para la obtención del grado de
Maestro en Ciencias de este Centro, y después de haber sometido a revisión académica la tesis
denominada: Ingeniería Inversa de Código Fuente en C++ para la Obtención de su Disetio,
realizada por ei(ia) C. Miguel Hemández Velázquez, y habiendo realizado las mrrecciones que le
fueron indicadas, acordamos no tener objeción para que se le conceda la autorización de
impresión de la tesis.
Atentamente
-
Dr. René Sadtaolaya Salgado (M.c. Olivia FI *a@$ Diaz
\ f
i /-
Codirector de tesis
C.C.P. Dr. Rodolfo A Pazos Rangel, Jefe del Depto. de Ciencias Computacionales
Lic. Olivia Maquinay Díaz, Jefe del Depto. de Servicios Escolares.
C. Miguel Hemández Velázquez, alumno del programa de maestría.
INTERIOR INTERNADO PALMIRA SIN, COL, PALMIRA, A.P. 5-164. CP. 62490,CUERNAVACA, MOR. - MÉXICO
TELS. (777) 312 23 14,318 77 41. FAX (777) 312 24 34
FMAll nnio?Qrdrenidntr n m my
Iu & % m 3 m % m m w
~ ~ ~ L í E m c x . 3 N t
FORMULARIO C4
AUTORIZACIÓN DE IMPRESION DE TESIS
INTERIOR INTERNADO PALMIRA S / N . COL. PALMIRA , A.P. 5-164. CP. 62490, CUERNAVACA. MOR. MÉXICO
~
TELS.(777I312 2 3 1 4 . 3 1 8 7 7 4 1 . F A X í 7 7 7 i 312 2 4 3 4
Para mís padres,
para Ise, y
. parachei
Agradecimientos
Quiero expresar mi mas sincero agradecimiento a todas las personas que de alguna manera
contribuyeron para finalizar este proyecto de tesis (en la lista de abajo quizá no estén todas y cada
una de ellas dado que mi memoria no es precisamente de elefante y ha pasado bastante tiempo);
cada quién puso una roca o un granito de arena en la conversación, en el espaldarazo, en la crítica,
en lo económico, en el saludo, en el enojo, tristeza o alegría justo en el momento indicado (el
orden de aparición no indica el importancia necesariamente):
A mi asesor Máximo López por toda la ayuda moral e incluso económica, consejo académico y
disculpas aceptadas. Por ser un guía que no desdeña el trato humano. Por aprender a escuchar las
ideas este inusual tesista. Vivan los vivos.
A Javier Ortiz pues al inicio de la maestría su apoyo fue imprescindible para emprender el reto con
ánimo y esperanza. Por las concienzudas y profundas pláticas de cómo mejorar varios aspectos de
este condenado país.
A René Santaolaya porque detrás de toda su bien ganada sapiencia existe un ser humano que
finalmente también es capaz de escuchar. Gracias por ser un ejemplo para mi carrera profesional.
La programación con objetos ya tienen sentido para mi al fin.
A Olivia Fragoso, gracias por ser una parte decisiva en mi aspiración de entrar al centro. Gracias
por ser una guía en muchos aspectos extra-académicos, pero principalmente por todo el consejo
durante mi transición hacia la vida como padre. La Ingeniería de Software sípuede ser divertida e
int&esante, siempre y cuando se tope uno con gente como Olivia y se platique al respecto.
Al Dr. Pazos, por compartir largas conversaciones que permitieron abrir mi original ingenuo
panorama sobre el conocimiento y uno que otro sabio consejo más. Por las verdaderas cátedras en
el aula acerca de la Bases de Datos. Por el apoyo en general que me otorgó durante mi estancia.
Desde luego a la SEP y en especial al COSNET por prestar la ayuda económica sin la cuál este
proyecto simplemente no se hubiera logrado.
Gracias.
I N G E N ~ E R ~INVERS
A A DE CÓDIGO FUENTE EN c++PARA LA OBTENCIÓN DE SU DISENO
Introducción
El tema central del presente trabajo se enfoca hacia la aplicación de ingeniería inversa para
recuperar diseños de software. Lo anterior, debido en gran parte a que el ingeniero de
software frecuentemente echa mano de herramientas automatizadas que recuperan diseños
para mantener y documentar sistemas de software, reduciendo la complejidad del
entendimiento de código fuente.
Es necesario estudiar varios temas para la realización de este proyecto: las tecnologías
diagramas de clases del UML y ' diagramas
. r:
de objetos que involucran a los atrones de diseño y el desarrollo de software con la MFC2;
del método de Warnier; la traducción de
lenguajes libres de contexto y el lenguaje de programación C++.
El diagrama de clases del UML y los diagramas de Warnier, serán la notación base para
representar respectivamente los diagramas con las perspectivas estática y dinámica del
diseño recuperado desde código fuente en C++.
i SOODA es producto dc la I& "Modelado Oricniado a Objeior". dcl grupa dc ingenieria de Solbarc. dcl Centro Nacional de
lnvesligacibn y Desanollo Tecnológico, en Cuemavaca, Morelos. Mexico.
2
Bibliolcca de Clases Base dc Microsafl
1
Lcnguajc Unificado de Modelado
4
Anoiher Tool for Language Recognition
INGENlERiA INVERSA DE CÓOIGO FUENTE EN c++PARA LA OBTENCIÓN DE SU DISENO
<.
11
-
,<' .'.I<.,
CONTENIDO GENERAL
.......................................
...I
...................................... VI1
Capítulo 5 . Conclusiones
5.1 Análisis de los Resultados Obtenidos ................ ........................... ..................... 121
5.2 Conclusiones ...................... ............................................................................ 122
5.3 Trabajos Futuros...'. ...... ................ 123
5.4 Refcrencias ....................................................................................................................................
~ 123
...
111
INGENlERiA INVERSA DE CODIGO F UENTE EN c* PARA LA OBTENCION DE SU DISENO
ÍNDICEDE FIGURAS
Figura Página
Figura 3.4 Diagrama de clases con los patrones de diseño Composite, Iterator y Visitor
embebidos en la arquitectura de InverSOODA 46
Figura 3.7 Diagrama de clases del UML del patrón del diseño Builder embebido en la
arquitectura de InverSOODA 53
Figura 3.8 Diagrama de secuencias del UML de los objetos en el patrón Builder 54
iv
, , :. .". 4 ,..I.
..'U, ,1
Figura Página
Figura 3.22 Traducción entre una clase en código fuente hacia una figura 73
Figura 4.3Cuadro de diálogo que pregunta si se inicia otro proceso de ingenieria inversa 81
Figura 4.4 Cuadro de diálogo para seleccionar el archivo que contiene el código fuente
en C++ sobre el cual se aplicará la recuperación de diseño 82
Figura 4.5 Cuadro de diálogo que indica al usuario la recuperación con éxito de un diseño
desde código fuente
81
Figura 4.6 E'em
I 1
metodo de clase
&un d\&rama de Wamier que corresponde al diseño detallado de un
84
Figura 4.7 Instantánea de la interfaz utilizada cuando de acciona la recuperación del diseño
detallado de un midodo en particular 85
Figura 4.8 Métodos y atributos de la clase InverSoodaDiagramaBuilder usados en 10s
mecanismos de ingenieria inversa 90
Figura 4.9 Diagrama de clases generado de manera asÍncrona por niedio de la barra de
modelado de InVerSOODA
96
Figura 4.14 Pantalla de salida en la ejecución del código gcnerado con los mecanismos
de ingenieria directa de InverSOODA I04
EN c* PARA LA OBTENCION DE SU DISENO
INGENlERiA INVERSA DECODIGOFLJENTE
Figura Página
Figura 4.15 Diagrama de clases recuperado con InverSOODA: despliegue de las clases
BDSys y de BDMenu 1o9
Figura 4.16 Diseño detallado recuperado del método aStratl ::getnum() 110
Figura 4.20 Diseño detallado recuperado del método cStrl I::Algor¡tmoDeInterFaz() 112
Figura 4.30 Diseño detallado recuperado del método VAl::bdleea(unsigned int VAR) 117
Figura 4.31 Diseño detallado recuperado del método VAl::bdsca(unsigned int VAR) 118
vi
E C+t PARA LA OBTENCION DE SU DISERO
INGENlERiA INVERSA DE CÓDiGO F U E ~ TEN
ÍNDICE DE TABLAS
Tabla Página(s)
Tabla 1.1 Herramientas que realizan ingenieria inversa de software para recuperar diseños 5.6
Tabla 2.1 Definición dirigida por la &axis para traducir expresiones de suma y resta en
notación infija a notación posfija 21
Tabla 2.2 Esquema de traducción dirigido por la sintaxis que traduce expresiones aritméticas
de suma y multiplicación, de notación en infijo a posfijo 30
Tabla 3.2 Esquema de traducción entre el lenzuaje C++ y diagramas de clases del UML 69-12
Tabla 4.1 Papel de los atributos y métodos del objeto Builder en el análisis semántico 9 1-94
vii
-
Capítulo 1
Conceptos Generales
“EL RETO
Siempre establece el camino,
nimca sigas el sendero ‘I
Anvli(nif
En el ámbito actual de la Ingeniería de Software existen dos conceptos con íntima relación: la
documentación de software existente y la recuperación de diseños 'de software. La
importancia de la relación entre estos dos conceptos existe porque al recuperar el diseño de un
software que ya existe, se cuenta con los planos con que se construyó. El diseño es una parte
niedular de la documentación de un software, que se complenienta con otros elementos tales
como los requisitos y las pruebas.
Los tenias tratados en este capítulo tienen la intención de presentar los antecedentes y
conceptos generales que preceden el presente trabajo. Todo gira en tomo a la recuperación de
diseño por medio de ingeniería inversa; se mencionan los trabajos relacionados y la relación
especial de las herramientas SOODA [PnrOO] e InverDDVi respecto a InverSOODA, la
herramienta propuesta; se presenta el objetivo de este proyecto; se formula la hipótesis general
. que sostiene la tesis; se exponen los beneficios, alcances y limitaciones; finalmente, se
enumeran las actividades que comprende la metodología de solución propuesta.
r
I
con abstracciones de alto nivel, desde
código fiiente y documentos de diseño. Figura 1.1 Proceso básico de ingeniería
r I inversa de Byme.
' Ciiado en [ WeiiOZ]
3
CAPiTULO 1: CONCEPTOS GENERALES
La Figura 1.2 ilustra el proceso básico de recuperación de diseños para programas escritos
en C. Según Biggerstaff, este proceso se puede aplicar a lenguajes orientados a objetos con
sólo una modesta variación'. El proceso básico comienza con un análisis que identifica
estructuras . organizacionales a gran escala, tales como módulos, subsistemas y datos
importantes. Enseguida se recuperan otras estructuras abstractas de diseño: diagramas
informales, conceptos y relaciones informales, diseño racional, estructura de módulos y
finalmente flujo de datos y de control. Durante este proceso se debe mantener el mapeo entre
las abstracciones y los segmentos de código que las implementan.
El Programa
fuentcen c d
Identificación de
agrupaciones de
módulos y datos
abstractos
Recuperación de
i ) abstracciones de
diseño
i )
Mapeo de las
abstracciones
con el código
I
I1
Deigraciidumente no especifica que variación. El modelo no enloca su aplicación a sisl~niasorientados a objetos, pero sienta las bases de la
recuperación de infamación de entidades con alta abstmcción - algo muy parecido u una clsse - y luego u la recupcración de los deialles de
dichas entidades.
4
CAP~TULO
1: CONCEPTOS GENERALES TRABAJOSRELACIONADOS
Son numerosas las herramientas computacionales que realizan ingeniería inversa para
recuperar diseños embebidos en código fuente. La diversidad de dominios, lenguajes y metas
que comprenden estas herramientas hace imposible listarias todas. La Tabla 1.1 tiene la
intención de mostrar al lector una síntesis de aquellas herramientas que tienen mayor
relevancia para el presente trabajo. En cualquier caso, la columna denominada Contraste
menciona los desventajas de las herramientas analizadas que no son tales en InverSOODA, la
herramienta propuesta en este trabajo de tesis para recuperar diseños.
Tabla 1.1 Herramientas que realizan ingeniería inversa de software para recuperar diseños.
5
C A P ~ U L1:OCONCEPTOS GENERALES
-
Herramientas que realizan ingeniería inversa de software para recuperar 1
diseños
(continuación ...)
Nombre Dominio Descripción Rqlación ,Contrasfe
nverDDVi MBtodos Es una herramienta de De especial La principal
Wen021 automatizadc ingenieria inversa que permite relevancia es este desventaja frente a
de ingenieria visualizar el diseño detallado trabajo, pues InverSOODA es
inversa. de un programa, utilizando la representa el que. por sí sola,
notación Wamier. módulo que sólo funciona para
recupera el sistemas escritos
diseño detallado en lenguaje C. Su
de funciones de enfoque no
InverSOODA. contempla la
recuperación de
abstracciones
equivalentes a
cIases.
IRT [DrtOZ] Aplicaciones Oesign Recovery Tool es una El mapeo de DRT es una
gráficas herramienta de exploración ejecuciones de herramienta
interactivas. gráfica de apiicaciones en métodos con experimental que
C/C++ muy peculiar; identifica escenarios de deja de lado la
explosiones de ejecución - la casosdeusose recuperación de la
totalidad de los métodos puede usar para vista estática
llamados - que corresponden recuperar diseños j envestida en los
a las acciones ejecutadas por documentar las diagrama de clases.
un usuario. Obtiene un mapeo funciones más Tampoco se puede
explicito de las acciones de usadas de manera decir que es
alto nivel -similares a gráfica. exactamente la
iragmentos de escenarios de recuperación del
casosdeuso-wnsu. diseño detallado de
implementación de bajo nivel. métodos su finalidad.
, -~ . .
lational Desarrollo Esta herramienta es una parte Rational Rose es Ií En cuanto a
lose Model-Driven de Rational Suite, que es lider herramienta ingenieria inversa,
Jrofessional con UML. en el campo del desarrollo de propuesta por el Rational Rose enfoca
idition for software orientado a objetos y Object sus esfuerzos a la
:++ [Rat031 de componentes. Esta versión Management recuperaci6n de
se puede integrar con Group para diversas
MicrosoflVisual C++ para promover y usar el abstracciones de
desarrollar software. UML. Realiza diseño, entre otras,
ingenieria inversa el diagrama de
directa de código clases, pero no hace
para Visual C++ recuperación
entre otros explicita del diseño
lenguajes de detallado de los
programación. mbtodos de clases
que aparecen en
dicho diagrama de
clases.
Tabla 1.1 Herramientas que realizan ingeniería inversa de software para recuperar diseños.
(continuación...)
6
CAPiTULO 1: CONCEPTOS GENERALES DEFINICIÓNDEL PROBLEMA
De acuerdo con Chikofsb 'ch'wl, "Las fases de ciclos de vida evolutivos involucran la transición de
altos niveles de abstracción en etapas tempranas, a bajos niveles de abstracción en etapas
posteriores". Además, comenta que en dichas etapas: "...la ingenieria inversa cubre un amplio rango
de etapas que comienza con la implementación existente, la recuperación o recreación del diseño y el
descifrado de los requerimientos que de hecho se implementan en el sistema...". De aquí se
desprende que en los modelos de ciclos de vida3, la aplicación de ingeniería inversa se da en
varias etapas y puede considerar tanto las abstracciones de alto nivel como las abstracciones de
bajo nivel.
,,
#
El problema se extiende de alguna manera a la herramienta SOODA, pues, por principio
de cuentas, no es una herramienta bidireccional; no puede hacer ingeniería inversa a partir de
código fuente en C++.
1.4 Hipótesis
I
En este trabajo se plantea como hipótesis que es posible generar el diagrama de clases basado
en el estándar UML y los diagramas de Warnier para representar el diseño detallado de
métodos de clases, a partir de código fuente existente en C++.
7
CAPhULO 1: CONCEFTOS GENERALES
Se contará con InverSOODA, una herramienta de ingeniería de software que realiza ingeniería
directa e ingeniena inversa de programas en C++. La ingeniería directa provee los mismos
beneficios que la herramienta SOODA. A su vez, la ingeniería inversa obtiene diagramas con
el diseño de clases y el diseño detallado de los métodos de clases, desde código fuente
existente. Los diagramas recuperados representan un modelo estático y dinámico que son parte
de la documentación del diseño del código fuente.
InverSOODA no verifica errores en el código fuente sujeto a análisis. Por lo tanto, éste no
debe tener errores de compilación ni de ejecución. De lo contrario, se obtendrán mensajes de
error. Además, el código fuente debe estar organizado con su definición de clases dentro de un
solo archivo con extensión h ó hpp y la implementación de los métodos de clases dentro de
archivos independientes con extensión c Ó cpp.
Si bien existe la posibilidad de usar notaciones de diseño detallado más divulgadas que la
de Warnie?, InverSOODA echa mano del conocimiento adquirido con InverDDVi para
resolver la diagramación del diseño detallado de los métodos de clases.
InverSOODA utiliza todo elemento gráfico de SOODA para la ingeniería directa. Sin
embargo, el mecanismo de ingeniería inversa sólo recupera relaciones de herencia y de
agregación entre clases, pues el analizador sintáctico no reconoce apuntadores y por ende
relaciones simples o de dependencia entre clases.
8
e<.. .
* ,"U. ..
:C%L$?"SrA.+l.." .i .'I,
! ' I
t ~.
1: CONCEPTOS GENE~ALES
CAPITULO METODOLOG~A DE SOLUCIÓN
A partir de esta
I . . r
las siguientes preguntas encontraron respuesta: ¿qué
revision,
estructura de datos se,usan y cómo se manipulan?, ¿Cómo se manejan los eventos de
interfaz e usuario?, ¿Cómo están organizadas sus clases?, ¿Qué clases se pueden extender
o agregar para poder hacer ingeniería inversa?
La idea original fue utilizar el patrón de diseño Builder [Gam951 para proveer un diseño
reusable que permitiera construir un objeto'diagrama a partir de la información que
arrojase el analizador sintáctico. Pero, conforme se fue detectando la posibilidad y
conveniencia de aplicar otros patrones de diseño que colaboraran con el Builder, entonces
se reorganizó gran parte del diseño de clases de la arquitectura original de SOODA.
La recuperación de cualquier tipo de información desde código fuente tiene dos principales
alternativas: la constnicción de analizadores manuale's o.el uso de formalismos como la
teoría de autómatas y be compiladores. La finalidad de esta actividad fue encontrar un
esquema de traducción formal entre lenguajes basándose en acciones semánticas. La
definición dirigida por la sintuxis fue el objeto de estudio que se acoplaba más para el
propósito de InverSOODA.
9
CAPiTULO 1: CONCEFTOS GENERALES
Las acciones semánticas del analizador sintáctico generado con ANTLR son las que
propiamente realizan la ingeniería inversa. Consiruyen con un objeto Builder el diagrama
de clases a partir de la información que arroja el análisis sintáctico.
Se identificó una subgramática para C++ escrita en notación EBNF que alimenta al
ANTLR. Este subconjunto gramatical de C++ es el suficiente para reconocer y descubrir
nombres, atributos, métodos de clases y relaciones entre clases. Se revisaron la literatura
especializada y algunos los archivos con definiciones de gramáticas para C ya existentes.
1.8 Referencias
[Big891 Biggenlaff. Ted J. Design Recovery for Mainienance end Reuse Computer. (E.U.: IEEE Computer, Julio de
1989) pp. 36-49.
[Chi901 Chikofsky, Elliot J. [y] Cross 11, James H. Reverse Engineedng and Design Recovery: A Taxonomy. (E.U.: IEEE
Somare. Enem de 1990) pp. 13-17.
Revise el Capitulo 5.
10
CAP~TULOI : CONCEPT~SG E N ~ M L E ~ REFERENCIAS
I 03- O 3 3 4
11
Capítulo 2
2.1 Antecedentes
2.2 Definiciones de
2.3 El Lenguaje Unificado be Modelado
2.4 Diseño Detallado en InjerDDVi
2.5 Base Teórica del Análisis de Código
2.6 Construcción Automátiya de Analizadores Sintácticos
2.1 Patrones de Diseño Orientados a Objetos
2.8 Referencias I
CAPÍNLO 2: MARCO TEóRiCO ANTECEDENTES .
. .
2.1 Antecedentes
IMOIOO]
2.1.1 Ingeniería inversa e ingeniería inversa de código
Estos comentarios dejan ver, de alguna manera, por qué es relevante el entendimiento
de código fuente. Sin embargo, falta precisar algunos de los frutos o beneficios concretos
que proveen las capacidades de ingeniería inversa de código. Dichos beneficios incluyen la
descomposición en subsistemas; análisis de conceptos; identificación de diseños,
programas y patrones de cambio; slicing de programas; análisis de dependencias estáticas
y dinámicas; métricas orientadas a objetos; exploración y visualización de software. Se
habla entonces de artefactos de sofwure al referimos a una abstracción de determinado
nivel que se encuentra embebida dentro del código fuente, y que puede ser recuperada por
mecanismos de ingeniería inversa.
Se obtiene(n):
Objetos centrales de negocios para migrar
sislemas a plataformas onentadas a obJetos:
S e aplica a (en):
Ingeniería Bodegas de datos; Map- entre e ~ t ~ c h l r ades datos legadas y
Inversa Mineria de dalos; y, un modelo de objetos mmún para negocios o
rla nntm infraestmclums moperalivas Web: y.
Bases de dalos
relacionales
Aseguramiento de wlidad integral de
sistemas de samate que usan eslniclurasde
datos persistenles o esquemas mn sistemas
maneladores de bases dedalos.
Ingeniería
I””T)C%?
Se obtiene(n):
rI
Descamposici6n en subsistemas;
Sintesis de conceptos:
1
Identificaci6n de diseno y patrones de
ingenieria Se aplica a: cambio;
Inversa CddiQo fuente Rebanado de programas:
de Ceidigo
AnBlisis de dependencias estdticas y
dinhmicas;
MBtrica~orientadas a objetos: y.
Explaraci6n y.visualiraci6n de somare.
I1
Figura 2.1 Áreas de aplicación actuales de la Ingeniería Inversa de Software.
16
r
2: MARCO TEÓNCO
CAPITULO ANTECEDENTES
a
Entre los módulos que contendrá la suite se tienen los siguientes*:
a) SOODA*, modela diagr , mas de clases del UML y diagramas de Wamier para el
diseño detallado de métodos, apoyándose de DDVi para los segundos. Genera
código fuente en C+ a p h i r del modelado de diagramas de clases.
b) InverDDVi*, modela dibeño detallado con diagramas de Wamier. Auxilia a -
SOODA para generar el c)ódigo fuente de métodos de clases en lenguaje C++.
c) SIDDO*, detallado de métodos de clases
I utilizando Tiene embebido un analizador
sintáctico' que diagramas sea válida en función de
una gramática visual para de actividades.
d) Un módulo que modelará medio de diagramas de casos de uso
del UML. Con esta los documentos de requerimientos y
pruebas del sistema.
P
e) Un módulo que permitirá btener de forma automática los diagramas de secuencia
del UML, tomando infodación de 1os.diagramas de clases y de diseño detallado
generados con SOODA. d d e m h , permitirá el cálculo.automático de la métrica de
acoplamiento para sistemad,orientados a objetos:
\
f) Un módulo que mode ará el comportamiento ,dinámico de los objetos
correspondientes a las clases modeladas con SOODA, por medio de los diagramas
de estado del UML. I
g) Un módulo que presentará la vista de paquetes correspondientes a grupos de clases
con responsabilidad común)I gmpos que serán modelados previamente con SOODA.
Concretamente, se pretende que SOBDA sea un módulo bidireccional que sea capaz de
recuperar diseños desde código fuente3. Con InverSOODA, el nuevo prototipo de SOODA
propuesto en este trabajo, se cuenta ahora con la capacidad de recuperación a partir del
código fuente escrito en C++ de al menos dos niveles de abstracción de diseño: el diagrama
de clases y el diseño detallado de métodos. Con dicha capacidad es factible el
entendimiento y la reestructuración potencial de las tempranas decisiones de diseño
arquitectura].
Es importante notar que InverSOODA se puede catalogar como un software que realiza
ingeniería inversa de código para identificar diseño, de acuerdo con la Figura 2.1 de la
sección 2.1.1.
En esta sección se definen los conceptos que tienen que ver directamente con el tópico
central del presente trabajo: la ingeniería inversa de software para recuperar diseños. La
definición puede o no venir acompañada de un comentario o nota crítica que vincula el
concepto definido con el menester del proyecto o con alguna otra sección del documento en
específico.
’Explicitamentecn [ParOO] se menciona la necesidad a postcnori de agrcgar la Capacidad de ingenieria inversa a SOODA.
Además. para ver ejemplos concretos de procesos a los que se refiere la definici6n de ingenicna invcna repasc las secciones 1:l.i y
1.1.2 deestedocumento.
18
.-
2:
CAP~NLO MARCO TEÓRICO DEFINICIONES DE CONCEPTOS CENTRALES
2.2.3 Reestructuración 1
semántica)" [Chi901
2.2.4 Redocumentación
’ La sección 1.1.2 de este documento presenta un resumen de los elementos básicos del modelo de recuperación de disefios pmpucslo por
Biggerstaff. ..
6
La iección I . I .I de este documento presenta un resumen de los elementos básicos del modelo de’ingenieda invens de Byme.
20
. ~ . ,
2.2.7 Reingeniería
legado:
1) "Son programas que son criticos' para la operaci6n de las compañías, pero que fueron,
El UML provee básicamente odos los esquemas, vistas o perspectivas que permiten
entender el diseño de un sistema a de sus diagramas. Los diagramas más importantes
son: el diagrama de clases, el de secuencias, el diagrama de casos de uso, el
diagrama de actividades, entre otkos, Todos ,estos se elaboran según las necesidades del
sistema y la etapa de desarrollo ed que se encuentre el mismo. Este lenguaje se distribuye
de manera pública y gratuita en vakos documentos ue resentan los conceptos básicos del
modelado: su significado y su representación gráfica%*&I .
I
Hoy día, el Lenguaje Unificado de Modelado está siendo incorporado en la mayoría de
las herramientas de software comerciales que modelan sistemas orientados a objetos,
además de ser constante objeto de estudio. por parte de las instituciones de investigación
I
[LOP021
SEP CENIDET
21 CENTRO DE, INFORMACION
C A P ~ L2:OMARCO TEÓRICO
. . .. .. ..
2.3.1 El modelo estático de clases - .
El diagrama de clases del UML provee la vista estática de un software orientado a objetos:
"... en un principio llamados modelos de objetos, muestran las clases del sistema y sus
interrelaciones (incluidas la herencia, agregación y asociaciones)" [Amb981. Además, de manera
opcional pueden mostrar los atributos y/o .los métodos de las clases: "... los métodos se
documentan con una descripción de su lógica y los atributos se documentan con una descripción
sobre qué contienen. su tipo y una indicación d e rango de valores. Las relaciones entre[Amb98]
clases se
documentan con una descripción de su propósito y una indicación de su cardinalidad..."
La siguiente cita de Scott W. Ambler [Amb981, enriquece las descripciones del párrafo
anterior: "La información contenida en un diagrama de clases se mapea directamente con el
código fuente que será escrito para implementar la aplicación y por ende un diagrama de clases
siempre debe ser dibujado para una aplicación orientada a objetos." Con InverSOODA se puede
realizar ingeniería directa para crear un diagrama de clases y generar el código en C++
asociado al diagrama. En el renglón de recuperación de diseños hace propiamente lo
inverso: es capaz de recuperar el diagrama de clases a partir del código que generó.
Por otro lado, tanto los diagramas de distribución como los diagramas de
actividades del UML normalmente también se consideran como diagramas con enfoque
dinámico. Los diagramas de distribución presentan la configuración en tiem o de ejecución
de componentes de hardware y el software que se ejecuta sobre éstos Ihb9 8pl. Por su parte;
los diagramas de actividad se usan "... para documentar la lógica de un solo método.de
operación o el flujo de la lógica d e un proceso de negocio"[Amb981
"El diagrama de actividades es
una extensión del diagrama de estado. Los diagramas de eitados destacan los estados y
representan actividades como flechas.Los d e actividad se enfocan en las actividades." [School
: I
'<'.- .' 22
CAPhULO 2: MARCO TEÓRICO DISEÑODETALLAWEN INVERDDVI
control [loy90].
23
CAPINLO 2: MARCO TE6RICO
Durante el curso intitulado Tecnologia software para ambientes Web", impariido en Enero del año 2000 dentro de las
instalaciones del CENIDET. al Dr. Oscar Pastor López (Jefe del Depto. de Sistemas Informátiws y Computación de la
Universidad Poiitécnica de Valencia), se le hicieron. entre otras, preguntas con alusión a la siguiente idea: ¿Queda
explicita en el UML la representaci6n de diseño detallado?. El wntexto en ese momento era la exposición de la
intención de los diferentes diagramas del es6ndar UML.
Recreando s610 la esencia de las preguntas. sin tomar las palabras corno se dijeron literalmente:
Asistente al curso:
Doctor, ~ c 6 m ose puede utilizar una notacidn detallada w n UML?
Dr::
'En verdad os digo que has puesto el dedo en la llaga. Recuerde que el UML es una especificación lodavia
incompleta"
...
Asistente al curso:
¿Ud. cree que el estado actual del UML permite modelar disefio detallado de métodos de dases. con alguno
de sus diagramas?.
Tomándose algunos segundos, volteando hacia arriba y finalmente apresurándose a contestar: 'El uso de diagramas
del UML para eso mmhh. es cuestionable..."
La anterior a n h i o t a no tiene otro fin más que el de recalcar que hasta ahora no existe en el estándar una
convenclón acerca de qué diagrama es el más apropiado para modelar ei disefio detallado. La validez del uso de un
is
diagrama u otro es válida en términos del wntexto de desarrollo y utilidad que al desarrollador le provea. ¿Alguna
vez habr6 escuchado el lector la frase Estoy programando C++ estnicturado?. O bien la persona que dedar6 eso
ignora la evoluci6n de los.paradigmas de programaci6n. o bien [intenta decir que le es práctiw.mezclar código en C
wn objetos o viceversa!. Lo anterior no es tan .descabellado si se hace. por ejemplo, un reuso de funciones de la
biblioteca estándar de C dentro de objetos. lo cual finalmente puede ser una estrategia útil para usar.funciones
estándar probadas a manera de un wrapper0 un adapter:
#include isldio.h,
J. Howard Johnson sugiere un listado general de los niveles en que se puede aplicar
el análisis de código para obtener entendimiento de código:
I . Texto simple: El cuerpo del código se considera como una colección de archivos
cada uno de los cuales es una secuencia de caracteres agrupados en líneas.
24
*> _I
Los niveles sugeridos por Jobson son muy parecidos a las fases de análisis de un.
compilador. La explicac.ión es qud existen formalismos comunes a los formalismos en los
,que se basa un compilador, como be muestra en la siguiente sección. La diferencia entre
ambos formalismos es de intenciód. Un compilador no se enfocan hacia la traducción entre
lenguajes, más bien'a la código ejecutable.
tomados de [San981
25
2: MARCO TE~RICO
CAP~TULO
ISan981
2.5.2.1 Traductores
Un traductor es un dispositivo tal que, dada una cadena de entrada x , calcula una cadena de
salida y, de manera que el par ordenado (x, y) está en una traducción T dada. La traducción
debe tener las siguientes características:
a) Debe ser legible. Esto es, debe ser fácil determinar cuáles pares (x, y) existen en la
traducción.
b) Debe ser posible construir mecánicamente un traductor eficiente, para que la
traducción se efectúe de manera directa desde la definición de ésta.
[Aha981
2.5.2.2 Traducción dirigida por la sintaxis
La traducción de lenguajes libres de contexto puede ser guiada por una GLC. Esto se logra
proporcionando información semántica a las construcciones del lenguaje a traducir. Es
decir, se asocian reglas semánticas a las producciones gramaticales y opcionalmente
atributos a los símbolos no terminales.
Hay dos notaciones para asociar reglas semánticas con producciones gramaticales: las
definiciones dirigidas por la sintaxis (DDS) y los esquemas de traducción (STDS). En el
proceso conceptual de traducción, tanto para las definiciones dirigidas por la sintaxis como
para los esquemas de traducción, se hace un análisis sintáctico de la cadena de
componentes léxicos de entrada, se construye el árbol de análisis sintáctico y después se
recorre el árbol para evaluar las reglas semanticas en sus nodos, como se aprecia la Figura
2.2. La traducción de las cadenas de componentes léxicos es el resultado obtenido al
evaluar las reglas semánticas.
Una implementación no tiene que seguir al pie de la letra el esquema de la Figura 2.2.
Hay casos especiales de definiciones dirigidas por la sintaxis en las que se pueden
implementar las evaluaciones sintácticas en una sola pasada, sin construir explícitamente un
árbol de análisis sintáctico o un grafo de dependencias entre atributos.
26
Cadena de + Árbol de análisis + Grafo de dependencias + Orden de'
entrada sintákico evaluación de las
reglas semántica
gramática libre del contexto para especificar la estructura sintáctica de la entrada. A cada
símbolo de la gramática ie asocia un conjunto de atributos y a'cada producción un conjunto
de reglas semánticas, para calcular 'los valores de los atributos asociados con los símbolos
que aparecen en esa producción.
Regla Semántica
- ,
2.5.2.4 Asociación de atributos en una definición dirigida por la sintaxis
En cualquier caso, se dice que el atributo b depende de los atributos c1 CZ, ..., ck.
Existe otra manera para traducir dos lenguajes entre sí: el esquema de traducción dirigida
por la sintaxis. Este esquema es una gramática que asocia ciertos elementos de traducción
con cada una de sus reglas gramaticales, intercalados en los lados derechos de dichas
reglas. La traducción se realiza de un lenguaje descrito por la gramática a otro lenguaje
definido por los elementos de traducción.
Los elementos de traducción son también conocidos como acciones semánticas [Ah0981
que definen la equivalencia entre las oraciones de los lenguajes, al generar cadenas de
salida a partir de cadenas de entrada. Las cadenas de entrada son porciones de oraciones
que se derivan de la gramática. Las cadenas de salida son las cadenas de entrada traducidas.
28
. 1 .
1. (S, S) es una forma de traducción, y se dice que las dos S están asociadas
2. Si (aAP, a’AP’) es una forma de traducción, en la cual las dos ocurrencias de A
están asociadas, y si, A-+ y,y’es una regla contenida en el conjunto R (ver sección
2.5.1.5), entonces (ayP,a’y’P’)es a su vez, también una forma de traducción.
Si las formas de traducción (aAP, a’AP’) y (ayP,a’y’P’) junto con sus asociaciones,
son relacionadas como se describe en el párrafo anterior, entonces se escribe:
(aA,P,a’AP’) a (ayp,a’y’P’)
*
{(%Y) I (S, S ) (y, Y), =E* Y YEA*)
Dada una cadena de entrada x se encuentra alguna derivación de x desde un símbolo inicial
S utilizando las producciones de esquema de traducción. Suponiendo que S = a,~,“ ai,+=
aZ,..., a. = x, es una de tales dehaciones. Entonces, se crea una derivación de formas de
traducción:
,. .~.
tal que, (w,p 0 ) = (S, S), (a,,$") = (x, y), y -cada pi se obtiene-aplicando a pi., el elemento
de traducción o la acción semántica correspondiente al ir de a i.1 a a i. La cadena y es una
salida para x.
1) E=>E+T 1) E=ET+
2) E=>T 2) E=T
3) T=>T*F 3) T=TF*
4) T=>F 4) T=F
5) F = > ( E ) 5) F E E
6) F=>digito 6) F=digito
7) digito=>O 7) digito=O
... ...
16) digito => 9 16) digito = 9
Tabla 2.2 Esquema de traducción dirigido por la sintaxis que traduce expresiones
aritméticas de suma y multiplicación, de notación en infijo a posfijo.
¿Cuál será la salida para la entrada w = 2+3*5?. Primero se encuentra una derivación
por la izquierda de w desde E, utilizando las producciones del esquema de traducción.
Entonces, se calculan las derivaciones correspondientes a las formas de traducción como
sigue:
(%E) 3
( E + T, E T + ) 3
( T + T, T T + ) *
(F+T, F T + ) 3
( digito + T, digito T + ) 3
( digito + T * F, digito T F * + ) 3
( digito + F * F, digito F F * + ) 3
( digito + digito * F, digito digito F * + ) ==?
( digito + digito * digito, digito digito digito * +) 3 (2+3 * 5,2 3 5 * +)
30
* .!l.
'O Pana [Par001 propone una gramática que genera el lenguaje visual del diagarna de clses del UML.
32
ri ,.j.
h
Por su parte, InverSOODA cue ta con un diseño arquitectural de clases que ya incluye
algunos patrones de diseño que bromueven el reuso de funcionalidades básicas y la
integración de otros módulos de la
33
CAPhTJLO 2: MARCO TE6RlCO
La estructura general del Composite identificada por Gamma, se muestra en la Figura 2.4.
Composite
Operation0
Add(Componente)
Remove(Com ponente)
GetChild(Componente)
" Una variación del clásico ejemplo de la pmgramaci6n oricnrada aobjelos: la clase figura y sus subripas cuadrado, recfangulo, rombo.
circulo, etc.
34
CAPITULO 2: MARCO TEÓNCO PATRONES DE DISEÑO
ORIENTADOS A OBJETOS
2.7.4
i
El patrón de diseño Bui der para creación de objetos compuestos IGam9SI.
El algoritmo que crea un complejo debe ser in$ependiente de las partes que
forman el objeto y cómo sk ensamblan.
El proceso de construccióh debe permitir diferentes representaciones para el objeto
que se está construyendo. 1
La Figura 2.5 de diseño Builder. Un objeto Builder
comúnmente es Composite (ver sección 2.5.3); ambos
patrones fueron de representación y construcción interna de los
diagramas de clase en En el siguiente capítulo, ,se aborda con más detalle el
uso práctico de los Composite y Builder, además de algunos otros
patrones también utilizados.
builder->ConctruiiPaite()
ConstiuirParteO ---m
Figura 2.5 Estructu a general del patrón de diseño Builder.
I
2.8 Referencias
CAPhWu,2: MARCO TE6RICO
[Big891 Biggersiaff, Ted J. Design Recovery for M&tenance and Reuse Computer. (E.U.: IEEE Computer, Julio de
1989) pp. 36-49.
(Chi901 Chikofsky. Elliot J. [y] Cross (I;James H. Reverse Engineering and Design Recovery: A Taxonomy. (E.U.:
IEEE Sollware. Enero de 1990) pp. 13-17.
[Gam951 Gamma Ench et al. Design Patterns-Eiements of Reusable Object Oriented Software. (E.U.: Addison-
Wesley-Longman.1995) pp. 3-31.97 163.
[Joh93] Jonson. J . Howard. .identifyng Redundancy in Source Code using Fingerprints. (Canadá: Proceedings of
CASCON '93. Toronto, Ontario. Octubre de 1993) pp. 171-183.
~JOY901 Joyanes Aguilar. Luis Fundamentos de Programación. Aigoritmos y Estructuras de Datos. (México:
McGrawhilüinteramencana de México S.A. de C.V.) pp 511, 519.
[LOP021 Lbpez Sanchez. Maximo. Protocolo de proyecto a CONACYT. (Propuesta de proyecto sometida al
CONACYT (con formato en documento electrónico). Cuernavaca. Morelos. México, CENIDET. G ~ p de
o
lngenieria de Software, Octubre de 2002).
[ParOO] Parra Ramlrez, Isaac A. Modelado Wsual Orientado a Objetos. (Tesis de Maestrla. CENIDET. Cuemavaca.
Morelos, Méuw. Diciembre del 2000) pp. 6.2, 1.6. A3.
[PreOZ] Pressman, Roger S. lngenieria del Sofiware. Un enfoque práctico. Quinta Ed. (Madrid. España:
McGrawhillilnteramericana de España, 2002) p. 546.
[Pia951 Plaitini. Mano [y] D&yanani Sunil. Elementos y Herremientas en el Desarmiio de Sistemas de Informacibn.
Una visión acfual de la tecnolcgia CASE. (Madrid. EspaRa: McGrawhillilnteramencana de España - Rama,
Serie Paradigma. 1995) p. 42-45
[RurnOl] Rumbaugh James e l al The Unifiod Modeling Language Reference Manual (Indianápolis. IN E U Addison-
Wesley Pearson Education. Agosto de 2001)
[San961 Santaolaya Salgado. René Apuntes sobre compiladores (Cuernavaca. Morelos, México: CENIDET Junio.
Diciembre de 1998).
[SchOO] Schmuller Joseph. Aprendiendo UML en 24 horas. (México: Pearson Educaci6n de México. S.A. de C.V., la
Edicibn, 2000) pp. 99, 134.
Wen021 Wences Dlaz. Martha F. Modelo de ingenieria inversa para la obtención de 'diserío detallado basado en
LEVISS. (Tesis de Maeslria. CENIDET. Cuernavaca. Morelos. México, Febrero de 2002).
[ZarnOl] Zamudio Lbpez. Sheidy A. Ideniificacibn de Funciones Recurrentes en Sohare Legado. (Tesis de
Maestrla. CENIDET. Cuemavaca. Morelos. México, Diciembre del 2001) p. 26.
36
Capítulo 3
3.1 Introducción
3.2 Arquitectura de InverSOODA
3.3 Diagrama de clases de In\;erSOODA
I
3.4 Aspectos de diseño orientados a objetos
3.5 Los analizadores de código fuente
1
3.6 Interacción con InverDDVi
3.7 Referencias
3.1 Introducción
1
Un modelo conceptual es una representación de aito nivel de cómo se organiza y opera un
determinado sistema. Involucra las más importantes metáforas y analogías empleadas en el
diseño, los conceptos que el siskema expone a los usuarios, las relaciones entre dichos
P
conceptos, los mapeos entre esaos conceptos y dominio de tareas que el sistema está
diseñado a soportar [Dan02]. El lect r encontrará en este capitulo cuestiones sobre el diseño y
arquitectura de InverSOODA, las estrategias de ingenieria inversa, la interacción con
InverDDVi y el rediseño de la arbuitectura original de SOODA, y se describen con cierto
detalle algunos aspectos que comF/lementanla comprensión del sistema.
I
3.2 Arquitectura de InverSOODb
La Figura 3.1 muestra la arquitec&a general de InverSOODA vista por capas de servicios'.
He aquí su descripción: I
I servicios en la primera capa a través de la interfaz
a) Un usuario utiliza los siguientes
LT
gráfica de usuario de inver OODA
b
c) Finalmente, la tercera capa u ica los servicios del sistema operativo como el Último
escalafón del conjunto de capas de software de InverSOODA. El sistema operativo
puede ser Windows 9x, Windows Me O
Windows XP Home.
39
CAPfTULO 3: EL MODELO CONCEPTUAL DEL SISTEMA
lnteriaz
Código fuente en C++
Usuario
1. Capa
2' Capa . . i
... .-. . ., .
I
Recordando las ideas del segundo capítulo en la Sección 2.3.1 de este documento: *...un
diagrama de clases provee la vista estatica de un software orientado a objetos y siempre debe ser
dibujado para una aplicación orientada a objetos". La Figura 3.2 muestra las principales clases
de InverSOODA.
40
I
- +
1 1 1 Ij '1 :, .
I ............ ~ ...........
71, I
41
..
CAPÍTULO 3: ELMODELO
CONCEPWAL
DEL SISTEMA
La siguiente sección describe los aspectos de diseño orientado a objetos tomados en cuenta
para el rediseño de SOODA. Esto es, los aspectos de diseño que hicieron posible la.
incorporación de la nueva funcionalidad provista por InverSOODA. Se hace énfasis en las
partes de la arquitectura de InverSOODA en donde se aplican patrones de diseño orientados
a objetos, aunque también se menciona la aportación de las clases de la Biblioteca de
Clases Base de Microsoft, la MFC.
La MFC es una biblioteca propia del entorno de desarrollo Visual C++ de Microsoft. El
uso de la MFC estnba en ayudar a desarrollar aplicaciones de C++ para Windows 32 bits
tratando de lograr los siguientes objetivos [parno]:
42
, 1
-. j
._ _ .
3.4.3.1 Motivación
La aplicación del patrón de diseño Composite no difiere mucho del ejemplo clásico que
S I , trata del diseño de un editor
aparece en el capítulo dos del libro de Eric Gamma [ G ~ ~ ~que
de documentos, mejor conocido como procesador de texto. De hecho, los criterios de
diseño tomados de dicho capitulo son casi idénticos. La diferencia está en la funcionalidad
de SOODA, que mucho dista de ser un procesador de textos para enfocarse al modelado
visual de sistemas orientados a objetos. Lo mismo ocurre para InverSOODA, pues su
interfaz gráfica de usuario y su estructura interna de documento están basados en SOODA.
A partir de que en SOODA se identifica un caso típico de diseño que involucra una
estructura de documento, se aplica el patrón de diseño Composite. Aunado al aspecto
anterior, está el recorrido de dicha estructura por medio de objetos Iterator. Es decir, los
datos de los diagramas están almacenados en una estructura de datos que puede ser
recorrida de vanas formas. Además, se utilizó experimentalmente el patrón de diseño
Visitor para efectuar acciones específicas durante el recorrido en cada nodo de la estructura
Composite.
InverSOODA utiliza diferentes objetos visuales para desplegar los diagramas de clases:
rectángulos, líneas, flechas, texto. El usuario de la aplicación utiliza estos elementos
visuales para conformar sus diagramas, o bien realiza ingeniería inversa, lo cual trae como
resultado los diagramas de clases con los objetos visuales correspondientes al diseño del
código. ¿Cómo se tratan internamente estos objetos visuales?, ¿Cómo hacer para que un
objeto visual llamado Flecha tenga su correspondiente objeto en el diseño de la aplicación?.
Estas dos respuestas aforíunadamente ya tenían resultados desde SOODA IPdo1. Pero,
¿cómo hacer que un objeto parser generado con ANTLR pueda manejar transparentemente
un objeto Flecha a manera de un objeto más abstracto denominado Grafico?, o, ¿cómo
hacer que un objeto Diagrama derivado de Grafico se trate igual que los objetos tipo
Grafico que contiene?. La repuesta a estas preguntas es utilizar algún tipo de estructura de
datos para representar jerarquías de objetos todo - parte. El patrón de diseño Composite
permite tratar los objetos dentro de este tipo de jerarquías uniformemente y casi siempre
vienen asociados los patrones de diseño Iterator y Visitor para hacer recorridos y acciones
variantes cuando se visita cada nodo de la jerarquía de objetos compuestos.
3.4.3.2 Aplicabilidad
A) Composite
d
2) Se quiere ignorar la diferencia.entre composiciones de objetos y objetos
individuales y trat r ambos tipos uniformemente.
1
B) Iterator
I) Acceder el conten'do de un objeto agregado en estructuras Composite (o
7.
simplemente en li tas o vectores de objetos) sin exponer la representación
interna de dicho objeto.
2) Se quiere múltiples formas de recorrido de listas o vectores de
objetos..
uniforme para realizar los recomdos (iteración
polimórfica).
C) Visitor
Una estructura de Composite contiene muchas clases de objetos con
interfaces quiere efectuar operaciones en dichos objetos que
t
dependen de su imp ementación concreta.
'k
Se necesita efectua, muchas operaciones o acciones sin relación alguna de
objetos contenidos n una esmictura de datos,' y no se quiere modificar o
extender la impiemehtación de dichos objetos con las operaciones o acciones
directamente. El p h n de diseño Visitor mantiene estas operaciones
encapsuladas en ud objeto aparte y sabe llevarles la acción de dichas
operaciones a los odjetos agregados en la estructura de datos, por medio de
un mecanismo o double-dispatch p r n 9 5 ] .
18
3.4.3.3 Colaboraciones
La Figura 3.4 muestra al patrón de diseño Composite junto con los otros dos patrones
descritos en esta sección2.
I'
Figura 3.4 Diagrama de clases con los patrones de diseño Composite, Iterator y Visitor
embebidos en la arquitectura de InverSOODA.
Enseguida se describen las colaboraciones de las clases involucradas en los tres patrones en
cuestión:
Composite:
Algunas c l a s s del código fuente sc omiten por cumtiones de Sspacio, pero aparecen las más importantes.
' Tomando cn cuenta que los objetos del patrón Composite pueden ser simplcs o compuestos. para lor primems se crea por dcfceto u?
objeto ltirator que itera en el vacio, caso contrario para los objetos compuestos, que pueden crear un objeto ltcrator a la medida de sus
ePtNeNmS de datos.
46
-
.- - - . - . - . -
..)
~
*'+.
CAPITIJLQ3: ELMODELO
CONCEPTUALPEL SISTEMA , ASPECTOS DE DEERo A osmos
I. 47
CAF’fTULO 3: E L M O D E M CONCEPTUAL DEL SISTEMA
Iterator:
Visitor:
48
puntero asociado con cierto objeto en la estructura de datos.
3.4.3.4 Consecuencias
CAPhULO 3: EL MODELO CONCEPIUAL DEL SISTEMA
2. El uso de templates de C++ para parametrizar objetos Iterator permite mantener una
relación con la clase CGrafico y todos sus descendientes: Un objeto Iterator siempre
devolverá un puntero a CGrafico cuando se encuentre recomendo un objeto
compuesto y esto supone una ventaja cuando se llaman solamente los métodos de la
interfaz de CGrafico. Sin embargo, cuando se necesita saber con exactitud qué clase
se está obteniendo desde la estructura de datos, entonces es necesario recurrir al
RTT?, o a las macros de la MFC (RUNTIME-CLASS), o bien al uso de objetos
Visitor.
2. Los objetos Visitor pueden ir acumulando valores estado, que de otra manera
tendrían que estar pasándose como argumentos en los métodos que efectiian el
recorrido de estructuras Composite.
4. No es fácil añadir una nueva clase concreta Composite que responda a los objetos
Visitor pues se tendría que añadir un método virtual para cada uno de dichos objetos
Visitor. Esto podría implicar un gran esfuerzo si ya existen numerosas clases
concretas derivadas de CVisitor.
3.4.4 Usa del patrón de diseña Builder cama base para construir el diagrama de clases
3.4.4.1 Motivación
50
-
I
La principal consecuencia de a construcción asíncrona de un diagrama, es que impacta
de manera directa en el diseño ¿e los mecanismos que responden a eventos asíncronos.
I
Hablando en términos generales, la solución más común a la construcción asíncrona de
diagramas inicia con el procesamiento de información tomada directamente desde eventos
de ratón o de teclado.
Eventos aslncronos
.I
1
Por otra parte, la construcción del diagrama de clases visto desde un proceso de
ingeniería inversa es síncrono. La Figura 3.6 ilustra dicho proceso: se puede visualizar la
creación inversa como una máquida constructora, que asciende a través de un árbol
sintáctico de derivación sincronizaddo la toma de información obtenida en cada hoja o
nodo intermedio del árbol, desde sintácticos o de acciones semánticas. La
información necesaria para realiza inversa viene entonces desde un flujo
síncrono de tokens, que termina con un carácter EOF en el nodo raíz del árbol
sintáctico.
Obieto Parser
Código Area de Aplicaclón de SOODA
fuente
-
Infomacdn sincrona
desde acciones
semanticar
88888
O
Construcción del
O
"
diagrama de clases
Representación Visual
3.4.4.2 Aplicabilidad
I ) El algoritmo para crear un objeto complejo debe ser independiente de las partes que
conforman el objeto y de cómo se ensamblan.
2) El proceso de construcción debe permitir diferentes representaciones para el objeto
que se construye.
52
CAP~TULO3: EL MODELO ASPECTOS DE DISEROORIENTADOA OBJETOS
h
diagrama de clases de U M L co las actuales clases involucradas en el patrón de diseño
Builder embebido en la arquitecdra de InverSOODA.
Figura 3.7 Diagrama de clase UML del patrón de diseño Builder embebido en la
arquktectura de InverSOODA.
I
3.4.4.3 Colaboraciones I
9
7 .
CInverSoodaDiagramaBuild r. Es el objeto cuyos métodos construyen el diagrama
de clases de manera síncrona, el objeto TinyCPPParser guía el proceso de
53
C A P ~ J L3:O EL MODELO CONCEFTJAL DEL SISTEMA
.
hacia dichos métodos.
,:i
por medio de acciones semánticas controla el protocolo síncrono de construcción
del diagrama de clases, apoyado por el objeto CInverSoodaDiagramaBuilder.
Y
r n a a i r c n dlagama I I
I I
J<
~ OnBvllonlnplnv
_____
CrearMaIodo
Crsadlrlbulo
___- -
CraarCLiSs
Amadir en d l a g r s m i
I
I
3.4.4.4 Consecuencias
Otra consecuencia del uso del patrón de diseño Builder radica en que se obtiene un
control más granular del proceso de construcción del diagrama de clases, respecto a la
construcción de golpe que proveen otros patrones de diseño de creación como el Factory
Method [Gam951 o el Prototype [ G ~ ~ ~El
s I patrón
. de diseño Builder permite controlar paso a
paso el ensamble de las diferentes partes que conforman un objeto diagrama y por
consecuencia de la esmictura interna de este último.
54
.* ,
I
CAPhWLO 3: ELMODELO
!
CONCEPTUAL DEL SISTEMA ASPECTOS DE DISENO ORIENTADO A OBIETOS
3.4.5 Uso del patrón de diseño Command para eliminar dependencias entre la clase
documento y la clase vista
3.4.5.1 Motivación I
capacidad de
El esquema de
de evento con algún
que se le dé al método
implícita del identificador de
evento. Por gráfica de usuario, se entra en el
ciclo clásico de se selecciona un método específico
de un objeto manejador de intrinzado mapeo de mensajes de
Microsoft Windows. En MFC, lo común es que los objetos vista respondan a
eventos generados desde barras de scroll y barras de herramientas,
mientras que el los elementos Lie la barra de menú.
55
CAF'hVLO 3: EL MODELO CONCEPTUAL DEL SISTEMA
. .
3.4.5.2 Aplicabilidad
3.4.5.3 Colaboraciones ,
La gran diferencia entre la estructura original del patrón Command propuesta por Gamma y
la adaptación que se realizó en InverSOODA consiste en que no necesariamente existe un
objeto receptor ni otro emisor. CVista hace las veces de receptor e invocante pues no existe
el concepto puro de objeto invocante en el mapeo de mensajes MFC, mas bien se manejan
los identificadores constantes al estilo IDBUTTONl, ID MENU ITEM. Puesto en otras
palabras, no se pueden mandar como parámetros objetos command en métodos dentro del
mapeo de mensajes MFC, para ajustar a la medida del patrón Command en la arquitectura
documento-vista, al menos no de manera trivial. No obstante, sí se logró implementar
parcialmente el patrón Command al diseñar objetos que colaboran con el objeto Vista para
tomar la responsabilidad de atender a los eventos de usuario.
Concretamente, existe una jerarquía de objetos Command; una clase abstracta más una
clase concreta por cada tipo de evento de ratón que maneje la clase vista. En la Figura 3.9
se aprecia cual es la vista estática de las clases involucradas con el patrón de diseño
Command.
56
CAPhlJLO 3: EL MODELO CONCEPTUAL DEL SISTEMA ASPECTOS DE DISENO
ORIENTADO A OüJETOS
CCommmd -- - - --- - - -
E@mla,() <-----.-.-------
((depends >>
OnBunonDom ()
.. ~ ~.
No es la intención de esta tesis proveer un tutorial sobre el manejo del ANTLR Sin
embargo, se considera prudente y puntual mostrar al lector la manera básica con la que se
especifica la creación de un analizador con la herramienta ANTLR. De tal suerte, se
ayudará en la c.omprensión global de las siguientes secciones y particularmente al uso de
acciones semánticas como mecanismo clave de la ingeniería inversa.
1. Identificación de gramática
G = ( N, T, So, P ) ,
donde :
N = ( A, B , C )
T = ( a , b, c )
so = s
= ( s + ABC, A + aA. A + a , B -+ b B , B + b , c -f ac, c -fC )
58
2. Escritura de la gramática bajo las reglas de ANTLR, dentro de un archivo de texto:
/ * Archivo gram */
header
B :
I
bB
b { printf
i
(I "b" 1 }
c : cc
I c { printf (
i
/ * fin de archivo
59
CAPiTULO 3: EL MOOELO CONCEPTUAL DEL SISTEMA
El lector notará que también existen otros elementos dentro del archivo ejemplo como
comentarios estilo C / C++, algunos bloques encerrados entre llaves, entre otras cosas. Los
bloques encerrados entre llaves que preceden el caracter de cierre de producción gramatical
‘;’ son las acciones semánticas. Por ejemplo:
B : bB I b { printf ( “b” ) 1 ;
Cuando el símbolo no-terminal ‘B’ derive en el símbolo terminal ‘b’, imprimir en salida
estándar el carácter ‘b’.
Las muestras se obtienen de acuerdo a reglas que definen el contenido de las muestras.
60
CAPÍTULO 3: E L MODELO CONCEPTUAd DEL SISTEMA LOS ANALIZADORES DE CODGO F UENTE
I
mencionar que el analizador Béxico de InverSOODA reconoce muestras para un
vocabulario parcial del lenguaje Cb+.
En la Tabla 3.1 se enlistan las muestras y los correspondientes lexemas que permiten
reconocer las muestras léxicas d interés para un proceso de ingeniería inversa con la
herramienta InverSOODA: I
Enseguida se muestran una serie de ilustraciones con' la representación de las reglas que
permiten al analizador léxico reconocer las muestras listadas en la Tabla 3.1,
CAPITULO 3: EL MODELO C ONCEPTUAL DEL SISTEMA
La Figura 3.1 I muestra el autómata que define la regla para reconocer las palabras
reservadas de C++ de interés. Se reconocen las palabras reservadas que definen tipos
enteros, de punto flotante, booleanos y sin tipo; cláusulas de selección del tipo i f / else;
repetición del tipo while;y, palabras reservadas clave para definir tipos de datos abstractos:
class, struct y union, con las palabras reservadas que definen alcance: public, private, y
protected.
ini
62
CAPiTULO 3: EL MODELO CONCEPTUAL DEL S IS TEMA DE CODIGO FUENTE
LOS ANALIZADORES
Caracteres
en blanco \t
I '
\n
\r
Por su parte, tanto la Figura 3.13 como la Figura 3.14, ilustran los autómatas que
reconocen los comentarios clásicos de C++. La finalidad de reconocer comentarios es la de
discriminarlos. Sin embargo, en el trabajo de Biggerstaff (ver Sección 1.1.2 del capítulo 1),
el tratamiento sofisticado de comentarios en procesos de recuperación de diseños puede
jugar un papel interesante. Desgraciadamente, no está dentro del alcance de este trabajo,
investigar más a fondo la importancia de los comentarios en la recuperación de diseños que
tengan que ver con el diagrama de clases o del diseño detallado.
E
Comentarios de
63
' CAPiTULO 3: E L MODELO CONCEPTUAL DEL SISTEMA 'I
,I
La Figura 3.15
muestra un conjunto ( Paréntesis izquierdo
de caracteres simples )
reconocidos con los Parbniesis derecho
autómatas de la (
misma figura.
)
Dichos caracteres
simples se utilizan
cotidianamente en la *
codificación de
programas en C++, -
aunque distan de ser
la totalidad de
caracteres simples que
pueden considerarse
como muestras. Para
el objetivo de este
proyecto sólo fueron
los necesarios.
64
CAPiTULO 3: EL MODELO CONCEPTUAL DEL S ISTEMA ' DE CODIGO F UENTE
LOS ANALIZADORES
I
Caracteres de
como cadenas literales son
escape englobados como muestras
en el análisis léxico,
ilustrados en las Figuras
3.16 y 3.17. Este tipo de
cualquier otro carácter muestras son un tanto más
menos \
complicadas para el análisis
Caracteres léxico debido a que pueden
literales
contener caracteres que a su
vez se consideran como
Figura 3.16 Autómata reconocedor de caracteres literales. caracteres simples.
Caracteres de
Caracteres de
I \ cualouierotro carácter l. / /
La Figura 3.18 tiene ilustrado el autómata que reconoce las secuencias de escape. Estos
caracteres especiales también se consideraron puesto que pueden verse como un
subautómata de los autómatas de las Figuras 3.16 y 3.17 anteriores.
65
~~~ ~~ ~
de escape
It
'I
Figura 3.1 8 Autómata que reconoce caracteres de escape.
I/
Para poder reconocer tanto identificadores como números enteros; es crucial identificar
digitos. Entonces, se puede ver como un subautomata el dibujo de la Figura 3.19 al
enfocarse tanto hacia el autómata de la Figura 3.20 como al autómata de la Figura 3.21.
I/
8
I1
6
4
I
2
O 11
1
5 I1
66
I
+-?t
proceso de ingeniería inversa, debido que
normalmente un identificador representa el nombre
de clases, de variables y de métodos o funciones. Digito
Letra
Digito
I
Identificador
II
Digito
Una vez que las muestras son aceptadas o reconocidas por el analizador léxico (ver Sección
3.5.2) el segundo paso en la recuperación del diseño desde código fuente es entender la
estmctura de las oraciones del lenguaje C++. El analizador sintáctico de InverSOODA
verifica que las muestras obtenidas ppr el analizador se encuentren dentro de la estructura
sintáctica del lenguaje C++ pero, además, realiza a la vez el análisis semántico que a la
postre es la clave de la ingeniería inversa propuesta en este proyecto.
61
CAP¡TULO 3: E L MODELO CONCEPTUAL DEL SISTEMA I!
I/
El hecho de construir un analizador sintáctico para todo el espectro de producciones
gramaticales es de una complejidad inalcanzable para un proyecto de las dimensiones de
j
este trabajo. Sin embargo, se pudo identificar un subconjunto de la gramática lo
suficientemente completo para traducir oraciones de C++ a diagramas de clases en C++.
I)
Además, la simpleza y naturalidad con la que se puede definir enjun archivo de texto la
I
especificación gramatical del lenguaje (ver Sección 3.5.1), permite ajustar casi a la
.I
perfección los esquemas de traducción STDS. ANTLR permite utilizar acciones semánticas
intercaladas en las producciones gramaticales que en InverSOODA sirven para controlar la
<
traducción. t
111
68
- .- .......
i
. .................................................................................... . . . . . . .
Esquema de traducción entre el lenguaje C++
y diagramas de clases del UML
1
i
sección 1. Programa
--
-_
i
~cZi&nT~aZiEii- rAc,;ones semánticas i
l .__.___-,
1.1 UnidadDeTraduccion => declaracion EOF
1 1.la. Recorrer un vector con las
~
11
~
r
-..-~--~-..__._I-I I___
declSimple=> secDeclEsp
......................
........ ; .... ... -
-Ir--- -
.... ... - ~-
[ -
. .
.''' deciSimple =7 ;
.................................................... - ..
I If3'secDeclEsp => especDecl
..
I -
.
I IV.4 especDecl
- => especTipo
rN.5 especTipo => especClFe ___
-r---
I
-
-
-
[
,I" . . . . . .especTipo . . . . .especSimpleTipo
. . . . . . . . . . . . . . . . .=> ................ .............. r-- ..... .
-
-
.......... ...
especTipo => especElabTipo
-
........................................................ ... ...... I
.,4_..- ...... ....................... ... ...........
I IV.6 especSimpleTipo => nombreTipo . a Verificar si el nombre del tipo
I
I¡ ............ .................................
especSimpleTipo => tipoFlotante
.i1 corresponde a una agregación.
.... . . . . . . . . . . . . . . . . . . . . . .~.
-
.......................................
- i.-.
"'
Tabla 3.2 Esquema de traducción entre e l lenguaje C++ y diagramas de clases del UML
69
CAPiTULO 3: EL MODELOCONCEPTUAL DEL SISTEMA I1
I/
7- ....
Esquema de traducción entre el lenguaje C++
.................
y diagramas de clases del .UML
..........
(continuación...)
. . . . . . . . . . . . . . . L. . . . . . . .
., ...........
Producción gramatical "'['Acciones semánticas
.................................................................... ......................
-
i"IV.7 especElabTipo => claveclase
.......................
1 iV.8 nombreTipo => Identificador
. . . . . . I-'--
. . . . . ,'4BAimac.e .... .... ..
nar el nom'bre del ldentificador
:
...................................................... ...........I.
I como el tipo
............................ .-~...> .....
I IV.9 especFunc => inline -
................................................................ ..... . , . , . . ..................
i especFunc => virtual
~... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
'1 . . . . . . . . .~ . . . . . . .
-
. . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ... i.......
; Secci6n V. Declaradores
. . . . . . - . ~ ~ . .. . . . ............ ...
i V.¡ IistalnicDecla => IistalnicDecla, decllnic /'''''''.' -
........................................... .................. ...............
"j -
.
r--
V.2 decllnic => declarador
.-____I__ -. . -, ._ ._II.._._.__..._____._ .
; V.3 declarador => exprld ( ) -
:
-- -
I declarador => exorld I -
- !
/I
r ..~
.~. ~
,
.......... ._ ", . . . . . . . .
~~8cecDeclEspMetodoVirtual => virtual -11
-especTipoRetFunc inline ........................................................................................................... I ~-
V.9 secDeclEspMetodoSimple => -
r-
especTipoRetFunc inline
--- I/
r-
-especfunc -"
._..________.._-._____---....I_.__-____.-
secDeclEspFunc => especFunc -
esDecTiooRetFunc
I----
........................................... ..,.. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
..............
especTipoRetFunc => void
, ................. ...,. ..
I---' .... .
.
..
- ii
I/
...................................
Tabla 3.2 Esquema de traducción entre e l lenguaje C++ y diagramas de clases del UML
(continuación.. .)
4
70
CAPiTULO 3: EL MODELO CONCEPTUAL DEL SISTEMA LOS ANALIZADORES DE CODIGOF UENTE
1
,
~ Producción gramatical 1 Acciones semánticas
i 6a.la Crear la figura clase en base a la
_______.I" .
I
.... ...................................... i
especMiembro =>.especAcceso : . -
I especMiembro
~
j
-- ................... ., .. ., ........ ................................... . ~ .,. . . . i
Vla.5 declaracionMiembro => : 6a.5a Establecer los métodos de la clase ¡
defFuncMiembro ; temporal en base a los demás datos ~
I
__ temporales
I
!
....................... ...... ______.___ ..,...... ..............
~
i
i temporales
"-
i
declaracionMiembro => 6 a . k Establecer los atributos de la clase :
especSimpleTipo temporal en base a los demás datos
temporales
1 IistaDeclMiembro ;
r declaracionMiembro => ;
...................................................
r-,.. -
.....................................
1
-
....
/ ~ ¡ ~ ~ s t a D e c l M i e m b=> r o declaradorMiembro
...................... ................. ...
-
.
1 declaradorMiembro
............................. . I ........................ ..,. .........
I-
1
lVla.7
. . . . . declaradorMiembro
....... .- -
. . . . .declarador
. . .=> ... , . . . . . . . . . . -.' -........................... ................................. ,
Tabla 3.2 Esquema de traducción entre el lenguaje C++ y diagramas de clases del UML
(continuación ...)
71
CAPiTULO 3: EL M ODELO CONCEPTUAL DEL SISTEMA I/
temporal
........................ .......... .........
especAcceso => public 6b.2b Almacenar public p r n o el acceso
_-
~
temporal
..._......__._._I___-.I-.-. .
especAcceso => protected 6 b . 2 ~Almacenar protected como el a c c e s o :
i
1
_--.I_-_ ____.-- temporal ~
.... ._l__ll_-_ ')
I
i
Sección VII. Reglas de producción para tipos de datos
tipo temporal t
r-~-
I
.....
tipoEnteroSinSigno
. -
.
-
.
.
-.
I
.
~
- _
unsigned long int como el
.. .- -~
.............
i1 i'
tipo temporal .. .
........................................... ...............................
ji
L .
1 I1 ~
--I
7.5b Almacenar signed char'como el tipo
_I___ _---_I
i temporal i
_.____._____.__r.l-_____..
1 I
<_ -t
j
................................... ......................... . -.
....................................
.
:, Tabla 3.2 Esquema de traducción entre el lenguaje C++ y diagramas de clases del UML
(continuación ...)
72
CAPiTULO 3: EL M ODEL O CONCEPTUAL DEL SISTEMA LOS A N A L I Z A D O E S DE CODICO FUENTE
Figura 3.22 Traducción entre una clase en código fuente hacia una figura.
UoidadDeTraduccion
6a.la 6a.lb 1 1
1
Dedaraci6o
c cabeceraclase [ espechniembro j
1
dedSimple
1
6b.2b w1 1 6a.5b
I
defFUnCMiembiO
I 1
secDedE~pec
1
e~pecDecl
rnetcdoSimple
1
eSpeCTipo
1
secDelEspMelcdoSirnple declarado
especc1ase-
IipoEnIer~
1
declaradorMiernbr
1
1
BspecTipoRetFunc
1
rfi
exprld ( J,
2.2
1 1 2
tipocaracter
Idenüficador
char
73
_-
I
6a.3 Se traduce a
Crear una
O01 clase temporal
I
6b.2b Se traduce a
Almacenar public
o n e temporalmente
I
7.311 Se traduce a
Almacenar int
u n o temporalmente
I
2.2 Se traduce a
Almacenar “x”
,on> temporalmente
I
6a.5~ Se traduce a
Establecer un nuevo
atributo en clase
temporal
e
7.5~
1
Se traduce a Almacenar char
temporalmente
I
2.2
Se traduce a Almacenar “f’
temporalmente
I
6aSb
Se traduce a
Establecer u n nuevo
10- o método en clase
temporal
I
6a.la
I I
Se traduce a Crear la figura Clase
e
con el identificador
6a.la 10- que sigue a la
palabra class y con +x:’T
los valores de la
clase temporal
+ f(): char
74
. . . .. . . - -. . ... .. . -
y’*‘1..
_.~. ~~
I
.........,
Proceso de ingenieria
Diagrama ........
<< produce >>
de clases
i
inversa para obtener el
diagrama de clases del
hlormac¡un sobre
especifico+ la
clase que los
Sintáctico Semántico
1-
i::::
I El usuario d e la aplicación
tiene la responsabilidad de
.y*. llamar a InverDDVi desde la
-..-..,. interíaz de InverSooda para
e-, obtener el diagrama de
Warnier de cada método.
- :”.-
Despliegue independiente del diseno
t detallado del método de’clase al que
se le aplique ingenieria inversa con DOVi.
~~
InverDDVi toma el nombre del método del que se requiere obtener el diseño detallado
para iniciar su propio proceso de ingeniería inversa. Los nombres de los métodos
específicos a una clase están almacenados en un vector de cadenas o strings en dicha clase.
La interfaz gráfica de usuario de InverSOODA permite realizar la llamada al módulo
InverDDVi. Los detalles del cómo se realiza esta llamada y muchos otros aspectos de
implementación de InverSOODA se encuentran en el siguiente capítulo de este documento.
I 75
CAPiTULO 3: EL MODELO CONCEPTUAL DEL SISTEMA
3.7 Referencias
[Ant031 ANTLR. ANother Tool forLanguage Recognition.
htto:l/antlr.orql I 9 Febrero de 2003.
[Dan021 Daniels John. Modeling with a Sense ofpurpose. (EU.: IEEE S o h a r e , EnerilFebrero de 2002) pp. 8-10
[Gam951 Gamma Erich et al. Design Patterns-Elements of Reusable Object Orie+ed Software, (E.U.: Addison-
Wesley-Longrnan.1995).
I/
[ParüO] Parra Rarnirez. Isaac A. Modelado Visual Orientado a Objetos. (Tesis de Mabstria, CENIDET. Cuernavaca.
Morelos. Mexico. Diciembre del 2000) pp. 5.8, 5.4.
ll
[Ctl91] Slroustrup Eijarne. The C++ programming language. (New Jersey, EU!: Addison-Wesley Publishing
Company, Segunda Edición, 1991) pp. 614-616.
'!
76
Capítulo 4
4.1 Introducción
4.2 Manejo de la interfaz gráfica de usuario
4.3 Implementación de los analizadores de código fuente
4.4 Pruebas
4.5 Referencias
INTRODUCC~ON
CAPiTULO 4: DESARROLLO Y PRUEBAS DE L A HERRAMIENTA
4.1 Introducción
La interfaz gráfica de usuario (GUI por sus siglas en inglés) de InverSOODA es parecida
de su antecesor SOODA, excepto por algunos cambios en las barras de herramientas y de
modelado: un nuevo botón para la primera, como se muestra en la Figura 4.1:
I'
El
Figura 4.1 Cambios en las barras de modelado y de herramientas de SOODA
79
C A P h U L O 4: DESARROLLO Y PRUEBAS DE L A HERRAMIENTA
11
N
¿Cuándo es posible disparar los procesos de ingeniería inversa?. En
cualquier momento que el usuario lo desee, sólo debe tener cuidabo de ,PU,same,
guardar !os diagramas con los que estuviera trabajando previo a! llamado de la
recuperación de diseños.
CAPiTULO 4: DESARROLLO Y PRUEBAS DE LA HERRAMIENTA MANEJO DE CUI
Una vez que se pulsó el botón de la barra de herramientas para iniciar un proceso de
ingeniería inversa aparecerá un cuadro de diálogo preguntando si se quiere iniciar un nuevo
proceso de ingenieria inversa, como se muestra en la Figura 4.3.
Figura 4.3 Cuadro de diálogo que pregunta si se inicia otro proceso de ingeniería inversa.
11
La intención de este diálogo es la de prevenir al usuario final de que está por comenzar
un proceso de ingeniería inversa y es probable perder los datos de diagramas en uso. Si el
usuario pulsa el botón del diálogo etiquetado con un Sí, entonces InverSOODA procederá
con un proceso de ingeniería cuyo resultado borrará el estado volátil de cualquier diagrama
que haya estado activo justo antes. Caso contrario, InverSOODA continúa con el proceso
de recuperación de diseños sin destruir el diagrama anterior'.
' En versiones posteriores de la herramicnia se propone mejorar esla interacción con algún mecanismo que permla cancelar l a accibn
misma de iniciar procesos de ingenieria invcrsa.
81
CAPITULO 4 DESARROLLO Y PRUEBAS DE LA H ERRAMIENTA I1
,I
Figura 4.4Cuadro de diálogo para seleccionar el archivo que contiene e1 código fuente en
C++ sobre el cual se aplicará la recuperación de diseño.
Una vez que se selecciona el archivo (uno sólo), entonces comienza el proceso de
análisis del código fuente contenido en dicho archivo.
,I
Cuando se obtiene con éxito el diagrama de clases del UML, entonces termina el
proceso de ingeniería inversa, y el usuario está facultado para manipular a su libre
albedrío el diagrama. Por ejemplo, puede manipularlo gráficamente para acomodar las
'
figuras, acceder a los datos de'las clases y modificarlos, agregar nuevas c'lases y relaciones.
.. En suma, puede iniciar un proceso de ingeniería directa como con cualqdier otro diagrama
de la herramienta. ¿Qué hay del diseño detallado de las clases recuperadas?. El proceso de
, ingeniería inversa para recuperar el diseño detallado de métodos se expliba en la siguiente
sección. ,I
CAPiTULO4: DESARROLLO Y PRUEBAS DE LA H ERRAMIENTA M ANEJO DE GUI
Figura 4.5 Cuadro de diálogo:que indica al usuario la recuperación con éxito de un diseño
desde código fuente.
l
. , . .n . . r
;
'enana "8
Ed>* yer
r . m. . . . F -., sp w u .! - .
"! .. '. -x :*r, .. dBI
A
>IS181&lQlCAl5 1 PlY?lOl <I1
4" =*-
De acuerdo con la figura anterior, se observan los siguientes elementos dentro del
diagrama de Wamier obtenido por InverDDVi: el segundo triángulo 1 representa una
llamada a procedimiento de nombre fl, acotando otros elementos con la primera llave;
enseguida, se encuentra un ciclo controlado por la variable i; después, se representa un
84
CAPiTULO 4: D ESARROLLO Y PRUEBAS DE LA HERRAMIENTA MANEJO DE GUI
estatuto condicional que a su vez se encuentra dentro del acotamiento de la llave del ciclo,
la condición evalúa la expresión f < 100; y, finalmente, una condición negada. El código
correspondiente al diagrama desplegado en la figura anterior se encuentra almacenado en
un archivo de nombre A.cpp y es el siguiente:
#include "a.h"
int A : : El O
(
int i; I1
while ( i )
i
if ( i < io0 )
printf ( "Actual valor % d " , i ) ;
else break;
1
I
Si se observa el trozo de código anterior, se puede notar que la función no es de tipo
global (al estilo C), sino más bien una implementación de un método llamadofl, que es
miembro de la clase denominada A . Queda en el aire la pregunta obligada para esta sección:
¿Cómo accionar desde InverSOODA la recuperación del diseño detallado de un método de
una clase en particular?. La Figura 4.7 ilustra gráficamente esta cuestión seguida de una
breve explicación en la página siguiente.
I'
Figura 4.7 Instantánea de la'interfaz utilizada cuando se acciona la recuperación del diseño
detallado de un método en particular.
85
I1
CAPiTULO 4: D ESARROLLO Y PRUEBAS DE LA HERRAMIENTA
8)
Una vez que se recuperó un diagrama de clases es factible la fecuperación del diseño
detallado de métodos de clases siempre y cuando alguna de las clases del diagrama recién
recuperado contenga métodos. Se selecciona el primer icono de la barra de modelado (ver
figura 4.l),la cual corresponde a la figura apuntador. Enseguida selselecciona la clase que
contiene el método de interés pulsando el botón derecho del ratón.'hEntonces aparecerá un
cuadro de diálogo con varias pestañas. Se selecciona enseguida la pestaña etiquetada como
métodos. En, la pestaña denominada métodos aparece una región que despliega un listado
con los nombres de los métodos miembro.de la clase seleccionada! Se pulsa de nuevo el
botón derecho del ratón posicionando antes el cursor sobre el método de interés. Acto
seguido aparece un pequeño menú con las siguientes opciones:
Insertar
.
9
1 Borrar
Modificar
1 Diseño
Es de especial interés la opción del menú anterior llamada Diseño; puesto que al pulsar
el botón derecho del ratón se activa la llamada a InverDDVi. Entoncds el usuario estará en
posibilidad de usar el InverDDVi para recuperar el diseño detallado del método que
seleccionó desde InverSOODA. I1
,I ,.
,I
o 3.4.4 Uso del patrón de diseño Builder como base para construir el diagrama de
clases
o 3.5.1 Creación de analizadores de código con ANTLR 1
I
86
I M ~ L E M E N T A C I ~DE
N ANALIZADORES
CAPITULO 4: DESARROLLO Y PRUEBAS DE LA HERRAMIENTA
LO anterior indica al ANTLR que concatene el prefijo TK- a cada muestra, Y que el
Lenguaje en el que se genere e\ analizador léxico sea C++.
o La sección tokens:
,
tokens
I
"int"; "char"; "bool"; '"float't;lldoublev; "voidt!; t!longu; nwsignedrr
"unsigned"; ushoS-t!. ! ) i f,! #"else";
. "while"; "class"; "struct";
"union"; "private!; "protected"; "public"; "inline"; "virtual";
1
El ANTLR permite, definir en una sección especial denominada tokens aquellas
muestras que explícitamente se definen sin utilizar derivaciones.
a) Protegidas. Reglas
I
que no interesan al analizador sintáctico.
protected
DIGIT : *'0'..'9'
87
CAPfTULO 4: DESARROLLO Y PRUEBAS DE LA HERRAM~ENTA
ID : ( ' ~ ' . . ' Z ' ~ ' A ' . . ' Z ' ~ '(- ~' )a ' , . ~ z ~ ~ ' ~ ~ . . ~ z ~ ~ ~ - ' ~ ' o ' . ,
ii
'I
La Tabla 3.2 del capítulo anterior define las reglas gramaticales que se especificaron en un
archivo para ANTLR de acuerdo a las reglas mencionadas en la Seccion 3.5.1. A partir de
dicha especificación se generó el analizador sintáctico. Los detalles de la implementación
dentro del archivo de especificación gramatical se enlistan a continuación:
header
(
#include <iostream.h> .I
#include "StdAfx.h"
#include "Clase.h"
#include "1nverSoodaDiagrarnaBuilder.h" ,I
1
Concretamente en el código anterior se añadieron los archivos i0stream.h para
manejo de salida estándar, 3dAfx.h para manejo de objetos básicos MFC, C1ase.h
que contiene la definición para objetos con la figura clase. Finalmente,
InverSoodaDiagramaBuilder.h,que es la definición del objeto/I que dirige la
construcción síncrona de un diagrama de clases.
88
.... .. I
.I(
.,*“~.t?p>
:..
Y PRUEBAS DE L A HERRAMIENTA
CAPÍTULO 4: DESARROLLO IMPLEMENTACIÓN DE ANALIZADORES
c l a s s T i n y C P P P a r s e r extends P a r s e r ;
options
I
importVocab=TinyC;
I I)
El analizador sintactico está definido dentro de una clase llamada
TinyCPPParser. A su ,hez, dicha clase hereda funcionalidad de un clase más
genérica llamada Purse;. La oración itnportVocub=TinyC indica al ANTLR que el
analizador sintáctico utiiliza un conjunto de muestras definidos en el vocabulario
TinyC. Dicho vocabulario se define previamente en el analizador léxico TinyCLexer
(ver Sección 4.3.1). ‘1
o Sección de código:
/ / Seccion de codigo
I
public:
CInverSoodaDiagramaBuilder* g e t B u i l d e r O ( r e t u r n b u i l d e r ; )
private :
CInverSoodaDiagramaBuilder * b u i l d e r ;
1
Justo después de la sección options de la definiciGn de TinyCPPParser se agrega
una sección especial delimitada solamente por un par de llaves que abren y cierran.
Es la sección que indica al ANTLR que el código ahí encerrado es particular a la
implementación del analizador. Específicamente, en la porción de código anterior se
declara como privado dh apuntador a objetos Builder (ver Sección 3.4.4), que son
los encargados de construir los diagramas de clases. También se define un método
miembro de la clase TinyCPPParser que sirve para recuperar el objeto Builder.
il
idhiocualificado : id : ID
I
builder->setCurrentNombre(id->getTextO.c-strO);
);
En donde, idNoCtialificudo es el símbolo no terminal a la derecha de la
producción; id es una &ueia específica de ANTLR, que hace las veces de variable
temporal para contener el texto de la muestra; ID es el token en que deriva el
símbolo terminal a la $emha y cuyo lexemu se almacena en la etiqueta anterior;
encerrada entre llaves está la acción semántica implementada por el .método
setCurreniNombre, propio del objeto builder agregado previamente en la clase
TinyCPPParser en la sección
‘t
de código; setCurrentNombre se parametriza con el
lexema de ID.
89
CAPiTULO 4: DESARROLLO Y PRUEBAS DE LA HERRAMIENTA
ClnverSoodaDiagramaBuilder
- mPrototipoClase : CClase'
- mCurrrentAcceso : CString
- mCurrrentTipo : CString
- mCurrrentNombre : CString
- mCurrentValor : CString
- rnCurrentParam : CString
- mCurrentNumAtributos : int
- mAtribAcceso : CStringArray
- mAtribTipo : CStringArray
- mAtribNombre : CStringArray
- mAtribValor : CStringArray
- mCyrrentNumMetodos : int
- mMetodAcceso : CStringArray
- mMetodTipo : CStringArray
- mMetodNombre : CStringArray
- mMetodParam : CStringArray
- mMetodValor : CStringArray
- mAgregaciones : CStringArray
- mHerencias : CStringArray
+ getDiagrama ( ) : CGrafico'
+ crearLinea ( ) : CGrafico' I1
+ crearRectangulo ( ) : CGrafico'
+ setHerencias ( ) : void
+ checkHerencia ( ) : void
+ setAgregaciones ( ) : void
1
+ checkAgregacion ( ) :void
+ getClase ( ) : CClase'
+ crearclase ( ) : CClase* I1
+ setMetodosClase ( ) : void
+ SetAtributosClase ( ) : void
+ resetMiembrosClase ( ) : void
+ setCurrentTipo ( ) : void I
+ setCurrentAcceso ( ) : void
+ cetCurrentNombre ( ) : void
+ setcurrentvalor ( ) : void i!
+ setcurrentparam ( ) : void
- ,resetMetodosClase ( ) : void
- resetAtributosClase ( ) : void
I
Figura 4.8 Métodos y atributos de la clase InverSoodaDiagramaBuilder usados en los
mecanismos de ingeniería inversa.
90
...<T
':'. .
?'R. ,, ., , ,*r-
~i
.............
mcurrentParam Almacenamiento temporal para 10spaiámetrosde
métodos. Cuando se concreta la identificación de una -.
clase se almacena en mMetodParam.
il . . . , ... -.. .
mCurrentNumAtributos Almacenamiento temporal que lleva cuenta del
número de atributos que se han identificado para una
entidad clase.
l. ............... ....... . . . . . .
mAtribAcceso Almacenamiento temporal en forma de vector que
almacena objetos tipo CString. Contiene la totalidad
de los accesos que califican a los atributos
kecuperados para una entidad clase.
1
rnAtribTipo Almacenamiento temporal en forma de vector que
almacena objetos tipo CString. Contiene la totalidad
de los tipos de los atributos recuperados para una
entidad clase.
Tabla 4.1 Papel de los atributos y métodos del objeto builder en el análisis semántico.
CAPiTULO 4: DESARROLLO Y PRUEBAS DE LA HERRAMIENTA
I1
-- -. 1
Tabla 4.1 Papel de los atributos y métodos del objeto builder en el análisis semántico.
(continuación ...) /I
92
11: 'si.cl
v"*r)+-.*."
Tabla 4.1 Papel de los atributos y métodos del objeto builder en el análisis semántico
.(continuación ...)
CAF'hlJLO 4: DESARROLLO Y PRUEBAS DE LA HERRAMENTA I!
'
-
.
-_
.
-.
_
-I
-
. ______I-
__
1 guardan información de los métodos de entidades
clase.
recetAtributocClace ( ) 1 Limpia los valores temporales de los vectores que
guardan información de los métodos de entidades
-.___-___ ~~
....... :.I..clase.
. . . . . . . . . . . . . . . . . . . ..~.
¡I
Tabla 4.1 Papel de los atributos y métodos del objeto builder en el análisis semántico.
(continuación...) !t
94
,~??,‘rutt”.‘* g . >*.
4.4 Pruebas
Es esencial mencionar que las pruebas realizadas son limitadas en ciertos aspectos
puesto que no se realizaron bajo una evaluación exhaustiva ni bajo un estándar de pruebas
de software. Por ejemplo, no se realiza un estudio de precondiciones ni poscondiciones que
permitan validar la totalidad ?e los valores iniciales del código sujeto a prueba ni los
valores de salida esperados.
No obstante, los valores objetivos que se manejan en estos casos de.estudio son la
correspondencia directa de las clases en el código fuente con las figuras tipo clase
obtenidas en el diagrama de Clases; la validez en la cardinalidad de relaciones de tipo
agregación y herencia; y, la validez en la cardinalidad, tipo, ámbito y nombre de los
atributos y métodos de cada clase recuperada. Con las observaciones antes mencionadas se.
presenta en las siguientes secciones los dos casos de estudio.
11’
Clase Strategy
. Atributos:
Ninguno
11
’ Esta prueba se realizó en colaborkión con el 1.S.C Manuel Alejandro Valdés Marrero, a quien quiero
expresar un sincero agradecimiento por su ayuda en este caso de estudio.
CAPfTULO 4: DESARROLLO Y PRUEBAS DE LA HERRAMIENTA
Métodos:
public: void Calcula (Contexto *ctW ) = O
public: double GetResult ( ) = O
Clase Contexto
.
I
Atributos:
I1 private: double valor
public: double Arreglo [ 10 ]
public: Strategy str
.
.I
Métodos:
I public: void lnteractua ( ) /I
public: void SetValor ( double dato )
public: double GetValor ( ) li
1
-
Clases Suma, Media y Desviación ( heredan de Strategy )
11
Atributos:
. Métodos:
private: double Resultado
J r- -----
mi*
I1
Figura 4.9 Diagrama de clases generado de manera asincrona por medio de la barra de
modelado de InverSOODA. 1
96
CAPITULO 4: DESARROLLO Y PRUE6AS DE LA HERRAMIENTA PRUEBAS
11
A su vez, el diseño detallado de cada uno de los métodos de las clases de la figura
anterior se creó con InverDDVi. Las siguientes figuras Y..
oárrafos describen más a detalle el
diseño e intención de los métodos de
cada clase.
1
b
para tomar valores desde la entrada
estándar y almacenarlos en un
str=new Suman II
PSC
arreglo. A partir de estos valores
almacenados se calculan secuencial-
str->Calcula[this] mente las siguientes medidas:
PSC
1) Sumatona
SetValor[str->GetResultOJ 2) Media aritmética
I1
3) Desviación estándar
.'
py."La
-..
Sumatoria es: "<<GetValor0
I
El proceso de cálculo para cada
una de estas medidas estadísticas
str=new Median implica hacer la llamada a los
PSC
métodos de un objeto Strategv en el
siguiente orden:
str->Calcula[this]
PSC
1) Calcula
i 2 ) GetResult
SetValor[ctr->GetResult~]
El valor de regreso de la
Pfl"La Media Aritmética e!: "<<GetValorO función GetResult se parametriza
\'
, en la función SetVaior del objeto
Cuntextu.
str-new Desviaciono Jj
PSC
Finalmente, se llama al método
str->Calcula[this] GetValor del mismo objeto Contexto,
para imprimir el resultado del cálculo
)I
PSC
en salida estándar. Aunque también
SetValor[str->GetResupO) se generó el diseño detallado de los
PSC métodos SetValor y GetValor de la
clase Contexto no se muestran en
.'.la
.
Desviación Estándar es: "<<GetValor[
41
alguna ilustración debido a la
simpleza de los mismos: sólo
Figura 4.10 Diagrama generado para la función ejecutan una instrucción.
Contexto :: Interachia
11
0.
97
1
CAPiTULO 4: DESARROLLO Y PRUEBAS DE LA H ERRAMIENTA I1
1
En el caso de objetos tipo Media, el método
Calcula tiene la intención de calcular la media
aritmética de los datos almacenados en el arreglo
int N=l O del objeto Contexto, pero utilizando la sumatoria de
PSC
dichos datos previamente calculada por un objeto
tipo Suma (recordar las instrucciones del método
double Surnatoria, rnedia=O Interactua de la Figura 4.10), r h l t a d o que a su
PSC
vez se almacena en la variable Valor del objeto
Contexto (ver Figura 4.12).
PSC
Surnatoria=cb->GetValor0 I '
98
!I
,,
~
.-
".: e,.* ' ,t "
inl N=10
PSC
medio=cb<->GelValorO
PSC
aux=m->Arreglo[i] - media
PSC
" Sumatoria+=aux*aux
PSC
dcsv=Sumaloria/[N-11
PSC I/
desv=sqrl[decv]
PSC
Resultado=desv
PSC
!!
Figura 4.13 Diseño detallado del método Desviacion::Calcula.
/ / Atributos
public:
double ~rregioiioli
strategy *st=;
private:
double Valor;
protected:
CAF'hLO 4: DESARROLLO Y PRUEBAS DE LA HERRAMIENTA
I
/ / Métodos
public:
Contexto0 ;
-Contexto ( 1 ;
void InteractuaO ;
void CetValor(doub1e dato);
double GetvalorO;
private :
protected:
1;
//#endif
/ / Atributos
public:
private:
protected:
/ / Métodos
public:
strategy ( ) ;
-Strategy( ) ; I/
virtual void Calcula(Contexto* ctX)=O;
virtual double GetRecultO=O;
private :
protected:
'!
1;
//#endif
/ / Atributos
public:
private:
double Resultado;
protected:
/ / Métodos
public :
Suma I ) ;
-suma 1) ;
void Calcula(Contexto* ctx);
double GetResultO ;
private :
protected:
100
CAPiTULO 4: DESARROLLO Y PRUEBAS b E L A HERRAMIENTA P RUEBAS
/ / Atributos
public:
private:
double Resultado;
protected:
/ / Métodos
public:
Media I ) ;
-Media ( ) ;
void CalculaIContexto' ctx);
double GetReSult O i
private :
protected:
/ / Atributos
public:
private :
double Resultado;
ptotected:
/ / Métodos
public :
DesviacionO ;
-üesviacionO ;
void CalculalContexto+ ctx);
double GetReaultO ; ;
private:
protected:
1;
//#endif
Strategy::StrategyO
I
//Código
I
' El c6digo fucnic en negritas fue sgrcgado o dercameniado de manera manual para qnc &te pudiera cornpilame y cjecularse.
Posteriomcnic, las implementaciones .fueron 'agrupadas cn un solo archivo ( caso1 s p p )julo con CI código clienlc para quc pudiera
realizarse la ingcnicna iwcma.
CAP¡TULO 4: DESARROLLO Y PRUEBAS DE LA HERRAMIENTA
11
Strategy: :-Strategy0
( /I
//C6digo
1
/ * Métodos de la clase. Código generado por InverSOODA * /
/ / #include "Contexto.h''
/ / Metodos de la clase Contexto
Contexto::ContextoO
{ h
ValorFO ;
ArreglollOl =ArregloliOI ;
//Código
) I/
Contexto::-Contexto0
í
//Código I
1
void Contexto::InteractuaO
I
/ / Código
for (int i=o; icio: i++) {
cout c < ',Valor"cci<c": 'I;
//Cbdigo
Valorxdato;
1
double Contexto::GetValorO
(
//Cbdigo
return Valor:
1
/ * Métodos de la clase. C6digo generado por InverSOODA * /
/ / #include -5uma.h"
/ / Metodos de la clase Suma
Suma ; :Suma ( 1
{
ReCultado=O :
//Código
1
Suma : ! -Suma ( )
{
//Código
1
void Suma::Calcula(Contexto* ctxl
(
102
CAPiTULO 4: DESARROLLO Y PRUEBAS DE L A HERRAMIENTA PRUEBAS
'11
//Código
double Sumatoria=O;
for (int i=ü; i<lo; it+) (
Sumatoriat-ctx->Arregloíil:
1 /I
ReSultado=SUmatOria;
1
double Suma::GetResultO
(
//Código
return Resultado;
I
/ / Media.cpp
/ * Métodos de la clase. Código generado por InverSOODA * /
/ / #include "Media.h*
I / Metodos de la clase Media
Media: :Media0
{
Resultado=O ;
//Código I
I
Media::-Media0
l
;/Código
I
void Media::Calcula(Contexto* ctxl
. -
.IICódiaa
int N=10;
double Sumatoria. media=O;
Sumatoria=ctx->GetValorO;
media=Sumatoria/N;
Resultado=media;
I
11
double Media::GetResultO
,(
//Código
return Resultado;
)
/ / Des"i*Eion.Cpp 8,
103
I)
aux-ctx->Arregioiil - media;
Sumatoria+=aux*aux;
1
desv.suma toria/ (N-11 ;
dew-sqrt idecvl ;
Resultado-desv:
)
contexto ctx;
il c t x . 1nteractuao ;
!!
ret"rn o;
I
Una vez compilado el código mostrado con anterioridad se puede correr la imagen
ejecutable creada. La Figura 4.14 muestra la pantalla de salida de dicha corrida con datos
arbitrarios. I1
Figura 4.14 Pantalla de salida en la ejecución del código generado con los mecanismos de
I/ ingeniería directa de InverSOODA. I/I1
104
CAPiTULO 4: DESARROLLO Y PRUEBAS DE LA HERRAMIENTA PRUEBAS
!I.
BDSys:
BDMenu:
“BDMenu es un programa escrito en lenguaje ‘C’ que funciona como cliente de las operaciones
que realiza BDSystem. La función’[deeste sistema es proporcionar al usuario un menu de opciones
para las operaciones que puede realizar el BDSystem”
El lector notará que se habla del lenguaje ‘C’ en las descripciones anteriores;
afortunadamente, el código fuente tomado para esta prueba no es precisamente el programa
en lenguaje C, sino el código! fuente producto del proceso de reingeniería descrito por
pnnozl; dicha reestructuración permitió contar con un conjunto de clases que tienen la misma
funcionalidad que el código original en C.
:I
Enseguida, se lista el código utilizado en esta pmeba’, seguido de una figura que
corresponde a su diseño recuperado:
’Aparecen en negritas las porciones de código que se alteraron para poder aplicarles eficazmente la ingeniería
inversa. Esto significa que algunas lineas están comentadas, o bien tiene partes modificadas, incluso el código
mostrado adolece de algunas líneas de preprocesamiento originales y presenta nuevos comentarios.
No es posible generar una imagen ejecutable a partir de este código fuente debido a todas las modificaciones
anteriores
1
CAPiNLO 4: DESARROLLO Y PRUEBAS DE LA HERRAMI ENTA
/. ll!.
............................................................................
using namespace BDMenu;
* class aStratl
.............................................................................. */
class aStratl
'1
(
protected:
unsigned VAR;
unsigned VALOR;
public:
virtual void AlgOritmODeInterfazO = O ;
*/
class Contexl
(
private :
astratl Strategy; / / *strategy;
public:
/*
contexio
{
>;*/
Strategy - NULL;
(
public:
void AlgoritmoDeInterfazO;
, .
1;
/..............................................................................
* using namespace BDMenu;
class cStr13
..............................................................................
f
*/
class cStrl3: public astratl
(
public :
void AlgoritmoDeInterfazO;
);
106
........ -
CAPhWLO 4: DESARROLLO Y PRUEBAS DE LA HERRAMIENTA PRUEBAS
107
CAF'h'WLO 4: DESARROLLO Y PRUEBAS DE LA HERRAMIENTA
/I
(
orivate :
protected:
public:
ned int CK;
,-BASE O
(
CK P O;
I;
*/
virtual void bdinicia0;
virtual int bdescb0; //unsigned int, unsigned intl;
11
virtual int bdescbw0; //unsigned int, unsigned int);
virtual int bdesca0; //unsigned int. unsigned int);
.I virtual int bdleeb0; //unsigned int);
virtual int bdleebw0; //unsigned inti;
virtual int bdleea0; //unsigned inti;
1;
/' .............................................................................
I * using namespace B u s y ~ ;
* class VA1
It */
class VA1: public BASE
(
private : I/
unsigned int VA; / / [30001 ;
protected:
public:
/*VA10
t
or
V A 1 0 (unsigned int v-VA130001)
VA130001 D v~VA[30001;
I*/
void bdinicia0;
int bdleea();//unsigned int VAR);
int bdesca()://unsigned int VAR. unsigned int VALOR);
);
private:
I unsigned int VE; / / 12001 ;
protected:
public:
I /*VE10
(1;
VBlluneigned int v-VBi2001 I
(
VB[2001 E V~VE~ZOOI,
I
"I
void bdinicia0;
int bdleebO;//unsigned i n t VAR);
int bdleebwO;//unsigned int GRUPO);
int bdescb(l;//unsigned int VAR. unsigned int valor);
int bdescbw();/./unsigned int GRUPO, unsigned int VALOR); 1; II
CAPiTULO4: DESARROLLO Y PRUEBAS D E L A HERRAMIENTA P RUEBAS
,
La Figura 4.1'5 es el diagrama de clases correspondiente al listado de código anterior,
recuperado con InverSOODA:
11
u
Reviredl ~~~ ~. ~~~ ~
__.
--
~.~L . . L 1
I1
Figura 4.15 Diagrama de clases recuperado con InverSOODA: despliegue las clases de
" BDSys y de BDMenu.
definiciones de clases.
- Comentar toda directiva de preprocesamiento.
- Reescribir toda línea de código que tuviera que ver con apuntadores, de manera
'i)
que se prescindiera de éstos.
- Comentar toda implementación inline.
- Comentar todo constructor.
- Reescribir toda Cunción con parámetros, de manera que se tuviera una versión
de la misma función sin parámetros.
Ii
109
CAP¡TULO 4: DESARROLLO Y PRUEBAS DE LA HERRAMIENTA
81
I1
Figura 4.16 Diseño detallado recuperado del método aStratl :: getnum().
I1
/ * ............................................................................. */
I / from aStratl.hpp: ex inline function t
int aStratl i: pidevar il
printf (Itdame el NUMERO de la variable : "i;
VAR = getnum i l i
/ / added
return 01
) '11
Figura 4.17 Diseño detallado recuperado del método aStratl :: pidevar ().
1 IO
CAPh'ULO 4: DESARROLLO Y PRUEBAS DE LA HERRAMIENTA PRUEBAS
. .
/ ^ ............................................................................. *I
I / from aStratl.hpp: ex inline f u k t i o n
int astratl i: pidevalo
I
printf("dame el VALOR de'la variable : ',I;
VALOR = getnum O ;
/ / added '!
return O ;
)
.,I
-1U-1
U*J
4
Fi&ra 4.18 Diseño detallado recuperado del método aStratl :: pideval 0.
/' ............................................................................. *I
/ { from aStratl.hpp: ex inline function
int astratl i: pidegrupo0
I
printf ("dame el NUMERO del grupo .. *I)
,.
VAR = getnum ii ;
/ / added
return O;
I
111
...
11
1
AlgoritmoDelnteríaz
d a d
ipide
I/
;/ cstr12 .cpp
void cStrl2 : : AlgoritmoDeInterfaz I 1
I
printf ('LEE ANALüGICO\ntO ;
pidevar ( ) ;
1
d a 2
A{ AlgoritmoDelnteríaz
2D a lb
$/ "LEE ANALOGiCO\n"
<. ,
1 pidevar I
I/
I!
I1
Figura 4.2 1 Diseño detallado recuperado del método cStrl2::AlgoritmoDeInterfaz().
,I
112
CAP~TULO
4: DESARROLLO Y P RUEBAS DE L A HERRAMIENTA PRUEBAS
/' ............................................................................. */
/ / cstr13.cpp
void cStrl3 : : A l g O r i t m O D ~ I n t ~ ~ f ~ ~ O
{
printf ("LEE BINAR10 POR GRUPO\n"l ;
pidegrupo 0 ;
I
1 d a d
AlgoritmoDelnterfaz
d a d
,I
.s
&<*/ "LEE BINAR10 POR GRUPO\n"
lPidegruP0
I)
113
CAPfTULO 4: DESARROLLO Y PRUEBAS DE LA HERRAMIENTA
1 -1D - 1 I
/* *I
/ I cStrl6.cpp
void cStrl6 :: AlgoritmoDeInterfazO
(
printf ["ECC BINAR10 POR GRUPO\n") i
pidegrupo í ) ;
pideval O i
I
1
AlgoritmoDelnterfaz
-In2
.lpidegrup
.lpideval
114
CAPITULO 4: DESARROLLO Y PRUEBAS DE L A HERRAMIENTA PRUEBAS
I,
/ * .................................
I1............................................
*/
/ / SC-BASE.Cpp
BASE 'SC-BASE::ProduceO
{
return C r e a O ;
t
-Yrea
115
CAPITULO 4: DESARROLLO Y PRUEBAS DE L A HERRAMIENTA !I
J. ...............................................................................
/
int VA1 : : bdescalunsigned int VAR. unsigned int VALOR)
1
if W A R 5 3000)
I
printfí" ERROR . . . EL NUMERO DE LA VARIABLE ES > QUE EL TOTAL\n");
printf 1'' DE VARIABLES DE LA BASE DE DATOS \n'O ;
I,
1
else
(
I * deshabilita interrupciones * / I
/ * suma e l nuevo valor y resta el valor anterior*/
CK += (VALOR - VA[VARII;
VA [VARI= VALOR;
/ * habilita interrupciones * /
)
return (VALOR); ., '
1 2 0 2
II
o
2 0 2
'
VAR 30002 0 2
Areturn VALOR
Figura 4.3 1 Diseño detallado recuperado del método VA1::bdsca (unsigned int VAR).
4.5 Referencias
[San021 Santaolaya Salgado. Re"& Modelo de Represeniaci6n de Palrones de C6digo para la ConstniccMn de
Componentes Reusables. (Tesis de Doctorado. Instituto Poltecnico Nacional. Centro de Investigación en
wmputaci6n. Laboratorio de ingeniería de Conware. México D.F. Noviembre de 2002).
Capítulo 5
1
5.1 Análisis de los resultados obtenidos
I,
Como se indicó en los casos de estudio del capítulo anterior, los resultados obtenidos
respecto a l a eficacia de la herramienta para recuperar diseños son satisfactorios,
k
apegándose a las limitaciones y alcances mencionados en l a Sección 1.6 de este documento.
U n a serie de deficiencias de InverSOODA e I n v e r D D V i no descritas con anterioridad
fueron detectadas durante las phebas. Se resumen a continuación las más importantes:
!
~ sin un tipo de dato de i otro lado incluirlas puede producir una
ambigüedad con los constructores.
121
CAPhULO 5 : CONCLUSIONES
............... . .. ..... ...... ..... . . . .... ... .... ,. . ..,.. .... . .. . . . .-......-. . . ... . . I/ .. . __
Se tuvo que deshabilitar una serie de reglas
~ ~
~~ ~
5.2 Conclusiones I1
122
CONCLUSIONES
CAPfTLiLO 5 : CONCLUSIONES ;
fuente en C++' y por ende, reLonocer más construcciones gramaticales del lenguaje, sin
alterar la recuperación o uso de información semántica ya implementada.
Los resultados obtenidos en este proyecto permiten pensar en una cantidad importante de
mejoras al software para abrir más perspectivas de uso práctico. Enseguida se enlista a
manera de trabajos futuros, alghnas de las mejoras, quizá las más evidentes:
o Idear una estrategia para poder analizar código con directivas de preprocesamiento,
excepciones, y namespbces; elementos que no necesariamente se usan en la teoría
de la programación orientada a objetos y sin embargo promueven la construcción de
software'robusto y porthble.
o Atender las deficiencias que marca la tabla 5.1 de este capítulo para enmendarlas,
o Aumentar la capacidad del software para realizar ingeniería round-trip para otros
lenguajes de programación orientados a objetos.
5.4 Referencias
[San021 Cantaolaya Salgado, Renb. Modelo de Represeniacidn de Paimnes de Cddigo pare la Consi~lccidnde
Componentes Reusables. (Tesis de Doctorado, instituto Poitbcnico Nacimai. Centro de Invesügacibn en
computación, Laboratorio de Ingenieria de Software. México D.F. Noviembre de 2002).
De hecho, el 16 de febrero de 2003 apareció la versión graluita dc archivo de espccifieaci6n gramatical para nnaiiais léxico y sintaciico
1
123
Subconjunto de la Gramática
81
de C t t utilizada en InverSOODA
El lector encontrará que existen reglas triviales en esta subgramatica. Por ejemplo, sean A,B,C E del conjunto
de los simbolos no terminales de G .
La razón para incluir producciónes triviales se debe a que se deja abierta la posibilidad de expander más
producciones alternas, que complementen la gramática sin perder el orden del estándar.
Seccion I. Programa.
I
I/
II
Seccion IV.Declaraciones.
IV.l cdeclaracions : : = cdeclSirnple>
i
I1 clistaInicDecla>';'
1 csecDeclEsp> I ; '
Il ' i '
IV.3 csecDeclEsp> ::= cespecDecl>
1
I/
,I A NEXO A
It
IV.8 <nombreTipo> ::= 'identificador'
Ceccion V. Declaradores. 1)
I V.4 cdefFunc> : : = E /I
V.5 cdefFuncMiembro> : : = <metodovirtual>
I/
I <metodoCimple>
I/
v.8 <secDeciEspMetodoVirtual> : : = <especTipoRetFunc> 'virtual' 'inline'
I <especTipoRetFunc> 'inline' 'virtual'
I 'inline' 'virtual' <ecpecTipoRetFunc>
I 'inline' cespecTipoRetFunc> 'virtual'
I 'virtual' <especTipoRetFunc: 'inline'
I 'virtual' 'inline' <especTipoRetFunc>
1 cespecTipoRetFunc> 'virtual'
I 'inline' 'virtual' I/
I 'virtual' <especTipoRetFunc>
I 'virtual' 'inline'
1 'virtual' I/
Sección V i a . Clases.
VIa.1 <especClase> : : = <cabeceraclase> I { ' <especMiembro> ' ) '
126
".' f
ANEXO A
S . !
127