Академический Документы
Профессиональный Документы
Культура Документы
Qu es? Diferentes posibles soluciones Donde lo podemos encontrar en el iATS? Solucin a los casos encontrados en el iATS
Que es?
Code smell: Un code smell es un indicio de que algo esta mal en alguna parte en el cdigo y que este necesita un refactor para corregir dicho problema.
Que es?
Alternative classes with different interfaces: Si 2 clases son similares o iguales internamente, pero diferentes externamente, hablamos de clases alternativas con una interfaz diferente, y claramente estamos ante un code smell.
Que es?
Que problema nos genera esto? Si las clases similares tienen diferencias en sus interfaces, quien las use, tendr diferencias en la interaccin con cada una de las ellas. n cambio si las clases contaran con una interface com!n, quienes las usen podr"an traba#ar con cualquiera de las clases de forma uniforme, lo que significa una importante reduccin de cdigo duplicado y de posibles problemas.
Rename methods
*uando queremos ver lo que hace una clase con exactitud, o a la hora de iniciar el refactor si los nombres de los m%todos no son claros, se nos puede generar un inconveniente grande ya que tendremos que seguir todo el cdigo para ir entendiendo. +enombrar los m%todos de una clase nos puede ayudar a entender de una forma mas simple el cdigo, que este sea mas legible, que no sea necesario ver dentro del m%todo para saber que es lo que hace, y encontrar problemas ,necesidad de small refactors- entre otros beneficios.
Rename methods
$or e#emplo, nos podemos encontrar en una clase con un m%todo que sirve para obtener los botones que se agregaran en una toolbar de acciones, llamado 'get.ttns) que para saber lo que hace es necesario leer el cdigo dentro del m%todo si o si. Si en cambio nosotros renombramos este m%todo a 'get/ctions&oolbar.uttons) con solo ver el nombre nos alcanzar"a para entender de que se trata dicho m%todo.
Rename methods
0tra cosa que debemos tener en cuenta a la hora de renombrar los m%todos, para poder llegar a una solucin de este code smeel, es asegurarse que los nombres de los m%todos que realizan una misma accin dentro de las clases similares que vamos a refactorear, sean llamados de una misma forma, para que entonces quien use las clases, no deba conocer mas de una interfaz de comunicacin con ambas, para evitar el duplicado de cdigo a la hora de usarlas.
Si las clases '&oolbars) tienen una interfaz diferente, la clase que se encargue de implementar una u otra deber conocer las 2 interfaces, y tener contemplado en su cdigo el uso de ambas, generando el doble de cdigo, y un aumentando la posibilidad de error.
Code smell: Alternative classes with different interfaces
$ara corregir esto podemos empezar por hacer que los m%todos de una de las clases sean igual a los de la otra, pero usando m%todos nuevos que sean llamados por los vie#os.
set.uttonSelected 5 function,- 6 77 cdigo que hab"a antes en set.uttonSel 8 set.uttonSel 5 function,- 6 set.uttonSelected,-9 8
$or !ltimo eliminamos los m%todos de las clases hi#as que ya no usaremos mas1 set.uttonSel y setSelected
Move methods
*uando encontramos un m%todo que es usado en mas por otra clase que por la clase donde esta declarado, o internamente usa demasiadas propiedades o llamadas a otros m%todos de una clase externa, es evidente que estamos ante la necesidad de mover este m%todo a dicha clase externa. Utilizar esta metodolog"a hace que nuestras clases terminen siendo mas simples, y tengan menor posibilidad de fallas, ya que tienen menos responsabilidades. (uchas veces es dif"cil tomar la decisin de cambiar de lugar un m%todo, y normalmente, cuando la decisin es dif"cil de tomar, significa que en esos momentos no es tan importante el mover ese m%todo.
Code smell: Alternative classes with different interfaces
Move methods
n este caso debemos realizar algo parecido a lo que ya hab"amos visto. $ara dar el e#emplo en este caso voy a usar algo que hice hace 2 d"as en el i/&S.
!oluci"n al ejemplo
sto provocaba que si el attachment elegido por alguna razn necesitaba ser mostrado7usado de otra forma a la normal, termine siendo muy fea su implementacin, ya que deb"a agregar una condicin para ver que attachment hab"a sido elegido y en base a eso o solo actualizbamos el lin<, o hab"a que redibu#ar toda la U= de ese >idget. :a solucin era mover todo el cdigo de seleccin del attachment afuera de la clase /ttachment+ecord, y que esta funcionalidad sea implementada por /ttachment:ist, y que una vez que se seleccionaba el attachment, reci%n hay se instancie la clase hi#a, solo que esta vez, instancibamos /ttachment+ecord para los attachments normales, o una clase nueva, para el caso especial que se hab"a presentado.
Code smell: Alternative classes with different interfaces
!oluci"n al ejemplo
$ara realizar este cambio de forma correcta, se debe como primera instancia, controlar que m%todos son los que necesitan ser movidos, ver quien mas puede estar usndolos de forma externa y por ultimo, ver que cosas de la propia clase donde estaban declarados usaban y que al moverlos no "bamos a tener disponibles en forma directa. n ese anlisis encontr% que nadie mas usaba esos m%todos de forma externa, ni que tampoco usaban propiedades o otros m%todos de la clase donde estaba declarados, por lo que estos puntos no eran un problema que me traben o compliquen en el momento de mover el7los m%todos.
Code smell: Alternative classes with different interfaces
!oluci"n al ejemplo
&ambi%n vi que los m%todos a mover eran ?, el que abr"a el popup en cuestin, y 2 callers que eran usados al elegir un attachment, o al cancelar y cerrar el popup. Una vez terminado ese anlisis es hora de empezar a mover los m%todos. *omo primera medida, se declaran los ? nuevos m%todos en la clase donde se van a poner, acomodando si es necesario los nombres para que concuerden con su nuevo entorno.
!oluci"n al ejemplo
:uego copiamos todo el cdigo de los m%todos de la clase hi#a a la clase que los va a recibir, y acomodamos las llamadas a otros m%todos, o uso de propiedades seg!n sea necesario para que funcionen en la nueva clase. Una vez hecho esto podemos hacer que la clase que recibi los nuevos m%todos haga uso de estos, y que la clase que aun los tiene ,pero que va a de#ar de tenerlos- de#e de usarlos. *uando vemos que esta todo o< a este punto, podemos eliminar de la clase original los m%todos que copiamos en la clase externa, as" como todo lo relacionado a su uso ,calls y properties-.
Code smell: Alternative classes with different interfaces
Resultado de la soluci"n
Clases originales
Asi quedaran
Una vez que tenemos esto hecho, podemos controlar los m%todos que hacen cosas similares que quedaron en las clases que heredan, para ver si tienen cdigo que puedan compartir, en este caso, pondremos ese cdigo en un m%todo separado en la clase padre, y que los m%todos que quedan en las clases que heredan lo llamen.
*uando 3 o mas clases tienen demasiadas lineas de cdigo, o tienen muchas funcionalidades, es seguro que debemos extraer parte de ese cdigo como una sub clase. $or e#emplo supongamos que tenemos una clase 2ie>*ontact=nfo, y que la usamos para mostrar los datos de contacto de una entidad de nuestra aplicacin.
sta clase podr"a tener un montn de cdigo extra, ya que debe conocer como mostrar los diferentes datos seg!n el tipo de contacto que es.. $hone, mail, Aebsite, etc. Bosotros podr"amos extraer como se muestra cada "tem en particular en una clase diferente, y as" hacer que cada una solo tenga una responsabilidad, y poco cdigo.
$ara llevar a cabo esto, teniendo como e#emplo lo que comentamos sobre una clase 2ie>*ontact=nfo, primero deberemos, analizar que partes de la clase, podemos separar, teniendo en cuenta que su funcionalidad, no sea especifica de la clase padre, si no que sea un pedasito especifico de esta.
/dvaced Searches &as< and vent editors +esult=tems del search page mailSender.php y (ailSender.php =nputs del @0( e =nputs nuestros ,.get2alue and .value@iferentes tipos de tests ,de ui, unit&ags (anager
Code smell: Alternative classes with different interfaces
Advanced searches
n los advance search en varios caso se podr"a usar ' xtract Sub *lass), ya que tenemos casos por e#emplo de clases que tienen m%todos1 update:ocation3, update:ocation2, update:ocation?
/c tenemos varias veces ifs grandes controlando de que tipo es el "tem. Bosotros podr"amos xtraer una *lase nueva que se encargue de instanciar el tipo de "tem
mailSender y (ailSender son para lo mismo, pero tienen interfaces diferentes, ac hay que eliminar (ailSender que es el mas incompleto y usar siempre el otro.
!istema de
ests
Sistema de &ests, tenemos diferentes tipos de tests y sus interfaces no son iguales ,&est de U=, Unit &est de U=, Unit &est de $;$-. (i conocimiento es demasiado bsico en esta parte, y adems el problema es muy grande, por lo que no podr"a nombrar as" nomas una solucin, solo nombro el problema y la solucin la podemos charlar entre todos.
a& Mana&er
l &ag(anager funciona tal cual lo har"a un @atasource, por ende lo que hay que hacer es usar un @atasource en su lugar.