以OOP正确方式存储常用功能的位置

SKu*_*ers 0 oop scope actionscript-3

我正在开展一个我想建立OO的项目.现在我带来了一个检查或值有效的函数.

private function valid(value:*, acceptedValues:Array):Boolean {
   for(var i:uint = 0; i < acceptedValues.length; i++) {
        if (value == acceptedValues[i]) {
            return true;
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

如您所见,该函数非常通用,可以跨不同的类访问.现在我的问题是; 我在哪里以正确的方式存储它?

提前致谢!

wel*_*rat 5

我会在混乱中添加更多输入并说出来:

您不需要一种方法来验证您的值.今天,只传递一组有效值就足够了.但是明天,你会有类似电子邮件地址的东西来验证,然后你需要一个验证RegEx的方法.也许下周,你需要验证一组值,这些值来自取值的上下文,依此类推......

正如一条评论建议的那样,在这种情况下使用继承并不是一个好主意 - 你会将你的验证与其余的代码紧密结合,迟早你会发现自己只是通过一个简单的验证就会改变很多东西.电话应该已经改变了.对于实用程序类也是如此:您会发现自己多次使用该类引用,如果您选择更改验证方法,则必须适应许多地方的大量更改.

所以,以优秀的OO方式,你最好使用一个接口,让我们调用它Validator,让你所有的验证类实现它:

public interface Validator {
    function validate ( value : * ) : Boolean;
} 
Run Code Online (Sandbox Code Playgroud)

顺便说一句,这也是不使用静态类的最终原因: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;
    }
}
Run Code Online (Sandbox Code Playgroud)

......和电子邮件一:

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() );
    } 
}
Run Code Online (Sandbox Code Playgroud)

您现在需要验证时,只需将接口实例传递给需要它的类,例如:

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;
    }
}  
Run Code Online (Sandbox Code Playgroud)

如果您的需求发生变化,您可以简单地传递不同的实现,而无需MyValidatingClass再次触摸代码.干净,简单,松散耦合 - 随时可以在您编写的下一个程序中重复使用.然后是那个.等等...