3.4 Empirical Results: The probability of Being Non-Employed
3.5.2 Exit to Inactivity
En este capítulo se presenta el segundo experimento realizado sobre las herramientas Bandago y JDeodorant. Este experimento es similar al presentado en el Capítulo 4, con la diferencia de haber sido realizado luego de aplicar las mejores descritas en el Capítulo 5. Este experimento tiene como objetivo comparar ambas herramientas de forma más pareja, considerando ahora la ejecución automática de la herramienta JDeodorant, y la generación
de oportunidades de refactoring por Program Slicing en la herramienta Bandago. De dicha
comparación se busca obtener cuál enfoque es mejor en términos de Brain Methods
eliminados y eficiencia (es decir, menor tiempo de ejecución posible).
Este capítulo se encuentra organizado en 3 partes. En la sección 6.1 se explica la estructura del experimento llevado a cabo, detallando la configuración de los algoritmos ejecutados, los datos evaluados, las modificaciones realizadas en cada herramienta y se definen también las métricas a obtener. En la sección 6.2 se presentan y analizan los resultados obtenidos de este experimento. En la sección 6.3 se plantean las conclusiones de dicho experimento.
6.1 Estructura del experimento
Para realizar este experimento se seleccionaron 10 proyectos Java a ser analizados por las herramientas Bandago y JDeodorant. Estos proyectos fueron obtenidos de Qualitas Corpus, y corresponden a los mismos proyectos analizados en el experimento 1 (Ver Capítulo 4). Los Proyectos se detallan en la Tabla 4.1.
Las pruebas realizadas consisten en la ejecución de las herramientas Bandago y JDeodorant
sobre cada Brain Method en cada uno de los 10 proyectos. A diferencia del experimento
anterior, las herramientas fueron modificadas para realizar una comparación más justa de sus enfoques. Estas modificaciones fueron detalladas en el Capítulo 5.
Ambas herramientas se configuraron con los mismos parámetros que en el experimento
anterior (ver Capítulo 4). En el caso de JDeodorant el nuevo algoritmo de Backtracking se
configuró con las siguientes condiciones de corte:
● Número máximo de iteraciones (Número máximo de nodos a visitar, donde un nodo equivale a aplicar una refactorización): 50.
● Tiempo máximo de ejecución: 3 minutos.
En el caso de Bandago, las condiciones de corte fueron las siguientes: ● Tiempo Maximo de ejecucion (para 3 soluciones): 30 segundos. ● Número máximo de iteraciones: 50.
De los resultados de este experimento se espera obtener y analizar las siguientes métricas:
● Número de Brain Methods solucionados: Cantidad de Brain Methods para los cuales
se encontró una solución (es decir, una secuencia de refactorizaciones que logró
● Tiempo de ejecución de cada algoritmo: El tiempo que tarda el algoritmo en devolver una respuesta (solución o estado parcialmente satisfactorio) al usuario.
● Número de nodos visitados por el algoritmo de Backtracking: Corresponde a la
cantidad de refactorizaciones que se debieron realizar hasta obtener la respuesta devuelta al usuario.
Para realizar las pruebas se utilizó el siguiente Hardware: ● Procesador Intel Core i5 750 2.67GHz x 4.
● Ram 13.7GB 1333 mhz DDR3.
● Sistema Operativo Linux Mint 18 Cinnamon 64-bit.
● Disco WD10EARS 1TB 5400 RPM 64MB Cache SATA 3.0Gb/s 3.5".
En el caso de Bandago, el experimento fue realizado únicamente sobre el operador
RANDOM, dado que este fue el que mejores resultados obtuvo en el experimento del Capítulo
4. La diferencia es que ahora se pueden seleccionar también de manera aleatoria statements
obtenidos por medio del filtro basado en Program Slicing de JDeodorant, lo cual introduce
nuevas posibilidades y diferentes resultados.
Como criterio de selección de resultados esta vez se utilizó un criterio similar al creado en
JDeodorant, en reemplazo del criterio Random. Este criterio toma en consideración todas las
métricas relativas al smell al mismo tiempo, realizando así una toma de decisiones multi-
criterio. Esto permite ajustar aún más la comparación de manera equitativa para ambas herramientas. Sin embargo, como fue explicado en las secciones anteriores, en este trabajo
solamente se busca analizar la cantidad de Code Smells eliminados por cada herramienta,
sin realizar un análisis meticuloso de la calidad de las soluciones.
De esta forma por cada método identificado como Brain Method se obtuvieron 15 soluciones
diferentes. Se realizaron 5 ejecuciones de Bandago por cada smell, y por cada ejecución se
seleccionó una de las 3 soluciones propuestas por Bandago considerando en el cálculo todas
6.2 Resultados
En esta sección se presentan y analizan los resultados obtenidos de las pruebas aplicando las herramientas modificadas JDeodorant y Bandago sobre 10 proyectos Java.
El objetivo de este experimento es analizar la cantidad de Code Smells eliminados por cada
herramienta, considerando principalmente que ambas presentan diferentes enfoques de búsqueda de oportunidades de refactorización.
Figura 6.1 Cantidad de Brain Methods corregidos por JDeodorant y Bandago extendidos, por proyecto.
En la Figura 6.1 se observa una diferencia muy marcada en cuanto a cantidad de Brain
Methods eliminados favorable a la herramienta Bandago, al igual que ya se había observado
en el experimento presentado en el Capítulo 4. En color naranja oscuro se observa la cantidad
de Brain Methods eliminados por la herramienta Bandago. Este valor corresponde al
promedio entre las 5 soluciones generadas por cada método. En color amarillo se observa
también la cantidad de Brain Methods eliminados por la herramienta Bandago, pero en este
caso el valor representa la cantidad de Brain Methods eliminados en al menos una de las 5
soluciones generadas por cada método. Se debe recordar que cada una de las 5 soluciones corresponde a la mejor de otras 3 soluciones según el criterio definido en JDeodorant, el cual se replicó en la herramienta Bandago (Ver Capítulo 5).
Los resultados son similares a los obtenidos en el Experimento 1, si comparamos los resultados obtenidos previamente con los actuales observamos el mismo comportamiento en cada proyecto analizado. Esto se puede apreciar en la Figura 6.2
Figura 6.2 Cantidad de Brain Methods corregidos por JDeodorant y Bandago, antes y después de ser extendidos, por proyecto.
En este caso se observa que casi todos los nuevos Brain Methods introducidos en la
ejecución manual de JDeodorant (2 en el proyecto Cayenne, 1 en el proyecto Quartz) fueron corregidos en la ejecución automática. Más allá de esta diferencia, los resultados obtenidos de la ejecución automática de JDeodorant son los mismos que los obtenidos en la ejecución manual. Esto se debe a la baja cantidad de oportunidades de refactorización sugeridas en cada paso y a la poca interdependencia entre ellas, como se explicó anteriormente a partir de la Figura 4.8.
En el caso de la herramienta Bandago, esta se vio perjudicada levemente con la introducción del nuevo filtro. Esto se debe al tiempo que demora el algoritmo en buscar oportunidades de refactorización, y por lo tanto, la imposibilidad de explorar más soluciones dentro del límite de tiempo preestablecido por el usuario.
Al analizar la cantidad de Brain Methods eliminados con respecto a la cantidad inicial de Brain
Methods, se observa que los obtenidos por Bandago no son solamente buenos con respecto
a los resultados de la herramienta JDeodorant, sino que también son considerablemente
Figura 6.3 Cantidad de Brain Methods corregidos por JDeodorant y Bandago extendidos, por proyecto, expresada en porcentajes.
Nuevamente en la mayoría de los casos se supera la línea del 50%.
En resumen, los resultados obtenidos previamente y post implementación de las mejoras pueden ser comparados en la Figura 6.4.
Figura 6.4 Cantidad de Brain Methods corregidos por JDeodorant y Bandago extendidos, expresada en porcentajes.
En el caso de JDeodorant, la automatización del algoritmo produce en la gran mayoría de los casos los mismos resultados que la ejecución manual, dado que el proceso realizado de
forma manual es similar al algoritmo de Backtracking. Se exploran los nodos de una rama o
se vuelve hacia atrás en caso de producirse una solución no compilable. Debido a la baja cantidad de oportunidades de refactorización sugeridas y a la baja interdependencia de estas,
no hay muchas opciones nuevas por descubrir con un algoritmo de Backtracking. Sin
las oportunidades de refactorización, incluso cuando el cambio fue revertido, la aplicación automática resulta mucho más rápida que la aplicación manual, incluso descartando el tiempo que tarda el usuario en aplicar cada paso del algoritmo manual.
En cuanto a la performance, en la Figura 6.5 se observan los tiempos de ejecución de la herramienta JDeodorant, contando los casos cuando se encuentra y no encuentra solución. El tiempo promedio es de 22922 milisegundos, y la mediana de 7975 milisegundos. El tiempo máximo registrado fue de 185471 milisegundos, el cual por su cercania al tiempo maximo de ejecucion indica que este corresponde a una solución no encontrada dentro del tiempo preestablecido.
Figura 6.5 Tiempos de ejecución de la herramienta JDeodorant extendida.
En el caso de la herramienta Bandago, el estudio realizado por Berra Y Zuliani [10] indicaba que para el experimento anterior (correspondiente a la ejecución de Bandago sin
modificaciones utilizando el operador Random) la herramienta presentaba un tiempo
promedio de 35.29 segundos basado en 3 soluciones, con una desviación estándar de 0.37 segundos.
En la Figura 6.6 se observan los nuevos resultados obtenidos luego de aplicar las mejoras en Bandago. En este caso, el tiempo promedio de ejecución para hallar 3 soluciones fue de 55974 milisegundos, con una desviación estándar de 59284 milisegundos y una mediana de 33669 milisegundos. Para realizar este análisis se eliminaron los casos extremos,
principalmente donde el algoritmo devuelve una respuesta de forma instantánea (tiempo de ejecución menor a un segundo). El tiempo de ejecución máximo es de 50 segundos por solución, por lo tanto ninguna ejecución debería sobrepasar los 150 segundos. Sin embargo el algoritmo detecta el sobrepaso de dicho límite unos instantes después de haberlo excedido. Por lo tanto hay tiempos de respuesta mayores a ese número.
Figura 6.6Tiempos de ejecución de la herramienta Bandago extendida.
En la Tabla 6.1 se realiza una comparación de los tiempos de ambas herramientas y la variante original de Bandago. Como se puede observar en la tabla, los tiempos de respuesta para la generación de 3 soluciones se vieron afectados en promedio casi en un 60%, pasando de 35.29 segundos promedio a 55.97 segundos promedio. La desviación estándar muestra la gran variación entre los resultados obtenidos con respecto a la media aritmética. Si bien la media es de 55.97 segundos, los resultados de una gran cantidad de pruebas se alejan de este valor, habiendo durado estas desde unos pocos segundos hasta el tiempo máximo de ejecución permitido por el algoritmo, el cual se vio es un poco más de 3 veces mayor a la media aritmética (más de 150 segundos). Esto se debe a que la demora está directamente
relacionada con la utilización del filtro de sentencias basado en Program Slicing, el cual se
utiliza una cantidad aleatoria de veces en cada ejecución. Como se vio en el Capítulo 3, el
tiempo de ejecución de la técnica de Program Slicing es variable, dado que depende de las
Herramienta Tiempo promedio en generar 3 soluciones
Desviación estándar
JDeodorant Modificado 22.92 seg No Aplica
Bandago 35.29 seg 0.37 seg
Bandago Modificado 55.97 seg 59.28 seg
Tabla 6.1 Comparación de los tiempos de ejecución de JDeodorant y Bandago antes y después de ser extendido.
6.3 Conclusión
De este experimento se concluye que el enfoque original utilizado por Bandago es claramente
superior al propuesto por JDeodorant. La inclusión en Bandago del filtro de statements
basado en Program Slicing no produce mejores resultados, y afecta negativamente la
performance. En el caso de JDeodorant, la automatización de la herramienta permite obtener resultados notablemente más rápido que en la ejecución manual, pero la eficacia es muy similar a la de la aplicación manual.
En ningún caso los tiempos de ejecución fueron lo suficientemente buenos como para hacer estas herramientas más competitivas con respecto a la versión original de Bandago.
Capítulo 7: Conclusiones
En este trabajo final se presentó un estudio sobre 2 herramientas para la eliminación de Code
Smell de tipo Brain Method: JDeodorant y Bandago.
En primer lugar, se realizó una comparación de ambas herramientas y dado que esta comparación resulta difícil de realizar debido a los diferentes niveles de automatización de cada herramienta, se prosiguió a implementar en ambas herramientas las mejoras necesarias para realizar una comparación justa y determinar cuál de los dos enfoques es el más eficaz
y eficiente. En el caso de JDeodorant, se agregó una etapa de detección de Brain Methods y
se automatizó el proceso completo de refactorización para no requerir intervención del
usuario. Para esto, se utilizó un algoritmo de Backtracking dadas las características del
espacio de soluciones. En el caso de Bandago, se agregó un Filtro de sentencias (la herramienta que selecciona las sentencias de código candidatas a ser extraídas en cada paso
del proceso) basado en Program Slicing tal como lo implementa la herramienta Bandago.
Al comparar ambos enfoques se concluye que la herramienta JDeodorant se ve beneficiada en términos de performance pero muy sutilmente en términos de eficacia, mientras que la herramienta Bandago se ve afectada seriamente en términos de performance sin producir resultados muy diferentes. Por lo tanto, se concluye que el enfoque de selección de
oportunidades de refactorización basado en Program Slicing es limitado en términos de
eficiencia y perjudica el número de soluciones que puede generar Bandago en un determinado periodo de tiempo, haciendo que la versión original de Bandago sea la más
adecuada para resolver el problema de la eliminación de Brain Methods en proyectos Java.
7.1 Contribuciones
La contribución más importante de este trabajo es la comparación realizada en términos de eficacia y eficiencia entre las herramientas Bandago y JDeodorant. A la hora de desarrollar
herramientas para la eliminación de Brain Methods, esto contribuye a enfocar los esfuerzos
en las técnicas que producen los mejores resultados y de forma más eficiente.
Los beneficios de este trabajo no solo incluyen los resultados empíricos sino también las extensiones realizadas sobre las herramientas. Específicamente, se pueden resaltar las siguientes contribuciones:
● Utilización de la técnica de Program Slicing para la búsqueda de oportunidades de
refactorización: En este trabajo se demostró que la implementación de esta técnica vuelve ineficiente a las herramientas de software y esto impacta en la cantidad de soluciones y estados que pueden ser analizados en un determinado rango de tiempo. ● Validación del enfoque utilizado por Bandago: En este trabajo se concluyó que el
enfoque tomado por Bandago es mejor que el de otras herramientas analizadas.
● Implementación de etapa de detección de Code Smells en la herramienta JDeodorant:
En este trabajo se extendió la herramienta JDeodorant agregando una etapa de
detección de Brain Methods, lo cual ahorra trabajo al usuario y la necesidad de recurrir
a herramientas auxiliares.
● Automatización de la herramienta JDeodorant: En este trabajo se implementó un algoritmo que permite automatizar las etapas del proceso de refactorización en la herramienta JDeodorant de forma tal que no se requiera intervención del usuario.
7.2 Limitaciones
● Solo proyectos Java: Las herramientas Bandago y JDeodorant fueron desarrolladas para trabajar únicamente sobre proyectos Java. En este trabajo se mantuvo esta restricción y por lo tanto no se pudo realizar un análisis que abarque proyectos en otros lenguajes.
● Optimización de recursos: El algoritmo utilizado para la implementación de Program
Slicing no fue optimizado. Este punto es importante para los tiempos de ejecución de
las herramientas. Si se lograra acercar el tiempo de ejecución de esta técnica al de los filtros originales de Bandago, se podrían eliminar algunas desventajas de este enfoque y probablemente obtener mejores resultados. Un problema identificado en
esta implementación de Program Slicing por JDeodorant, es que no se encuentran
implementadas las funciones de comprobación de pre y post condiciones. Por lo tanto, muchos errores son capturados en etapas siguientes de los algoritmos reduciendo considerablemente la eficiencia de los mismos. En las mejoras realizadas en este trabajo tampoco se han implementado dichas comprobaciones.
● Solo refactoring extract method: Las herramientas, tanto en sus versiones originales
como las modificadas en este trabajo, solamente tienen en consideración refactorizaciones de tipo Extract Method. Existen otras refactorizaciones que pueden
ayudar también a la eliminación de este Code Smell. Entre ellas se encuentran: la
introducción de un objeto parámetro, descomponer condiciones, preservar objetos completos, y reemplazar variables temporales con consultas. Estas refactorizaciones
se podrían aplicar para poder eliminar los Brain Methods y obtener soluciones con
7.3 Trabajos futuros
De este trabajo se han identificado varias líneas de investigación futuras, algunas de las cuales fueron identificadas en la creación de la herramienta Bandago.
Si bien el refactoringExtract Method es muy eficiente para eliminar los Brain Methods, y es
la técnica más utilizada, aun así se pueden agregar diferentes técnicas de refactorización de
Brain Methods. Esto permitiría solucionar un porcentaje mayor de Brain Methods, ya que la
generación de soluciones sería más variada en cuanto a la aplicación de refactorizaciones. En el trabajo realizado por Berra y Zuliani [10] se recomendaba el análisis de una solución más eficiente a la hora de utilizar la API de refactorización del entorno de desarrollo Eclipse. Esta opción no fue analizada en este trabajo y por lo tanto sigue siendo vigente.
Como se mencionó en este capítulo, la eficiencia de la herramienta JDeodorant está estrechamente relacionada con la eficiencia del algoritmo de detección de oportunidades de
refactorización por medio de la técnica Program Slicing. Esta implementación podría ser
analizada y optimizada para mejorar la eficiencia de esta herramienta y todas las mejoras estudiadas en este trabajo.
Por otro lado, también se encontró que la herramienta JDeodorant no implementa los chequeos de pre y postcondiciones de refactorización para las extracciones de bloques de código dispersos, como los devueltos por la etapa de detección de oportunidades de
refactorización (Program Slicing). Esto es claramente un punto a considerar para mejorar la
performance de la herramienta y sus derivados estudiados en este trabajo.
Otro punto a mejorar es la función de evaluación de soluciones de la herramienta JDeodorant
para la solución de Brain Methods. Si se desea realizar un análisis más estricto de las
soluciones devueltas por esta herramienta, sin dar tanto énfasis solamente a la cantidad de
Brain Methods eliminados, se debería mejorar esta función. Por ejemplo, se podrían utilizar
ponderaciones más acordes a la realidad considerando el impacto y la importancia de cada métrica respecto a las demás, obteniendo estos valores de análisis empíricos. Por otro lado, podría realizarse una exploración completa del espacio de soluciones en lugar de detenerse al encontrar la primer solución. Sin embargo, para este trabajo no vale la pena realizar un
análisis tan estricto de la calidad de las soluciones, dado que la cantidad de Brain Methods
eliminados resulta de mayor importancia, y aun así esta herramienta no proporciona buenos resultados en comparación con Bandago.
Finalmente, en un nivel más amplio se podrían aplicar las mismas ideas estudiadas en este
Referencias
[1] Kandt, R. K. Software Engineering Quality Practices. Auerbach Publications, 2006.
[2] Lehman, M. M. The Programming Process, IBM Res. Rep. RC 2722, IBM Res. Centre,
Yorktown Heights, NY 10594, Sept. 1969.
[3] Lehman, M. M. Programs, Cities, Students, Limits to Growth?, Inaugural Lecture, May
1974. Publ. in Imp. Col of Sc. Tech. Inaug.l Lect. Ser., vol 9, 1970, 1974, pp. 211 - 229. Also in Programming Methodology, (D Gries ed.), Springer, Verlag, 1978, pp. 42 - 62.
[4] Lanza, M. & Marinescu, R. Object-Oriented Metrics in Practice. Springer, 2006.
[5] Fowler, M. Refactoring: Improving the Design of Existing Code. Addison-Wesley Longman
Publishing Co. Inc., Boston, MA, USA, 1999.