Где правильно хранить часто используемые функции в ООП - PullRequest
0 голосов
/ 28 марта 2012

Я работаю над проектом, который хочу создать ОО.Теперь я пришел с функцией, которая проверяет или допустимо значение.

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

Как видите, функция очень общая и будет доступна для разных классов.Теперь мой вопрос:где хранить в ОО правильном порядке?

Заранее спасибо!

Ответы [ 5 ]

5 голосов
/ 29 марта 2012

Я добавлю еще несколько слов к путанице и скажу:

Вам не нужно, чтобы один метод проверял ваши значения. Сегодня достаточно просто передать массив допустимых значений. Но завтра у вас будет что-то вроде адреса электронной почты для проверки, а затем вам понадобится метод, который проверяет соответствие 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. Чистый, простой, слабо связанный - и готовый к повторному использованию в следующей написанной вами программе. И тот, что после этого. И так далее ...

4 голосов
/ 28 марта 2012

Я бы написал статический класс (например, "Utility"), а затем вызвал бы метод в других классах, таких как:

Utility.valid(...)

Я думаю, в AS3 вы пишете статический метод вроде:

public static function valid(...)
2 голосов
/ 29 марта 2012

Хотя, этот Синглтон был бы приемлемым ответом на этот вопрос, я бы подумал, что это будет немного убитьТем не менее, я публикую это как ответ Эми Бланкеншип.Поэтому постарайтесь не голосовать за много.

// USAGE: is as simple as importing the class and then calling the method you want.
import com.utils.validate

// and then simple just doing
Validate.valid( someValue, someArray)

// Validate.as

package com.utils{
  import flash.utils.getDefinitionByName;
  import mx.core.Singleton;

  public class Validate{
    //private static var implClassDependency:ValidateImpl;
    private static var _impl:IValidate;

    // static methods will call this to return the one instance registered 
    private static function get impl():IValidate{
      if (!_impl)   {
        trace( 'registering Singleton Validate' )
        Singleton.registerClass("com.utils::IValidate",com.utils.ValidateImpl);
        _impl = IValidate( Singleton.getInstance("com.utils::IValidate"));
      }
      return _impl;
    }

    public static function valid(value:*, acceptedValues:Array):Boolean {
      return impl.valid( value, acceptedValues )
    }
  }
}

// IValidate.as

package com.utils{
  public interface IValidate {
    function valid(value:*, acceptedValues:Array):Boolean;
  }
}

// ValidateImpl.как

package com.utils{
  [ExcludeClass]
  // we can extends a class here if we need 
  public class ValidateImpl implements IValidate{
    // the docs say we need to include this but I donno about that
    // include "../core/Version.as";

    public function ValidateImpl (){
      // call super if we are extending a class
      // super();
    }

    // instance will be called automatically because we are registered as a singleton
    private static var instance:IValidate;
    public static function getInstance():IValidate{
      if (!instance)
        instance = new ValidateImpl()
        return instance;
      }
    }

    private function valid(value:*, acceptedValues:Array):Boolean {
      for(var i:uint = 0; i < acceptedValues.length; i++) {
        if (value == acceptedValues[i]) {
          return true;
        }
      }
      return false;
    }
}
0 голосов
/ 28 марта 2012

Функции уровня пакета:

validate.as :

package utils 
{
    public function validate(array:Array, clazz:Class):Boolean
    {
        var flag:Boolean = true;

        for each(var obj:* in array)
        {
            if (!(obj is clazz))
            {
                flag = false;
                break;

            }// end if

        }// end for each

        return flag;

    }// end function

}// end package

Main.as (класс документа) :

package 
{
    import flash.display.Sprite;
    import flash.events.Event;
    import utils.validate;

    public class Main extends Sprite 
    {
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            var array1:Array = ["a", "b", "c"];
            var array2:Array = ["a", "b", 3];

            trace(validate(array1, String)); // output: true
            trace(validate(array2, String)); // output: false

        }// end function

    }// end class

}// end package
0 голосов
/ 28 марта 2012

Создайте вспомогательный класс, который вы можете затем предоставить классам, которые в нем нуждаются.Например, у Flex есть специальный класс под названием Validator, который используется таким образом.Вы можете скачать Flex SDK и посмотреть на класс, чтобы увидеть, как он написан.

Использование будет примерно таким:

protected var validator = new IsStringInArrayValidator();

//...

validator.validate(someString, someArray);

В качестве альтернативы, вы можете использовать

valid = (someArray.indexOf(someString) > -1);

Что может быть недостаточно сложным, чтобы беспокоиться о его инкапсуляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...