2010-03-08 4 views
1

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

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

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

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

Мог ли я создать суперкласс superHelper, который является одноэлементным классом, а затем пусть каждый помощник расширяет его.

Будет ли это работать, или есть другая альтернатива?

И если он работает, есть ли у кого-нибудь какие-либо предложения о том, как закодировать такой класс superHelper.

Спасибо ребята

+0

Поддерживают ли ваши классы-помощники какое-либо состояние, или могут ли их методы быть статическими? –

+0

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

ответ

0

Я не могу передать переменную, это будет слишком много работы.

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

Таким образом, вы можете поместить общие функции в глобальную область действия по-разному в php. Самое простое - использовать глобальную функцию. Например. функция, не принадлежащая ни одному классу. Другой вариант - использовать метод статического класса. Эти два очень похожи; за исключением их синтаксиса, они по существу имеют те же свойства. Немного ослабленное решение состоит в том, чтобы поместить функциональность как метод в (абстрактный) базовый класс, из которого простирается ваш конкретный класс. Это разделяет функциональность между всеми дочерними классами.

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

Если вам нужно приложение с ослабленным соединением, вы можете попытаться заменить жесткую зависимость переменной, чтобы дать уровень косвенности. Простота - создать объект и сделать его общим в глобальном масштабе по всему приложению.Существует несколько способов сделать это в PHP, например, singleton или просто переменную в глобальной области (вы можете получить к ней доступ с помощью ключевого слова global или массива $GLOBALS).

Хотя глобальные переменные предлагают уровень косвенности, они также имеют тенденцию вводить много сложностей, так как они очень трудно понять, какие части приложения зависят друг от друга. По этой причине их часто избегают опытные программисты. Это особенно верно, если переменная имеет состояние; Проблема менее распространена, если общий объект не имеет статуса.

Единственный способ избежать опасностей глобальных переменных - использовать вместо этого локальные переменные. Например. Чтобы передать зависимости. Это может быть немного хлопот, но по моему опыту это часто не такая большая проблема, как это было сделано. По крайней мере, преимущества часто перевешивают проблемы. Тем не менее, есть способы облегчить боль; В частности, контейнеры для инъекций зависимых, которые являются автоматическими фабриками, которые заботятся обо всех проводках для вас. Однако они приходят со своим уровнем сложности, но для более крупных приложений они, безусловно, могут быть хорошим решением.

+0

Спасибо за ответ, я понимаю вверх и вниз для каждой точки. Я попытаюсь просто передать помощников в локальных переменных. –

-1

Хотя иногда необходимо, одноэлементные зло (потому что они глобальное состояние). Старайтесь избегать их, если вы можете помочь.

EDIT: Если вы не можете избежать одиночных игр, по крайней мере, параметризуйте ссылку на это состояние. Другими словами, в классе перейдите в singleton к его конструктору или к тем методам, которые используют singleton.

Простое использование ссылок по всей вашей кодовой базе на ваш синглтон будет скомпрометировать вашу способность тестировать классы изолированно.

Если ваш синглтон сдержанный, ваши тесты внезапно станут работоспособными, и ваши тесты могут начаться с «каскадного сбоя», потому что их предварительные условия повреждаются в результате неудачных тестов.

+0

Комментарий, поясняющий нижний предел, будет оценен по достоинству. –

+0

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

0

Вы не можете расширить класс одноплодной. Помните, что в одиночном классе мы делаем конструктор частным, поэтому, если конструктор является закрытым, чем как вы можете расширить этот класс? Мы все знаем, что мы создаем объект класса, который мы называем его конструктором, и в конструкторе дочернего класса он неявно называется родительским конструктором. Таким образом, в этом случае частный конструктор не может быть вызван в дочернем классе.