Estoy escribiendo un cliente de aplicaciones JS. El usuario puede editar la lista/árbol de elementos de texto (por ejemplo, una lista de tareas pendientes o notas). Manipulo DOM con jQuery mucho.¿Cómo evitar el código duplicado cuando se opera en DOM en la dirección "arriba" y "abajo"?
El usuario puede navegar por la lista hacia arriba y hacia abajo usando el teclado (similar a las teclas J/K en GMail), y realizar varias otras operaciones. Muchas de estas operaciones tienen una funcionalidad espejo "arriba"/"abajo", p.
$.fn.moveItemUp = function() {
var prev = this.getPreviousItem();
prev && this.insertBefore(prev);
// there's a bit more code in here, but the idea is pretty simple,
// i.e. move the item up if there's a previous item in the list
}
$.fn.moveItemDown = function() {
var next = this.getNextItem();
next && this.insertAfter(next);
// ....
}
Ahora este patrón de tener dos funciones casi idénticas se repite en varios lugares en mi código, porque hay muchas operaciones en la lista/árbol de elementos que son más o menos simétrica.
PREGUNTA: ¿Cómo puedo refactorizar esto elegantemente para evitar la duplicación de código?
La forma trivial me ocurrió hasta ahora es utilizar .apply() ...
$.fn.moveItem = function(direction) {
var up = direction === 'up',
sibling = up ? this.getPreviousItem() : this.getNextItem(),
func = up ? $.fn.insertBefore : $.fn.insertAfter;
// ...
if (! sibling) { return false; }
func.apply(this, [ sibling ]);
// ...
};
El beneficio es un mantenimiento más fácil cuando la estructura de otros elementos del código requiere cambiar moveUp/moveDown. Ya he necesitado cambiar ligeramente el código varias veces, y siempre tengo que tener en cuenta que tengo que hacerlo en dos lugares ...
Pero no estoy contento con la versión "unificada", porque:
- La implementación es más complicada que el simple moveUp/moveDown, por lo tanto, en el futuro puede que NO sea tan fácil de mantener después de todo. Me gusta el código simple Todos estos parámetros, operaciones ternarias, .aplicar() trucos en cada función que se supone que va "arriba" y "abajo" ...
- No estoy seguro de si es seguro referirse a funciones jQuery.fn. * Explícitamente (después de todo se supone que deben utilizarse aplicándolos a jQuery object $ ('...'). *)
¿Cómo se resuelven esas situaciones de "código casi idéntico" cuando se trabaja con DOM o una estructura similar?
BTW
hugomg