Documente Academic
Documente Profesional
Documente Cultură
PROGRAMAS C4.5
Presenta
Javier Juárez Palma
Asesorado por:
M. C. Ricardo Solano Monje
Comité de Revisión:
M. C. Leticia Flores Pulido
M. C. Orion Fausto Reyes Galaviz
M. C. Marva Angélica Mora Lumbreras
A mis padres
que con su esfuerzo y cariño me
impulsaron en mi formación
profesional
A mis hermanos
por su apoyo y comprensión
durante todo el tiempo que no
pude estar con ellos
iii
Contenido
Lista de figuras VI
Prefacio VI
Agradecimientos VI
Resumen VI
1. Preliminares 1
1.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
2. Marco Teórico 8
2.1. Minerı́a de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.2. Árboles de decisión . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2.1. Representación de árboles de decisión . . . . . . . . . . . . . . 9
2.2.2. Problemas apropiados para el aprendizaje con árboles de decisión 11
2.2.3. C4.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.3. El lenguaje unificado de modelado . . . . . . . . . . . . . . . . . . . . 14
2.4. Ingenierı́a directa e inversa . . . . . . . . . . . . . . . . . . . . . . . . 17
2.5. Diagramas de clases . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.6. Diagramas de interacción . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.6.1. Diagramas de colaboración . . . . . . . . . . . . . . . . . . . . 19
2.7. Diagramas de estados . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
iv
3. Estado del arte 21
3.1. Entendiendo la estructura de sistemas . . . . . . . . . . . . . . . . . . 23
3.2. Usando ingenierı́a inversa para descubrir estructuras de software . . . 23
3.3. Experiencias del mundo real . . . . . . . . . . . . . . . . . . . . . . . 25
3.3.1. Fases de redocumentación estructural . . . . . . . . . . . . . . 26
3.4. De lo procedural al paradigma orientado a objetos . . . . . . . . . . . 27
3.5. Trabajos Conexos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
5. Desarrollo 33
5.1. Planteamiento de migración . . . . . . . . . . . . . . . . . . . . . . . 33
5.2. Diseño del modelo orientado a objetos . . . . . . . . . . . . . . . . . 35
5.3. Proceso de diseño de diagramas de clases . . . . . . . . . . . . . . . . 36
5.3.1. Identificación de programas principales . . . . . . . . . . . . . 36
5.3.2. Identificación de objetos, métodos y variables . . . . . . . . . 39
5.3.3. Identificación de la relación entre objetos . . . . . . . . . . . . 41
5.3.4. Acoplamiento de variables y métodos en el paradigma orientado
a objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
5.4. Diagramas de colaboración . . . . . . . . . . . . . . . . . . . . . . . . 47
5.5. Diagramas de estados . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
6. Conclusiones 56
6.1. Trabajos a futuro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
A. Diagramas de colaboración 58
v
B. Diagramas de estado 67
vi
Lista de figuras
vii
5.14. Diagrama de clases para el consultor de árboles de decisión (Consult). 50
5.15. Diagrama de clases para el consultor de reglas de producción (Consultr). 51
5.16. Correspondencia de los 4 programas principales con los diagramas de
colaboración. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
5.17. Proceso de obtención de los diagramas de colaboración. . . . . . . . . 54
5.18. Correspondencia de un diagrama de estados con el código fuente. . . 55
viii
Prefacio
La cantidad de información almacenada en todo el mundo ha rebasado la capaci-
dad humana para su análisis. Por tal razón, ha surgido un nuevo enfoque de análisis
de información denominado minerı́a de datos.
Motivación Personal
Este trabajo de tesis surge a partir de mi interés en la minerı́a de datos. Inicial-
mente estuve interesado en realizar un sistema para el diagnostico de enfermedades
respiratorias de forma inductiva, utilizando para su programación Redes Bayesianas.
Sin embargo, se presentaron ciertas complicaciones para la realización de dicho siste-
ma, entre ellas la obtención de datos.
Posteriormente tuve la oportunidad de iniciar un trabajo de tesis con el M. C.
Ricardo Solano Monje, el cual consistı́a en Migrar el conjunto de programas C4.5
al paradigma orientado a objetos en el lenguaje de programación Java, como parte
de mantenimiento al sistema. Dicho trabajo cumplı́a con mis intereses personales y
decidı́ iniciar a leer la información necesaria para realizar el trabajo planteado.
Desde luego acepte la propuesta del trabajo de tesis y continué con las actividades
pertinentes. No obstante, durante la definición precisa del trabajo de tesis fue nece-
sario realizar modificaciones que condujeron a documentar el conjunto de programas
C4.5 en un modelo conceptual dando como resultado el trabajo descrito en esta tesis
de licenciatura.
Organización de la tesis
Nuestro trabajo se encuentra organizado de la siguiente manera. En el Capı́tulo
1, damos una introducción que describe de manera general el interés de esta tesis. En
el Capı́tulo 2, presentamos los principales conceptos necesarios para la comprensión
ix
de los temas básicos tratados en nuestro trabajo. En el Capı́tulo 3, damos una idea
de los trabajos relacionados con la evolución y redocumentación de sistemas. En el
Capı́tulo 4, describimos la definición del problema, ası́ como también, la definición de
objetivos. En el Capı́tulo 5, mostramos detalladamente lo forma de obtención de un
modelo conceptual para el conjunto de programas C4.5. Finalmente en el Capı́tulo 6,
presentamos nuestras conclusiones y posibles trabajos a futuro que pueden surgir de
este trabajo de tesis.
x
Agradecimientos
A mi tı́o Lorenzo
que con su apoyo mis estudios
de licenciatura fueron más
fáciles de realizar
A toda mi familia
por haber confiado todo el
tiempo en mi
xi
Resumen
La tecnologı́a actual ha permitido el desarrollo de aplicaciones computacionales
para el apoyo en la toma de decisiones.
C4.5 es una aplicación que ha tenido gran éxito para la generación de modelos
en forma de árboles de decisión para la toma de decisiones, dicha aplicación fue
desarrollada desde una perspectiva estructural. Sin embargo, este paradigma tiende
a producir sistemas frágiles y no es factible desechar un sistema y reemplazarlo por
otro totalmente nuevo en lugar de reutilizarlo, repararlo o extender su funcionalidad.
Para dar mantenimiento a un sistema durante su evolución, es necesario el cono-
cimiento acerca de su arquitectura, a pesar de esto, C4.5 no cuenta con un modelo
que muestre su arquitectura a nivel conceptual.
Este trabajo de tesis documenta el sistema C4.5 desde una perspectiva orientada
a objetos que permita mostrar las caracterı́sticas esenciales de éste.
Hemos elegido una perspectiva orientada a objetos, debido a que ha demostrando
ser un concepto muy potente y unificador ofreciendo ventajas para evolucionar en el
tiempo, no obstante, se requiere realizar cambios estructurales debido a las diferencias
existentes entre la perspectiva estructural y la perspectiva orientada a objetos.
El diseño del modelo orientado a objetos toma la aproximación de derivar una
estructura de objetos desde la perspectiva estructural actual del sistema.
El modelo generado que documenta el sistema expone la estructura interna del
sistema mediante diagramas de clases, diagramas de colaboración y diagramas de
estados.
xii
Capı́tulo 1
Preliminares
La toma de decisiones constituye una de las tareas más importantes a ser rea-
lizada en una organización, pues es fácil suponer que al tomar decisiones correctas
o incorrectas definirán su futuro. Por ello, el uso de la tecnologı́a computacional ha
incursionado en el desarrollo de aplicaciones de apoyo en la toma de decisiones, me-
diante herramientas de análisis de información para la identificación de patrones.
1.1. Introducción
La mayorı́a de aplicaciones que se han desarrollado para la toma de decisiones
están basadas en la construcción de modelos de conocimiento, usados por un experto
humano, pues en algunos casos, se considera que la tarea que un experto realiza
es clasificar ejemplos asignando cosas a categorı́as o clases determinadas por sus
propiedades.
Por ejemplo, Quinlan [1] cita un sistema desarrollado por American Express para
asistir a autorizadores de crédito, en dicho sistema se considera el historial de crédito
de un cliente en particular, y las clases correspondientes para aprobar o rechazar la
transacción. En el sistema se analiza una autorización de crédito mediante la clasifi-
cación del cliente y ası́ se autoriza o se rechaza el crédito.
En un modelo de clasificación, la conexión entre clases y propiedades puede estar
1
definida por algo tan simple como un organigrama o tan complejo y no estructurado
como un manual de procedimientos. Si restringimos la discusión a modelos ejecutables,
aquellos que puedan ser representados como un programa computacional, hay dos
formas muy diferentes en las cuales pueden ser construidos.
Por una parte, el modelo puede ser obtenido por entrevistar un experto o expertos;
la mayorı́a de sistemas basados en conocimiento han sido construidos de esta manera,
a pesar de las dificultades bien conocidas que acompañan a este tipo de sistemas.
Alternativamente, numerosos registros clasificatorios pueden ser examinados y cons-
truir un modelo inductivamente, por generalización de ejemplos especı́ficos.
Una forma de identificación y representación de patrones de forma sencilla en el
proceso de descubrimiento de conocimiento son los árboles de decisión, cuyo proceso
se basa en la partición del conjunto de ejemplos, según ciertas condiciones que se
aplican a los valores de los atributos. Una herramienta para la generación de árboles
de decisión que ha tenido gran éxito es el algoritmo ID3 desarrollado por Ross Quinlan
que se basa en la creación del árbol mediante la selección de los atributos que mejor
particionen a los ejemplos, mediante una medida de ganancia de información. Los
nodos del árbol están etiquetados con nombres de atributos, las ramas con los posibles
valores del atributo, y las hojas con las diferentes clases.
Los problemas para los que funcionan los algoritmos de decisión deben tener las
siguientes caracterı́sticas: Casos que son representados por pares atributo-valor, fun-
ciones objetivo que tienen valores de salida discretos, descripciones disyuntivas pue-
den ser requeridas, datos de entrenamiento que pueden contener errores y datos de
entrenamiento que pueden contener valores de atributo perdidos.
Sin embargo, el algoritmo ID3 tiene ciertas deficiencias, como la generación de
árboles muy extensos no comprensibles, además de no considerar atributos con valores
continuos y valores predidos. ID3 ha sido extendido para la eliminación de estos
problemas, teniendo como resultado el sistema C4.5 [1, 2].
C4.5 no es un simple algoritmo, sino más bien está integrado por un conjunto de
programas escritos en el lenguaje de programación C, cuyo funcionamiento es generar
2
árboles de decisión y reglas de producción de manera inductiva a partir de datos de
entrenamiento para un problema especı́fico. En el proceso de generación del árbol se
consideran atributos que tienen valores continuos, además de incorporar el término
de poda para la reducción de árboles muy extensos.
El desarrollo de software involucra enfrentarnos al manejo de cierta complejidad
que se encuentra inherente al problema que intentamos solucionar, según lo menciona
Booch [3], la complejidad se deriva de cuatro elementos:
3
Los sistemas orientados a objetos son más resistentes al cambio y por lo tanto
están mejor preparados para evolucionar en el tiempo. En realidad, la descomposición
orientada a objetos reduce en gran medida el riesgo que representa construir sistemas
de software complejos, por que están diseñados para evolucionar de forma incremental
partiendo de sistemas más pequeños en los que ya se tiene certidumbre. Es más,
la descomposición orientada a objetos resuelve la complejidad inherente al software
ayudando a tomar decisiones inteligentes respecto a la separación de actividades en
objetos.
El uso de objetos promueve la reutilización no sólo del software, sino de diseños en-
teros, conduciendo a la creación de marcos de desarrollo de aplicaciones reutilizables,
para la mayorı́a de los lenguajes orientados a objetos dominantes hay un gran núme-
ro incremental de librerı́as que asisten en el desarrollo de aplicaciones para muchos
dominios. Se ha encontrado que los sistemas orientados a objetos son frecuentemente
más pequeños que sus implantaciones equivalentes no orientadas a objetos. Esto no
sólo significa escribir y mantener menos código, sino que la mayor reutilización del
software también se traduce en beneficios de costo y planificación [3].
En el software hay varias formas de enfocar un modelo. Las dos formas más comu-
nes son la perspectiva orientada a objetos y la perspectiva estructural mostradas en
la figura 1.1.
La visión hasta hace algunos años del desarrollo de software tomaba una pers-
pectiva estructural. En este enfoque, el bloque principal de construcción de todo el
software es el procedimiento o función. Esta visión conduce a los desarrolladores a
centrarse en cuestiones de control y de descomposición de algoritmos grandes en otros
más pequeños.
No hay nada inherentemente malo en este punto de vista, salvo que tiende a
producir sistemas frágiles. Cuando los requisitos cambian (¡lo harán!) y el sistema
crece (¡lo hará!), los sistemas construidos con el enfoque algorı́tmico se vuelven muy
frágiles en su mantener.
4
Figura 1.1: Comparación entre la descomposicón orientada a objetos y la descompo-
sición orientada a funciones.
La visión actual del desarrollo de software toma una perspectiva orientada a ob-
jetos. En este enfoque, el principal bloque de construcción de todos los sistemas de
software es el objeto o clase. De forma sucinta, un objeto es una cosa, generalmente
extraı́da del vocabulario del espacio del problema o del espacio de la solución; una
clase es una descripción de un conjunto de objetos similares.
A lo largo de los últimos años, la tecnologı́a orientada a objetos se ha desarrollado
en diferentes segmentos de las ciencias de la computación. La madurez de la ingenierı́a
de software ha conducido al desarrollo de métodos de análisis, diseño y programación
orientados a objetos, todos los cuales tienen la misión de resolver problemas de la
programación a gran escala.
El lenguaje unificado de modelado (UML, Unified Modeling Language) es un len-
guaje gráfico para documentar los artefactos de un sistema con gran cantidad de
software. UML proporciona una forma estándar de escribir los planos de un sistema,
5
con el fin de construir modelos para comprender mejor el sistema que se esta desa-
rrollando. Es decir, construimos modelos de sistemas complejos porque no podemos
comprender el sistema en su totalidad. Cabe mencionar que cualquier proyecto puede
beneficiarse de un modelo conceptual como UML [4].
El modelado es importante, pero hay que recordar que el producto principal de un
equipo de desarrollo es el software, no diagramas. Por supuesto, la razón por la que
se crean modelos es para entregar de forma predecible, en el momento oportuno, el
software adecuado que satisfaga los objetivos cambiantes de los usuarios y la empresa.
Durante la evolución del software se aplican cambios al código fuente, para agregar
funcionalidad, reparar defectos y mejorar su calidad. En sistemas con documentación
pobre, el código es la única fuente de información fiable del sistema, sin embargo, el
código no contiene toda la información necesaria.
Tı́picamente, el conocimiento acerca de la arquitectura, el diseño y el dominio
de la aplicación sólo existe en la mente del diseñador, desafortunadamente con el
tiempo las personas se van, los documentos decaen y la complejidad aumenta. Por
consiguiente, existe un hueco en la comprensión de la información útil conocida y la
información necesaria requerida para reforzar cambios en el software.
El conocimiento de la arquitectura del software desde diferentes perspectivas de
usuario es necesario para hacer cambios estructurales y tener la capacidad de recons-
truir la arquitectura [5]. Diseñar puede ser difı́cil, pero reconstruir y (re)documentar
eficazmente el diseño de un sistema de software existente es aun más difı́cil [6]. Como
resultado, el proceso de ingenierı́a inversa se ha enfocado en el entendimiento del
código. El proceso de ingenierı́a inversa identifica los componentes del sistema actual,
descubre sus dependencias y genera abstracciones para dirigir la complejidad [7].
C4.5 es un sistema creado desde la perspectiva estructural y como se ha mencio-
nado los sistemas creados desde este punto de vista tienden a ser frágiles. Por esta
razón, nos interesa desarrollar un modelo orientado a objetos de C4.5 que permita
mostrar las caracterı́sticas esenciales del sistema, con el fin de dar una comprensión
mas clara de la estructura interna del sistema para propósitos de mantenimiento, ya
6
que no se cuenta con este modelo, este trabajo de tesis propone la extracción del
modelo orientado a objetos a partir de la implementación en C del código existente.
Este proceso comúnmente se le conoce como ingenierı́a inversa, que es el proceso de
transformar código en un modelo a través de una correspondencia con un lenguaje de
programación especı́fico [4].
7
Capı́tulo 2
Marco Teórico
8
2.2. Árboles de decisión
El aprendizaje con árboles de decisión es uno de los métodos de inferencia inductiva
más usados y practicados. El aprendizaje con árboles de decisión es un método para
aproximar funciones objetivo de valores discretos, en el cual la función objetivo es
representada por un árbol de decisión. Los árboles inferidos también pueden ser re-
representados por un conjunto de reglas If-Then-Else para mejorar la comprensión
humana. Estos métodos de aprendizaje están entre los algortimos más populares
de inferencia inductiva y han sido satisfactoriamente aplicados a una extensa gama
de tareas de aprendizaje, desde casos de diagnostico médico, hasta la evaluación de
riesgos de crédito en una aplicación de préstamo.
9
Figura 2.1: Un árbol de decisión para la autorización de un préstamo.
ese atributo. Un ejemplo es clasificado al realizar una serie de pruebas para cada
atributo, iniciando en el nodo raı́z del árbol, y siguiendo la rama del valor para el
atributo especificado por este nodo, entonces se continúa el proceso de prueba para
el nodo que continua en la rama correspondiente al valor del atributo hasta alcanzar
un nodo hoja.
La figura 2.1 muestra un árbol de decisión para asistir a una institución financiera
en la realización de un préstamo a un persona. El árbol de decisión clasifica la rea-
lización del préstamo de acuerdo a los ingresos del aspirante, antecedentes penales,
años en su empleo y el pago de sus tarjetas de crédito. Por ejemplo para el caso
(Ingreso del aspirante = $35000, años en su empleo = 3, ¿paga sus tarjetas de crédi-
to? = si)
10
Se realizan las pruebas en los nodos correspondientes comenzando en el nodo de
¿Ingresos del aspirante?, se sigue la rama de en medio y ası́ sucesivamente, hasta
alcanzar la hoja “Prestar”, que en este caso es la categorı́a o resultado del árbol.
En general los árboles de decisión representan una disyunción de uniones de res-
tricciones sobre los valores de los atributos de ejemplo. Cada ruta de la raı́z del árbol
a una hoja corresponde a una unión de atributos de prueba, y el árbol mismo a una
disyunción de estas uniones.
Casos que son representados por pares atributo-valor. Los ejemplos son descritos
por un conjunto fijo de atributos (p.e. Temperatura) y sus valores (p.e. caliente).
La situación más fácil para el aprendizaje con árboles de decisión es cuando cada
atributo toma un número pequeño de valores posibles.
11
ejemplos de clasificación, como en los valores de los atributos que describen
estos ejemplos.
Muchos problemas prácticos han sido encontrados para ajustar estas caracterı́sti-
cas. El aprendizaje con árboles de decisión ha sido aplicado por consiguiente a proble-
mas tales como aprendizaje para clasificación médica de pacientes por sus sı́ntomas,
en mal funcionamientos de equipo por sus causas, en aplicaciones de préstamo por
sus posibilidades predefinidas de pago. Tales problemas en los cuales la tarea es la
clasificación de ejemplos dentro de una categorı́a posible, de valores discretos, son
referidos a menudo como problemas de clasificación.
2.2.3. C4.5
Este conjunto de programas genera un clasificador en la forma de un árbol de
decisión, estructurado como sigue:
Un nodo de decisión que especifica una prueba a llevarse a cabo sobre un valor
de atributo simple, con una rama y subárbol para cada salida posible de la
prueba.
12
4. El interprete de reglas de producción (‘consultr’)
2,2.5,3.0,?,?,40,none,?,?,?,11,below average,?,?,?,?,bad
2,4.5,4.0,?,?,40,?,?,4,?,10,generous,?,half,?,full,good
1,6.0,?,?,?,38,?,8,3,?,9,generous,?,?,?,?,good
Hay 57 casos como estos en la base de datos. En este ejemplo 40 de los casos han
sido seleccionados aleatoriamente para formar un conjunto de entrenamiento desde los
cuales el clasificador será construido, 17 de los casos son reservados para un conjunto
de prueba. Los casos de entrenamiento son colocados en el archivo labor-neg.data, y
los de prueba en labor-neg.test. El comando de UNIX
1
Estas bases de datos pueden ser obtenidas en ftp://ftp.ics.uci.edu/pub/machine-learning-
databases
13
Figura 2.2: Definición de clases y atributos en el ejemplo labor-neg
C4.5 -f labor-neg -u
reutilizables.
UML es un lenguaje para:
Visualizar
Especificar
Construir
Documentar
1. Los modelos nos ayudan a visualizar cómo se desea que sea el sistema.
16
3. Los modelos nos proporcionan plantillas que nos guı́an en la construcción de un
sistema.
17
un modelo a partir de código a menos que las herramientas incluyan información en
los comentarios del código fuente que vaya más allá de la semántica del lenguaje de
implementación.
La combinación de estas dos vı́as de generación de código y de ingenierı́a inversa
produce una ingenierı́a de “ida y vuelta”, entendiendo por esto la posibilidad de traba-
jar en una vista grafica o textual, mientras las herramientas mantienen la consistencia
entre las dos vistas.
Métodos
18
Navegabilidad
Dependencias
19
diagramas de colaboración. Éstos presentan el flujo de mensajes entre las instancias
y la invocación de métodos.
Los diagramas de colaboración explican gráficamente cómo los objetos interactúan
a través de mensajes para realizar las tareas y las interacciones existentes entre las
instancias (y las clases) del modelo de éstas [4].
Definición 2.4 Una transición es una relación entre dos estados que indica que un
objeto que está en el primer estado realizará ciertas acciones y entrará en el segun-
do estado cuando ocurra un evento especificado y se satisfagan algunas condiciones
especı́ficas.
20
Capı́tulo 3
21
razones: resume la arquitectura del sistema, puede ayudar ha resolver anomalı́as en
el diseño, o a descubrir errores. Un modelado de objetos proporciona a diseñadores
de programas orientados a objetos una forma de documentar concisamente la esencia
del diseño de un sistema [8].
Un modelo de objetos es una representación del estado abstracto de un programa.
Este toma la forma de una grafica cuyos nodos representan un conjunto de objetos,
y cuyos bordes representan relaciones o asociaciones entre objetos. Un modelo de
objetos es una vista de la arquitectura de un sistema, mostrando sus componentes
esenciales y cómo ellos interactúan. En la fase de mantenimiento, un modelo de objetos
es invaluable [9].
El propósito de un modelo es conservar caracterı́sticas seleccionadas de artefactos
del mundo real. Los modelos son usados en la mayorı́a de las disciplinas de ingenierı́a.
Un modelo puede ser una teorı́a matemática, una entidad fı́sica, o la imagen de una
guı́a mental en el cerebro de un diseñador. El propósito de un diseño es facilitar el
análisis, explicita o implı́citamente.
El uso efectivo de abstracciones es la clave de la construcción satisfactoria de
modelos. La construcción de un modelo abstracto, a su vez, es la clave del éxito del
análisis.
Cuando se construye un modelo, un experto lo puede verificar tı́picamente al
consultar con el diseñador del sistema, que es fuente de estudio, o por una lectura
extensa de la documentación del sistema y en algunos casos del código fuente de la
aplicación, para llegar a un entendimiento del diseño proyectado. Este proceso por lo
menos puede tomar dı́as, a menudo semanas y algunas veces meses [10].
Realizar el diseño de un modelo suele ser difı́cil, no obstante reconocer abstraccio-
nes en sistemas del mundo real es tan difı́cil como diseñar abstracciones adecuadas
para un nuevo sistema. Esto es especialmente verdadero para legado de sistemas de
software escritos hace 10-25 años, los cuales están a menudo en condiciones de docu-
mentación pobre. En la evolución de sistemas de legado se requiere un conocimiento
sustancial agrupado.
22
Los trabajos relacionados en el área de obtención de modelos son variados, sin em-
bargo, la mayorı́a de estos tienen un enfoque similar sobre el objetivo de la obtención
de modelos a partir de código fuente. La mayorı́a de trabajos relacionados manejan la
obtención de modelos como un proceso de ingenierı́a inversa para el descubrimiento
y la obtención de artefactos del mundo real, para ser plasmados dichos artefactos en
un modelo que explique desde diferentes perspectivas la arquitectura de un sistema
de software.
23
componentes tales como cliente-proveedor, herencia y flujo de control; y atributos
tales como el tipo de componentes, tamaño de interfaces y longitud de interconexión.
La estructura de un sistema es la organización y la interacción de estos artefactos.
Una técnica de apoyo computacional de la reconstrucción de modelos estructurales
es ingenierı́a inversa.
El proceso de ingenierı́a inversa [6]:
24
el código. Sin embargo, el código no contiene toda la información que necesitamos,
a menos que ésta se encuentre codificada en el código. Por consiguiente, existe un
hueco en la comprensión de la información útil conocida y la información requerida
necesaria para reforzar cambios en el software [9].
Segundo, las vistas resaltan áreas crı́ticas de la estructura del software que
necesitan más atención, tales como componentes centrales que tienen un gran
número de dependencias casuales.
Cuarto, las vistas verifican que la estructura del software de sus sistemas fue,
al menos, entendible para una experiencia de análisis desde afuera.
25
alrededor de 1,300 unidades de compilación, bruscamente esta dividido en 3 sistemas
grandes (y varios pequeños más). Los desarrolladores son forzados a especializarse en
componentes particulares, aun cuando varios componentes interactúan. SQL/DS es
un tı́pico sistema de software de legado.
26
3.4. De lo procedural al paradigma orientado a ob-
jetos
El éxito de sistemas de software procedurales llama a su continuo uso y mante-
nimiento. Como Wilde et al. apuntan: “Cualquier sistema de software exitoso en el
futuro entra en una prolongada y costosa fase de mantenimiento, no como consecuen-
cia de fallas, sino de éxito. Si un sistema es exitoso, los usuarios demandaran que este
sea fortalecido y actualizado” [11].
Al diseñar y desarrollar programas orientados a objetos desde una perspectiva
procedural, uno puede experimentar lo que es conocido como “cambio de paradigma”.
Este cambio requiere que, el diseñador no piense en términos de los procedimientos
que un sistema de software debe ejecutar, si no más bien, en términos de las entidades
u objetos que participan en el sistema.
El derivar una estructura de clases desde una perspectiva estructural de un pro-
grama procedural, toma la aproximación de no diseñar estructuras de clases desde el
principio, sino más bien, derivar estas desde la estructura actual del sistema.
Para facilitar la transición de programas procedurales dentro de un estilo orientado
a objetos, Ignacio Silva [11] propone derivar su estructura de clases al considerar sus
estructuras de datos como objetos de alto nivel y transformando procedimientos en
métodos, que serán agregados a los objetos para definir su comportamiento.
Jacobson y Lindströum [12] proponen reingenierı́a a sistemas antiguos dentro de
una arquitectura orientada a objetos en dos pasos fundamentales.
Por otra parte, en [13] se menciona que una de las formas más comunes de evo-
lución de un sistema, involucra la extensión de un esquema existente, por la adición
27
de nuevas clases de objetos o la adición de atributos a los objetos originales. Algunas
veces, la estructura de clases es reorganizada incluso cuando el conjunto de objetos no
se esta cambiando. En este caso la reorganización puede presentar una optimización
del sistema o sólo un cambio en la perspectiva de usuario. En el otro extremo, una
reorganización de clases no sólo puede reflejar extensión y reclasificación de objetos
existentes, sino también cambios estructurales en los objetos originales.
28
3. Optimización. Por último, esta fase realiza un mejoramiento del código fuente
aplicando estrategias de reingenierı́a.
29
Capı́tulo 4
2. No se cuenta con información del sistema que describa las caracterı́sticas gene-
rales de su comportamiento, teniendo que enfocarnos únicamente en el código
de C4.5 para la obtención del modelo orientado a objetos.
1
En este caso particular, C4.5 está desarrollado en el lenguaje C.
30
4.1. Objetivo General
Extraer el modelo conceptual orientado a objetos a partir del código en C de
C4.5 que permita documentar de forma concisa la arquitectura desde la vista de
diseño de C4.5.
Diagramas de clases,
Diagramas de colaboración y
Diagramas de estados.
4.2. Hipótesis
Es posible documentar un sistema a partir de su código fuente, mediante la obten-
ción de un modelo conceptual en el paradigma orientado a objetos. Desde el principio,
este modelo puede ser derivado a partir de la estructura actual del sistema haciendo
uso de metodologı́as establecidas.
4.3. Justificación
El modelo del conjunto de programas C4.5 en el paradigma orientado a objetos
nos permitirá obtener un software reutilizable, legible y principalmente mantenible
dentro del ciclo de vida de éste.
Las caracterı́sticas estructurales, tales como las colaboraciones, y las caracterı́sti-
cas de comportamiento, como son las interacciones, pueden visualizarse claramente
en UML, pero no tan claramente a partir del código fuente simple.
31
Debido a que los modelos escritos en UML son semánticamente más ricos que
cualquier lenguaje de programación orientado a objetos actual, se necesitan modelos
además de código. Pues hay una pérdida de información cuando se hace ingenierı́a
directa de modelos a código.
32
Capı́tulo 5
Desarrollo
33
Figura 5.1: Estrategias de migración al paradigma orientado a objetos.
34
a objetos sea mas clara y precisa.
Vista de diseño.
Vista de procesos.
35
• Diagramas de clases (para modelado estructural).
Vista de implementación.
• Diagramas de componentes.
Vista de despliegue.
• Diagramas de despliegue.
36
Figura 5.2: Diagrama de secuencia para el sistema C4.5.
del usuario, en particular, las tareas que son ejecutadas por cada programa principal
son:
La forma en que fluyen los eventos que pasan del usuario al sistema los podemos
observar en el diagrama de secuencia de la figura 5.2.
En general, C4.5 consta de los programas listados en la figura 5.3. A partir de saber
que el sistema consiste de 4 programas principales, nos enfocamos en la identificación
de la colaboración de cada uno de estos con los demás programas, dicha identificación
se logro a partir del archivo makefile en el que se describen sus relaciones con los demás
archivos o programas. Para cada uno de los 4 programas principales mostramos su
relación con los demás programas en la figura 5.4.
37
Figura 5.3: Lista del conjunto de programas de C4.5.
Figura 5.4: Relación de los 4 programas principales con los demás programas en C4.5.
38
5.3.2. Identificación de objetos, métodos y variables
Según la aproximación de Ignacio Silva [11], derivar una estructura de clases desde
una perspectiva estructural, no se debe realizar desde un principio, sino más bien, se
deriva desde la estructura actual del sistema. Por tal motivo, seguimos esta aproxi-
mación para realizar el modelo conceptual de C4.5.
Un objeto es una cosa, generalmente extraı́da del vocabulario del espacio del pro-
blema o del espacio de la solución,en este sentido, todo objeto tiene identidad (puede
nombrarse o distinguirse de alguna manera de otros objetos), estado (generalmente
hay algunos datos asociados a él), y el comportamiento (se le puede hacer cosas al
objeto, y él a su vez puede hacer cosas a otros objetos).
Para la identificación de objetos en el dominio del sistema C4.5, nos basamos en
la aproximaciones expuestas por Ignacio Silva [11] y Johannes Martin [14], en donde
se expone de forma similar que un programa C consta de uno o más archivos de
código fuente, de la misma forma, un programa en el paradigma orientado a objetos
puede estar constituido por una o más clases. A cada archivo o programa fuente C lo
asociamos con una clase u objeto, cuya identidad es el nombre del archivo fuente C,
los métodos y variables que contiene este objeto son aquellos que se encuentran en el
mismo archivo.
En la fase de normalización, seguida en la aproximación de Johannes Martin [14],
se realiza una transformación de funciones del código en el formato K&R al formato
de un método, esta correspondencia de código se puede observar en la figura 5.5 y
será aplicada en cada una de las funciones del código fuente en C con el fin de mostrar
la forma adecuada en el correspondiente diagrama de clases.
La forma que ha tomado hasta aquı́ cada clase se puede observar en la figura
5.6. Como podemos ver, aún no se encuentra cada clase en la manera adecuada,
prácticamente ha sido tomado directamente del código fuente C, con la definición de
variables apuntador, los métodos empiezan con mayúscula y el nombre del objeto
con minúscula. Una fase posterior realiza y explica la adaptación de este objeto al
paradigma orientado a objetos.
39
Figura 5.5: Ejemplo de transformación de funciones en el formato K&R al formato
de métodos en el POO.
40
Figura 5.7: Identificación de las relaciones entre objetos.
41
preparados para presentar una primera aproximación al paradigma orientado a ob-
jetos. Este diagrama se presenta en la figura 5.8, sin embargo no es un diagrama de
clases final, pues aún falta realizar un refinamiento de éste para alcanzar un diagrama
de clases concreto.
42
Figura 5.8: Primera aproximación al paradigma orientado a objetos de C4.5.
43
Figura 5.9: Cambio de apuntadores por arreglos.
ilustra en la figura 5.10 y por razones obvias son eliminadas del diagrama de
clases en cada objeto que contiene este tipo de variables. Además, el archivo
extern.i al igual que el archivo buildex.i desaparecen debido a que su contenido
es únicamente la definición de variables externas.
44
Figura 5.10: Eliminación de variables externas.
45
Figura 5.11: Objetos derivados.
46
Finalmente, después de realizar los cambios mencionados anteriormente, hemos
logrado desarrollar los 4 diagramas de clases para los 4 programas principales corres-
pondientes a C4.5, estos diagramas se muestran en las figuras 5.12, 5.13, 5.14 y 5.15.
1. Elabore un diagrama por cada operación del sistema durante el ciclo actual de
desarrollo.
47
Figura 5.12: Diagrama de clases para el generador de árboles de decisión (C4.5).
48
Figura 5.13: Diagrama de clases para el generador de reglas de producción (C4.5rules).
49
Figura 5.14: Diagrama de clases para el consultor de árboles de decisión (Consult).
50
Figura 5.15: Diagrama de clases para el consultor de reglas de producción (Consultr).
51
2. Si el diagrama se torna complejo (por ejemplo, si no cabe holgadamente en una
hoja de papel de 8.5 x 11), divı́dalo en diagramas más pequeños.
52
Figura 5.16: Correspondencia de los 4 programas principales con los diagramas de
colaboración.
53
Figura 5.17: Proceso de obtención de los diagramas de colaboración.
54
Figura 5.18: Correspondencia de un diagrama de estados con el código fuente.
evento como aquel acontecimiento que especifica que la tarea ha sido realizada y el
estado se encuentra en espera de una transición, las transición es aquella que especifica
la realización de otra actividad en un siguiente evento que cumpla las condiciones
indicadas.
Finalmente, los diagramas de estados obtenidos desde el código fuente C del con-
junto de programas C4.5 son presentados en la siguientes páginas en la figura B.1.
55
Capı́tulo 6
Conclusiones
56
Las principales estrategias de conversión de código fuente C a estructuras orien-
tadas a objetos fueron obtenidas del trabajo de Johannes Martin [14], utilizando pri-
mordialmente los equivalentes para estructuras, uniones, variables externas y macros
del lenguaje de programación C hacia el paradigma orientado a objetos.
Finalemente, podemos comentar que hemos enmarcado los trabajos a futuro como
parte del mantenimiento del software C4.5.
57
Apéndice A
Diagramas de colaboración
58
59
60
61
Figura A.4: Continuación del diagrama de colaboración para el generador de árboles
de decisión.
62
63
64
66
Apéndice B
Diagramas de estado
67
Figura B.1: Método main de la clase C4.5
68
Figura B.3: Método getNames de la clase GetNames
69
Referencias
[1] J. R. Quinlan. C4.5: Programs for Machine Learning. Morgan Kaufmann, first
edition, 1993.
[3] Grady Booch. Análisis y Diseño orientado a objetos. Addison Wesley Longman,
2nd edition, 1996.
[4] Ivar Jacobson Grady Booch, James Rumbaugh. El lenguaje unificado de mode-
lado. Addison Wesley Iberoamericana, 1999.
[6] Kenny Wong, Scott R. Tilley, Hausi A. Müller, and Margaret-Anne D. Storey.
Structural redocumentation: A case study. IEEE Software, 12(1):46–54, 1995.
[7] Scott R. Tilley, Kenny Wong, Margaret-Anne D. Storey, and Hausi A. Müller.
Programmable reverse engineering. International Journal of Software Enginee-
ring and Knowledge Engineering, 4(4):501–520, 1994.
[8] Allison Leah Waingold. Automated extraction of abstract object models. Mas-
ter’s thesis, Massachusetts Institute of Technology, May 2001.
70
[9] Daniel Jackson and Allison Waingold. Lightweight extraction of object models
from bytecode. In International Conference on Software Engineering, pages 194–
202, 1999.
[10] G. J. Holzmann. From code to models. pages 3–10, Newcastle upon Tyne, U.K.,
2001.
[12] Ivar Jacobson and Fredrik Lindström. Re-engineering of old systems to an object-
oriented architecture. In OOPSLA Conference, Special Issue of SIGPLAN Noti-
ces, pages 340–350, Phoenix, AZ, 1991.
[15] Craig Larman. UML y Patrones. Prentice Hall, primera edition, 1999.
71