Published articles on other web sites*

Published articles on other web sites*

Joan Llenas at garnet.io :: Thoughts on software development: Filtros reusables para ICollectionView.filterfunction

Joan Llenas at garnet.io :: Thoughts on software development: Filtros reusables para ICollectionView.filterfunction: "
Siguiendo con el mismo ejemplo del post anterior introduzco una mejora notable para conseguir eliminar la duplicación de código existente en los filtros.






Para no reinventar las funciones de filtrado cada vez que las necesitamos podemos abstraer un poco la funcionalidad y crear una base sobre la que poder construir fácilmente una librería de filtros, que a menudo suelen ser los mismos.

Para empezar crearemos una sencilla interfaz para no tener que ir a la documentación cada vez que queramos implementar el filtro a revisar la firma de ICollectionView.filterFunction.


Actionscript:



  1. package filters


  2. {


  3. public interface ICollectionFilter


  4. {


  5. function filterFunction(item:Object):Boolean;


  6. }


  7. }






A continuación implementaremos el filtro, en este caso se trataba de un filtro que obtenía el valor aceptado del filtro desde un TextInput.


Actionscript:



  1. package filters


  2. {


  3. import spark.components.TextInput;




  4. public class TextInputFilter implements ICollectionFilter


  5. {


  6. private var textInput:TextInput;


  7. private var filterFields:Array;




  8. public function TextInputFilter(textInput:TextInput, filterFields:Array)


  9. {


  10. this.textInput = textInput;


  11. this.filterFields = filterFields;


  12. }




  13. public function filterFunction(item:Object):Boolean


  14. {


  15. var filterText:String = textInput ? textInput.text.toLocaleLowerCase() : '';


  16. var match:Boolean = false;


  17. var len:int = filterFields.length;


  18. for (var i:uint = 0; i )


  19. {


  20. var field:String = filterFields[i];


  21. var value:String = String(item[field]).toLowerCase();


  22. if (value.indexOf(filterText)> -1)


  23. {


  24. match = true;


  25. break;


  26. }


  27. }


  28. return match;


  29. }


  30. }


  31. }






Finalmente instanciaremos los filtros para cada colección.


Actionscript:



  1. // ....


  2. import filters.TextInputFilter;




  3. private function createFilterFunctions():void


  4. {


  5. dp1.filterFunction = new TextInputFilter(filterText1, [ 'Nombre', 'Album' ]).filterFunction;


  6. dp2.filterFunction = new TextInputFilter(filterText2, [ 'Nombre', 'Album' ]).filterFunction;


  7. }


  8. // ....






Por lo demás el ejemplo es el mismo. Se puede ver que reducimos el número de líneas de código de forma considerable, en gran medida por la eliminación de la duplicación de código. Además el código es mucho más sencillo de leer/entender.

En mi otro blog (en inglés) escibí algo parecido pero tratando las labelFunction de los componentes de lista, para las cuales se puede aplicar exactamente el mismo principio, de hecho cualquier clase que exponga una función a modo de estrategia puede refactorizarse para seguir este principio. Los beneficios son bastante obvios.

Descarga ejemplo


En el zip hay un proyecto Flex4 para Flash Builder.



"

No comments:

Post a Comment

Related Posts Plugin for WordPress, Blogger...