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