Кому нужны синглтоны в PHP?
Обратите внимание, что почти все возражения против синглетонов исходят с технической точки зрения - но они также ОЧЕНЬ ограничены в своих масштабах.Специально для PHP.Сначала я перечислю некоторые причины использования синглетонов, а затем проанализирую возражения против их использования.Во-первых, люди, которые нуждаются в них:
- Люди, которые кодируют большую платформу / кодовую базу, которая будет использоваться во многих различных средах, должны будут работать с ранее существовавшими различными фреймворками / кодовыми базами, снеобходимость выполнения множества различных, изменяющихся, даже причудливых запросов от клиентов / начальников / руководителей / руководителей подразделений.
Видите, шаблон синглтона самодостаточен.Когда это сделано, одноэлементный класс становится жестким для любого кода, в который вы его включаете, и он действует точно так же, как вы создали его методы и переменные.И это всегда один и тот же объект в данном запросе.Поскольку его нельзя создать дважды, чтобы он представлял собой два разных объекта, вы знаете, что такое одноэлементный объект в любой заданной точке кода - даже если он добавляется в две, три разные, старые, даже спагетти-базы кода.Таким образом, это облегчает задачу разработки - даже если в этом проекте работает много людей, когда вы видите, что синглтон инициализируется в одной точке в любой заданной кодовой базе, вы знаете, что это такое, что он делает, как онделает, и состояние, в котором он находится. Если бы это был традиционный класс, вам нужно было бы отслеживать, где был создан этот объект, какие методы были вызваны в нем до этой точки в коде, и его конкретное состояние.Но, поместите туда синглтон, и если вы упустили правильные методы отладки и информации и отслеживание в синглтоне во время его кодирования, вы точно знаете, что это такое.Таким образом, это облегчает работу людей, которым приходится работать с различными кодовыми базами, с необходимостью интеграции кода, который был сделан ранее с использованием различных философий или сделан людьми, с которыми вы не имеете отношения.(то есть, вендор-проект-компания-что там больше нет, поддержки нет ничего).
- Люди, которым нужно работать с API сторонних производителей , сервисами ивеб-сайты.
Если вы посмотрите поближе, это не слишком отличается от предыдущего случая - сторонние API, сервисы, веб-сайты похожи на внешние, изолированные кодовые базы, над которыми вы НЕТ контроля.Все может случиться.Таким образом, с помощью одноэлементного сеанса / пользовательского класса вы можете управлять ЛЮБОЙ реализацией сеанса / авторизации от сторонних поставщиков, таких как OpenID , Facebook , Twitter имногие другие - и вы можете делать это ВСЕ одновременно из одного и того же объекта-одиночки - который легко доступен, в известном состоянии в любой точке любого кода, к которому вы подключаете его.Вы даже можете создать несколько сеансов для нескольких разных сторонних API / сервисов для ОДНОГО ЖЕ пользователя в своем собственном веб-сайте / приложении и делать с ними все, что хотите.
Конечно, все это такжеможет быть тон с традиционными методами, используя обычные классы и объекты - суть в том, что синглтон аккуратнее, аккуратнее и, следовательно, из-за того, что управляемый / тестируемый легче по сравнению с традиционным использованием классов / объектов в таких ситуациях.
- Люди, которым нужно быстрое развитие
Глобальное поведение синглетонов облегчает создание любого вида кода с каркасом, в котором есть набор синглетонов, потому что, как только вы хорошо сконструируете свои синглтон-классы, установившиеся, зрелые и установленные методы будутлегко доступны и доступны в любом месте, в любое время, в согласованном порядке.Созревание ваших классов занимает некоторое время, но после этого они становятся твердыми, последовательными и полезными.Вы можете иметь столько методов в одном объекте, которые делают все, что вы хотите, и, хотя это может увеличить объем памяти объекта, это приносит гораздо большую экономию времени, необходимого для быстрой разработки - метод, который вы не используете в одном конкретном случаеприложение может быть использовано в другом интегрированном приложении, и вы можете просто добавить новую функцию, которую клиент / руководитель / менеджер проекта запрашивает всего несколькими изменениями.
Вы поняли идею.Теперь давайте перейдем к возражениям против синглетонов и нечестивому крестовому походу против чего-то полезного :
- Главное возражение состоит в том, что это затрудняет тестирование.
И действительно, в некоторой степени это происходит, даже если его можно легко смягчить, приняв надлежащие меры предосторожности и запрограммировав процедуры отладки в свои синглтоны С осознанием того, что вы будете отлаживать синглтон.Но, видите, это не слишком отличается от ЛЮБОЙ другой философии / метода / паттерна кодирования, которая существует - просто синглтоны относительно новы и не получили широкого распространения, поэтому современные методы тестирования оказываются сравнительно несовместимыми с ними.Но это не отличается ни в одном аспекте языков программирования - разные стили требуют разных подходов.
С одной стороны, это возражение не имеет смысла, поскольку оно игнорирует тот факт, что разрабатываемые приложения не предназначены для «тестирования», и тестирование - не единственная фаза / процесс, который входит в разработку приложения.Приложения разрабатываются для производственного использования.И, как я объяснил в разделе «кому нужны синглтоны», синглтоны могут сделать БОЛЬШУЮ сделку из-за сложности заставить код работать С И ВНУТРИ многих различных баз кода / приложений / сторонних сервисов.Время, которое может быть потеряно при тестировании, - это время, затраченное на разработку и развертывание.Это особенно полезно в эпоху сторонней аутентификации / приложения / интеграции - Facebook, Twitter, OpenID, многих других и кто знает, что будет дальше.
Хотя это и понятно - программисты работают в самых разных обстоятельствах в зависимости отих карьера.А для людей, которые работают в относительно крупных компаниях с определенными отделами, которые комфортно работают с разными, определенными программами / приложениями и без надвигающейся гибели / увольнений в бюджете и сопутствующей необходимости делать МНОГО вещей с множеством разных вещей вдешевый / быстрый / надежный способ, одиночные игры могут показаться не столь необходимыми.И это может даже быть неприятностью / препятствием к тому, что они УЖЕ имеют.
Но для тех, кому нужно работать в грязных канавах «гибкой» разработки, когда приходится выполнять много разных запросов (иногда необоснованных) от их клиента / менеджера / проекта, синглтоны - это спасительная грация по причинам, объясненнымранее.
- Другое возражение состоит в том, что его объем памяти выше
Поскольку новый синглтон будет существовать для каждого запроса от каждого клиента, это МОЖЕТ быть возражением для PHP,С плохо сконструированными и используемыми синглетами объем памяти приложения может быть выше, если приложение обслуживает много пользователей в любой заданной точке.
Хотя это справедливо для ЛЮБОГО подхода, который вы можете использовать при кодировании.Вопросы, которые следует задать, являются ли ненужными методы, данные, которые хранятся и обрабатываются этими единицами?Поскольку, если они необходимы во многих запросах, которые получает приложение, то даже если вы не используете синглтоны, эти методы и данные будут присутствовать в вашем приложении в той или иной форме через код.Таким образом, все становится вопросом того, сколько памяти вы будете экономить, когда вы инициализируете традиционный объект класса 1/3 в обработку кода и уничтожаете его 3/4 в него.
Видите ли, если поставить так, вопрос становится совершенно неактуальным - не должно быть ненужных методов, данных, содержащихся в объектах в вашем коде, В любом случае - независимо от того, используете вы синглтоны или нет.Таким образом, это возражение против синглетонов становится действительно смешным, поскольку оно предполагает, что будут ненужные методы, данные в объектах, созданных из используемых вами классов.
- Некоторые недопустимые возражения, такие как «делает невозможным / более сложным поддержание нескольких соединений с базой данных»
Я даже не могу понять это возражение, когда нужно поддерживать всенесколько соединений с базой данных, несколько вариантов выбора базы данных, несколько запросов к базе данных, несколько наборов результатов в заданном синглтоне просто хранят их в переменных / массивах в синглтоне столько времени, сколько они необходимы.Это может быть так же просто, как хранить их в массивах, хотя вы можете изобрести любой метод, который вы хотите использовать для достижения этой цели.Но давайте рассмотрим простейший случай, использование переменных и массивов в данном синглтоне:
Представьте, что ниже находится внутри данного синглтона базы данных:
$ this -> соединения= массив (); (неправильный синтаксис, я просто набрал его так, чтобы дать вам картинку - правильное объявление переменной public $ connections = array (); и ее использование, естественно, $ this-> connections ['connectionkey'])
Таким способом вы можете установить и сохранить несколько соединений в любой момент времени в массиве.И то же самое касается запросов, наборов результатов и т. Д.
$ this -> запрос (QUERYSTRING, 'queryname', $ this-> connections ['partulrconnection ']);
, который может просто выполнить запрос к выбранной базе данных с выбранным соединением и просто сохранить в вашем
$ this -> результаты
с помощьюключ 'queryname'.Конечно, для этого вам потребуется кодирование вашего метода запроса - это тривиально.
Это позволяет вам поддерживать практически бесконечное количество (насколько позволяют, конечно, ограничения ресурса) другой базы данных.соединения и наборы результатов столько, сколько вам нужно.И они доступны для ЛЮБОГО фрагмента кода в любой заданной точке любой заданной кодовой базы, в которую был создан экземпляр этого синглтон-класса.
OF COURSE, вам, естественно, потребуется освободить результирующие наборы и соединения, когда они не нужны- но это само собой разумеется, и оно не является специфичным для синглтонов или любого другого метода / стиля / концепции кодирования.
На этом этапе вы можете увидеть, как вы можете поддерживать несколько соединений / состояний со сторонними приложениями илиуслуги в том же синглтоне.Не так уж и отличается.
Короче говоря, одноэлементные паттерны - это просто еще один метод / стиль / философия для программирования, и они так же полезны, как ЛЮБЫЕ другие, когда используются в правильном месте, в правильной манере.Что ничем не отличается от всего.
Вы заметите, что в большинстве статей, в которых разбиты синглтоны, вы также увидите ссылки на «глобальные» слова «злые».
Давайте посмотрим правде в глаза - ЛЮБОЕ, что не используется должным образом, злоупотребляет, злоупотребляет, является злом.Это не ограничивается каким-либо языком, любой концепцией кодирования, любым методом.Всякий раз, когда вы видите кого-то, кто произносит общие заявления типа «X - зло», убегайте от этой статьи.Очень высоки шансы, что это продукт ограниченной точки зрения - даже если эта точка зрения является результатом многолетнего опыта в чем-то конкретном, что обычно заканчивается результатом слишком большой работы в данном стиле / методе - типичном интеллектуальном консерватизме.
Для этого можно привести бесконечные примеры, начиная от «глобальных злых» и заканчивая «фреймами злых».Еще около 10 лет назад даже предложение использовать iframe в любом конкретном приложении было ересью.Затем идет Facebook, везде фреймы, и посмотрите, что произошло - фреймы уже не так злы.
1106 * Есть еще люди, которые упорно настаивают на том, что они являются «злом», - а иногда и по уважительной причине тоже - но, как вы можете видеть, есть необходимость, плавающие фреймы заполнить эту потребность и хорошо работать, и, следовательно,весь мир просто движется.
Главным преимуществом программиста / программиста / программиста является свободный, открытый и гибкий ум.