Чистый статический класс против синглтона - PullRequest
2 голосов
/ 16 апреля 2011

Написание PHP-приложения и несколько классов, которые только имеют статические методы (нет необходимости в методах экземпляра).Примером является NumericValidator, который имеет методы, такие как checkInteger($toCheck), который проверяет, чтобы убедиться, что передаваемый аргумент имеет тип int, и checkGreaterThan($lOperand, $rOperand), который гарантирует, что левый операнд больше правого операнда,и т.д.

Я знаю, что мог бы просто выбросить каждый из этих методов в файл PHP, не помещая их в класс, но я хочу использовать здесь ООП-подход в случае развития APIтребовать создания экземпляра NumericValidator.

Но возникает вопрос: как класс со 100% -ными статическими методами отличается от класса, реализующего шаблон проектирования Singleton, где каждая ссылка, используемая в базе кода, вызываеттот же экземпляр?

Например, вот как теперь выглядит мой код:

public function doSomething($p_iNum)
{
    if(!NumericValidator::checkInteger($p_iNum))
        // throw IllegalArgumentException

    // ...
}

Но я мог бы включить все статические методы NumericValidatorв нестатические методы экземпляров, вынуждая программиста создавать его экземпляры, а затем реализовывать одноэлементный шаблон проектирования, чтобы вы могли ссылаться только на 1 его экземпляр:

public function doSomething($p_iNum)
{
    NumericValidator $nv = NumericValidator::getInstance();

    if(!nv->checkInteger($p_iNum))
        // throw IllegalArgumentException

    // ...
}

Наконец, мой вопрос: что лучше и лучше соответствует передовому опыту? Есть ли какие-то соображения по поводу производительности?Как такой подход повлияет на такие вещи, как параллелизм или запросы от нескольких пользователей?

Ответы [ 2 ]

1 голос
/ 16 апреля 2011

Я бы использовал статический класс в вашем примере.Я использовал бы дифференциатор, если есть какое-либо состояние свойств экземпляра, который вы пытаетесь сохранить при доступе.Это то, для чего предназначен синглтон.Статический класс предоставляет организованный доступ к методам в пространстве имен, что полезно для ясности в вашем коде, но не имеет никаких свойств о себе.

Так что да, вы можете использовать синглтон, но это было бы плохо, потому чтонет свойств экземпляра, которые вы хотите сделать доступными при доступе к странице.

Надеюсь, это поможет.

0 голосов
/ 16 апреля 2011
  1. Используйте Singleton вместо статического класса, только если вы собираетесь передать экземпляр NumericValidator в переменную некоторой функции.
  2. В PHP 5.3 вы можете получить экземпляр статического класса:

    class test {public static function instance () {print 'zz';}}

    $ z = новый тест;$ z-> instance ();

  3. Не обращайте внимания на запросы параллелизма в PHP, он однопоточный, каждый процесс выполняет собственный код.

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