DClick

Classes associadas e Factory method pattern



O uso de validação de formulários do lado do cliente é uma pratica muito comum em aplicações web, para não haver inconsistência nos dados quando forem enviados para a base de dados.

Bem, esses dias em visita a um dos nossos clientes deparei com um problema que ele estava tendo com validação de uma classe extendida do TextInput. Só que essa nova classe seria base para outras classes de Input do sistema, que necessitavam de validação para números, data, hora ou qualquer outro campo de inserção de dados. A solução encontrada foi bem simples, porém bem interessante, pois sempre estamos usando classes associadas como TextInput e Validator. Então porque não utilizamos uma class TextInput que já contenha o Validator e deixamos subclasses decidirem qual classe instanciar do validator? Isso mesmo, este é o conhecido Factory method pattern.

Veja com ficou o diagrama de classes:

Actionscript:
  1. package tiv
  2. {
  3. import flash.events.Event;
  4.  
  5. import mx.controls.TextInput;
  6. import mx.events.ValidationResultEvent;
  7. import mx.validators.Validator;
  8.  
  9. public class TextInputValidator extends TextInput
  10. {
  11. public function TextInputValidator():void
  12. {
  13. this.validator = new Validator();
  14. }
  15.  
  16. private var _validator : Validator;
  17. protected function set validator(value:Validator):void
  18. {
  19. value.requiredFieldError = "Campo requerido";
  20. value.source             = this;
  21. value.property           = "text";
  22. value.required           = false;
  23.  
  24. _validator = value;
  25.  
  26. this.addEventListener(Event.CHANGE , function(event:Event):void
  27. {validate();}            );
  28. }
  29.  
  30. protected function get validator():Validator
  31. {
  32. return _validator;
  33. }
  34.  
  35. [Inspectable(category="General", defaultValue="false")]
  36. public function set required(value:Boolean):void
  37. {
  38. this.validator.required = value;
  39. }
  40.  
  41. public function get required():Boolean
  42. {
  43. return validator.required;
  44. }
  45.  
  46. public function validate():Boolean
  47. {
  48. return validator.validate().type == ValidationResultEvent.VALID;
  49. }
  50.  
  51. public function clear():void
  52. {
  53. //esse eh para que quando limparmos o campo ele nao ficar cem vermelho.
  54. var _required : Boolean = this.required;
  55. this.required = false;
  56.  
  57. this.text = "";
  58. this.validate();
  59.  
  60. this.required = _required;
  61. }
  62. }

Actionscript:
  1. package tiv
  2. {
  3. import mx.validators.EmailValidator;
  4. import tiv.TextInputValidator;
  5.  
  6. public class TextInputEmailValidator extends TextInputValidator
  7. {
  8. public function TextInputEmailValidator():void
  9. {
  10. this.validator = new EmailValidator();
  11. }
  12.  
  13. }
  14. }
  15. <p class="western" style="margin-bottom: 0cm;" align="left">[/code]</p>
  16.  
  17. <p class="western" style="margin-bottom: 0cm;" align="left">[code]package tiv
  18. {
  19. import mx.validators.DateValidator;
  20. import tiv.TextInputValidator;
  21.  
  22. public class TextInputDateValidator extends TextInputValidator
  23. {
  24. public function TextInputDateValidator():void
  25. {
  26. this.validator = new DateValidator();
  27.  
  28. }
  29.  
  30. public function set inputFormat(value:String):void
  31. {
  32. DateValidator(this.validator).inputFormat = value;
  33. }
  34.  
  35. public function get inputFormat():String
  36. {
  37. return DateValidator(this.validator).inputFormat;
  38. }
  39.  
  40. }

Actionscript:
  1. package tiv
  2. {
  3. import mx.validators.NumberValidator;
  4. import tiv.TextInputValidator;
  5.  
  6. public class TextInputNumberValidator extends TextInputValidator
  7. {
  8. public function TextInputNumberValidator():void
  9. {
  10. this.validator = new NumberValidator();
  11. this.restrict = "[0-9]";
  12. }
  13.  
  14. public function set maxValue(value:Object):void
  15. {
  16. NumberValidator(this.validator).exceedsMaxError   = "o numero excedeu o valor maximo : " + value;
  17. NumberValidator(this.validator).maxValue = value;
  18. }
  19.  
  20. public function get maxValue():Object
  21. {
  22. return NumberValidator(this.validator).maxValue;
  23. }
  24.  
  25. public function set minValue(value:Object):void
  26. {
  27. NumberValidator(this.validator).lowerThanMinError = "o numero eh menor que o valor minimo : " + value;
  28. NumberValidator(this.validator).minValue = value;
  29. }
  30.  
  31. public function get minValue():Object
  32. {
  33. return NumberValidator(this.validator).minValue;
  34. }
  35. }

Veja como ficou:

Por Felipe Tomaz em 12/August/2008 | Comentar | Trackback


No Translations

2 comentários para “Classes associadas e Factory method pattern”


Parabens, Filipe. Ontem usei suas classes e são show de bola. São facil de usar e modificar para casos especificos.
Obrigado por ter compartilhado isto.


mto legal essa estrtura….

Adicionar comentário

(requerido)
(requerido, não será publicado)