![]() |
WindWalker получает плюс. Холивар холиваром, а на личности переходить нельзя.
|
Цитата:
А насчет использования/неиспользования... Врядли кто-то будет возражать что для некоторых целей это очень удобная штука, и как и в любом патерне, в нем есть как плюсы так и минусы. А идеальное еще не изобрели все равно :) . |
Нет косяков у тебя. Но предложенный тобой вариант есть в обсуждении синглтона: http://yarovoy.com/2007/10/24/single...ctionscript_3/
Там-же к коментах есть и мой: Код:
public static const INSTANCE : Singleton = new Singleton(); |
абсолютно неудобная. если она используется больше чем в одном месте.
|
Iv, спасибо за разъяснения.
Еще два вопроса. 1) Какой-нибудь конкретный пример "правильного" применения синглтона в АС3 2) Присоединяюсь к Цитата:
|
terbooter,
ситуация такова, что это очень сильно зависит от контекста. Если ты делаешь баннер, то там можешь вообще всё реализовывать через синглтоны не задумываясь. Если ты пишешь реюзабельный код, то довольно трудно сказать где синглетон будет незаменим. Примеы: Сокет-коннектор. приложение устанавливает сокет-соединение с сервером. Из разных частей приложения вызываются команды коннектора. Команды организуются в очередь FIFO и производится контроль ответов сервера. В этой ситуации синглетон - верное решение. Его задачи - не дать ошибиться программеру случайно создав второй экземпляр и не производить постоянную проверку на наличие коннектора перед вызовом его метода. Библиотека кэшированных изображений. В приложении часто используются одинаковые подгружаемые картинки (например иконки папок и файлов в меню). Существенного ускорения доступа можно достигнуть используя внутреннее кэширование. Для этого организуется библиотека-синглетон, которая при запросе картинки проверяет ее наличие в кэше и т.д. Как видите, синглетон (он переводится как одиночка) - это такой класс, у которого может быть один и только один экземпляр. Его одиночество как проверочное действие: если теоретически может быть несколько экземпляров, то это не синглетон. |
Цитата:
Цитата:
Код:
var s:Singletone = Singletone.getInstance();Код:
var c:Class = StaticClass.getClass(); |
Вот бредятина-то.
Вместо одного "пусть неправильно зато писать мало" предлагается "ещё более неправильно, зато писать ещё меньше". |
BlooDHounD,
собственно в рассуждениях ты допускаешь типичную ошибку трактовки синглетона. Метод доступа к данным (статические методы или через экземпляр полученный через getInstance) значения не имеют. Ты пытаешься оценивать синглетон в качестве способа глобального доступа, что в корне неверно. Синглетон не для этого предназначен. Ну как сравнивать молоток с микроскопом. В принципе, у синглетона может и не быть метода getInstance (или он может быть приватным) и у экземпляра такого класса снаружи не будет торчать ни одного публичного метода экземпляра. Только статики, перенаправляющие задачи на экземпляр. Синглетон же обеспечивает наличие единственного и неповторимого экземпляра класса, с помощью которого выполняются конкретные действия. |
Хмм... А если тогда реализовать Синглтон следующим образом:
Делаем публичный класс-обёртку и скрытый класс-синглтон, который непосредственно и содержит весь функционал. Класс-обёртка выполнение всех методов делигирует синглтону. Конструктор никоем образом не прячем - пускай создаются несколько обёрток (или лучше назвать розетками или гейтами?), всё равно работать у нас будет в итоге единственный экземпляр. Сейчас попробую это в виде кода оформить... |
Идея понятна, но дело совершенно не в этом.
Прелесть синглетона в том, что можно его быстро переделать в обычный класс и обратно. Собственно это одна из причин, по которой не стоит увлекаться статическими методами. |
Во.
Есть интерфейс: Код:
package {Код:
package {Код:
package {Используют как обычный класс. Таким образом, если мы решим отказаться от использования синглтона (например, потребуется несколько соединений к серверу), то меняем только один файл. Для остальных классов ничего не изменилось. То есть уровень абстракции выше, переделка в обычный класс совершенно прозрачна. |
Цитата:
|
WindWalker, а нафига делать синглтон, о котором никто не узнает? это уже не синлтон получает, а фигня какая-то.
|
Это называет ин-кап-су-ля-ци-я.
Чем меньше мы знаем о внутреннем устройстве, тем легче живётся и крепче спится. Про класс мы знаем. Инстанциируем, используем. А про то, что он реализован через синглтон - не знаем и знать не хотим. И если когда-нибудь он волшебным образом перестанет быть синглтоном (с сохранением интерфейса, логики и функциональности), то нас это никак не будет волновать. Хочу обратить внимание, что класс-пользователь не использует статические методы и не содержит никаких упоминаний getInstance(). |
BlooDHounD, можно поподробнее, с моими цитатами?
|
Цитата:
Цитата:
WindWalker, мне всё равно как Вы это называете :) просто я не пониманию, зачем усложнять структуру приложения, даже если программист никогда не увидит внутренности :) по мне так проще вместо создания "непоймикакогосингтона" написать как-нить так: Код:
private static function $doSomething():void { |
BlooDHounD, мне блевать хочется от такого общения как сейчас с тобой.
Научись отстаивать свою точку зрения, а не прятаться за общими фразами. |
Iv, необращай внимания на тех, кто до этого еще не дорос, а то зря только время потратиш... я хоть посмеялся, пока читал посты отдельных пользователей))
|
Iv, ты меня расстраиваешь :) я давно, привык что ты общаешься сам собой, так что ты уж меня прости, что не цитирую тебя очень часто. мне кажется я чётко расписал в чём ты не прав. извини, что не приготовил тебе нормальный завтрак. не могу тебе сейчас помочь с пищеварением.
|
Цитата:
Если точно уверены, что не будем наследовать, потому как со статическими методами не всё так просто. Вот пример. Есть базовый класс. Код:
package {Код:
package {Код:
new MyClass2().hello();В данном случае - легко заметная и быстро исправляемая. А в реальном проекте можно очень долго её ловить. |
2morrowMan, здесь профессиональный форум и изначально я отношусь к любому как к коллеге, уважительно.
При этом не имеет значения уровень - что гуру, что начинающий, в моих глазах имеет одинаковый респект. Но блин, есть же общепринятые нормы общения. Если высказываешься, будь готов аргументировать свою точку зрения. Я готов поспорить и с удовольствием откажусь от собственных заблуждений, если оппонент мне аргументированно докажет это. С удовольствием, подчеркиваю. Потому, что этот человек подымет мой проф уровень, за что ему респект и спасибо. Но не все понимают и частенько весь их текст несет информации не более чем пук в воду. Это бесит. |
Iv, я аргументировал. что у тебя вызвало вопрос, я не понимаю. извини, что не умею писать 10 кб текста неся при это одну единственную мысль: "ты привёл не правильные примеры использования синглтонов". ну не прозаик я. написал коротко и ясно. ты обиделся почему-то. извини.
WindWalker, я не понимаю зачем вы пытаетесь переопределить приватный, к тому же статический метод, не используя слово override. Может я не понимаю, но у меня в обоих случаях выводится: "Hello from class 1". если вы хотели переопределить, то надо было написать так: Код:
package { |
Цитата:
override вообще нельзя писать одновременно со static (как я буквально только что выяснил :)). Цитата:
Преимущество синглтона в том, что он - экземпляр. 1. У него нормальные методы, которые можно переопределять (со статическими просто так не выйдет). 2. Он может имплементировать интерфейс (попробуйте сделать это со статическими методами). 3. В последствии мы можем отказаться от требования иметь только один экземпляр, и насоздавать их несколько. |
Цитата:
Цитата:
2. это я написал в самом начале разговора. использование синглтона в принципе может быть обусловленно, только имплементацией определённого интерфейса. иначе он просто не имеет смысла, и приводит к потери скорости работы приложения и потери скорости разработки приложения. 3. если такая необходимость возникнет (это ошибка проектирования), то вам никак это не поможет. вам придётся переколбасить кучу кода, что бы везде привести работу к конкретному экземпляру. работы будет не меньше, чем со статиками. можно конечно на скорую руки превратить синглтон в мультитон, и сделать дефолный аргумент, по которому будет возвращаться используемый вами везде экземпляр, но этот путь приведёт к запутыванию кода, и непониманию его работы в целом. update: забыл аргументировать первый пункт (специательно для Вани). 1. никакого преимущества. так как Ваня описал выше, это класс который должен быть один одинёшеньки. наследование такого класса может привести к непредсказуемым последствиям. так как вполне логично, что и наследник будет выполнять схожие со стоим родителем задачи, их действия могут пересечься, что слегка нарушит всё логическое обоснование одиночки. |
А я не люблю паттерны. =)
Раньше использовал синглтон только если в глобальной точке доступа необходимо было наследоваться или имплементировать какой-то интерфейс (например IEventDispatcher). Потом отказался в пользу обыкновенных объектов находящихся в статических константах. Стало проще жить =). P.S. BlooDHounD, синглтон - интуитивно финальный класс, это все понимают. В первом пункте речь о наследовании полей самим синглтоном, т.е. о том из-за чего и я использовал его в начале. |
Цитата:
Цитата:
|
Код:
public class Singleton extend EventDispatcher{} |
я то это понимаю. это и называется "определённый интерфейс". это пункт 2.
|
Цитата:
Далее можно наследовать (если очень хочется). Со статическими методами не всё так просто. Можно превратить их в public, но переопределять их всё равно не сможем. Цитата:
Вот в нём-то, если надо, и делаем необходимые изменения, чтобы первым создавался именно экземпляр наследника, а не родителя. Цитата:
Но согласен, в AS3 это уже не актуально. Цитата:
Пример с сетевым соединением как раз мне нравится. Допустим, первоначально предполагалось, что соединение должно быть одно и только одно. Сделали синглтончик Connection. Потом решили, что надо балансировать нагрузку и сделать так, чтобы клиент имел несколько параллельных соединений к разным серверам и примерно пропорционально раскидывал запросы между ними. Модифицируем Connection - делаем так, чтобы он больше не был синглтоном, а метод getInstance возвращал наименее занятое соединение (например, просто по принципу револьвера, но это уже не так важно). И ещё не забываем, что у нас есть класс-посредник (в случае с соединениями например класс Request). И про одиночку и его одиночество знает только этот посредник (да и то не всегда). Соответственно, и необходимые изменения (возможно, хотя и не всегда конечно) достаточно будет сделать только в нём. Цитата:
Опять же сетевое соединение. Опять же одновременно только одно. Но! Сперва пробуем SocketConnection, если обломались, то его убиваем и используем HTTPConnection. Оба наследуются от некоего AbstractConnection. Вот тут уже возникает более интересный вопрос: как реализовать "расширенную одиночку", который гарантирует одновременное существование только одного экземпляра с учётом всех потомков? Вот на этот вопрос я сейчас не знаю как ответить. :) И на вопрос "а нафиг это вообще надо" тоже :) Но есть ощущение, что чисто статическими методами тут тоже не обойтись (точнее обойтись то можно, но выйдет некрасиво). P.S. Хотя насчёт "расширенной одиночки" подозреваю, что тут всё довольно просто - кто раньше встал, того и тапки. Статическая переменная instance то одна для всех. Как только чей-то экземпляр туда засунули, все остальные автоматически идут лесом. |
Цитата:
|
Цитата:
|
может закончим холивар? все равно ведь все останутся при своем!!! а за время пока вот тут идут дебаты, я открыл для себя паттерн "абстрактная фабрика", может еще по поводу него поспорим? ;)
|
Цитата:
Цитата:
Раз есть какие-то веские причины, чтобы он был всегда финальным - пусть будет финальным (кстати, какие именно причины?). Но таки меняем пункт 1. Синглтон может от кого-то наследоваться, переопределяя методы (в том числе вызывая старые методы через super()). А со статическими методами возникнет ряд проблем... ----------------------------- Последняя добавочка. Я на самом деле использую и статические методы, и синглтоны. И то и другое - для глобального доступа. Потому что глобальный доступ - это такой "черный ход", который зачастую позволяет сильно сократить путь. Когда времени мало, а надо, чтобы какой-то очень мелкий объектик, обычно отвечающий за какую-то мелкую функцию, вдруг узнал что-то общее (например, громкость звука или url к сервлету) или даже вообще сделал что-то глобальное (например, какой-нить мелкий бонус вдруг взял да увеличил количество очков у игрока), и передавать это всё по цепочке не хочется - использую глобальный доступ. Но то, что быстро пишется, потом долго переделывается. Когда этот маленький объектик хочется использовать повторно в другом месте, где нет требуемого глобального объекта, приходиться вносить кучу исправлений. |
Цитата:
Цитата:
|
Так статический метод только один: getInstance().
Пускай остаётся таким, какой он есть. Я говорю про методы/поля самого экземпляра. Прекрасно переопределяются. |
Цитата:
либо по другому: зачем создавать синглтон в классе посреднике, если он и сам может выполнять этот функционал? вы приводите пример в которм используется синглтон, ради самого его существования. даже если вы вынесете синглтон в отдельный класс, то класс посредник уже нафиг не нужен, так как к нему будут иметь доступ все. наследовать его тем болие не надо. зачем? у нас же есть класс посредник мы может прям там написать. Цитата:
Цитата:
Цитата:
p.S: у нас кстати реализован ваш пример. конечно без сингтона. и уж тем болие без статиков. |
Цитата:
|
Цитата:
|
Цитата:
Всё, понял-отстал! Цитата:
Connection - синглтон, Request - посредник. Цитата:
Он может использовать скрытый синглтон. Он может использовать публичный синглтон. Он может использовать мультитон. Он может сам реализовывать весь функционал, а синглтон удаляется. Он может использовать статические методы - свои или другого класса. При этом все остальные ничего не замечают. Он реализует интерфейс, а как он это делает - дело десятое. То есть, вообще говоря, синглтон тут вовсе даже и не главный получается :) Просто - как одна из возможностей реализации. Цитата:
Потому что интерфейс (в ООПешном понимании) - это, вообще говоря тип, а не просто набор методов. Со всеми вытекающими... Цитата:
Но вот щас не могу вспомнить подробности, а исходников под рукой нет. |
| Часовой пояс GMT +4, время: 04:05. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.