Я добавлю еще несколько слов к путанице и скажу:
Вам не нужно, чтобы один метод проверял ваши значения. Сегодня достаточно просто передать массив допустимых значений. Но завтра у вас будет что-то вроде адреса электронной почты для проверки, а затем вам понадобится метод, который проверяет соответствие RegEx. Возможно, на следующей неделе вам нужно будет проверить набор значений, который получен из контекста, из которого было взято значение, и так далее ...
Использование наследования в этом контексте, как было предложено в одном комментарии, не очень хорошая идея - вы будете тесно связывать свои проверки с остальным кодом, и рано или поздно вы обнаружите, что меняете много вещей, когда только простой вызов проверки должен был измениться. То же самое относится и к служебному классу: вы обнаружите, что используете ссылку на этот класс много раз, и если вы когда-нибудь захотите изменить свой метод проверки, вам придется учесть множество изменений во многих местах.
Итак, в хорошем ОО-стиле лучше всего использовать интерфейс, назовем его Validator
и пусть все ваши проверяющие классы реализуют его:
public interface Validator {
function validate ( value : * ) : Boolean;
}
Кстати, это также основная причина не использовать статический класс: в ActionScript нет статических интерфейсов.
Теперь для некоторых классов. Давайте начнем с вашего собственного метода проверки, основанного на массиве значений:
public class ArrayValidatorImpl implements Validator {
private _validValues : Array;
public function validate ( value : * ) : Boolean {
return value in _validValues;
}
public function ArrayValidatorImpl (validValues:Array ) {
_validValues = validValues;
}
}
... и электронная почта:
public class EmailValidatorImpl implements Validator {
public function validate ( value : * ) : Boolean {
var reg:RegExp = /(^[a-z0-9_\+-]+(\.[a-z0-9_\+-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*\.(ac|ad|ae|aero|af|ag|ai|al|am|an|ao|aq|ar|arpa|as|asia|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|biz|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cat|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|com|coop|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|edu|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gov|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|info|int|io|iq|ir|is|it|je|jm|jo|jobs|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mil|mk|ml|mm|mn|mo|mobi|mp|mq|mr|ms|mt|mu|museum|mv|mw|mx|my|mz|na|name|nc|ne|net|nf|ng|ni|nl|no|np|nr|nu|nz|om|org|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|pro|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tel|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|travel|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|xn|ye|yt|yu|za|zm|zw{2,4})$)/;
return reg.exec( value.toString() );
}
}
В любое время, когда вам требуется проверка, вы можете просто передать экземпляр интерфейса нужному классу, например:
public class MyValidatingClass {
private var _validator:Validator;
public function myGreatMethod ( myValue : * ) : void {
if( _validator.validate( myValue ) ) doStuffWith( myValue );
}
// ...
public function MyValidatingClass( validator:Validator ) {
_validator = validator;
}
}
Если ваши требования изменятся, вы можете просто пропустить другую реализацию, не прибегая к повторному прикосновению к коду для MyValidatingClass
. Чистый, простой, слабо связанный - и готовый к повторному использованию в следующей написанной вами программе. И тот, что после этого. И так далее ...