![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
||
|
Fire-Plug |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 15.3.2005 Репутация: -1 Всего: 0 |
Почитай определение статической переменной, особенно в части о времени её жизни и сразу поймешь.
Ну, давай, если других аргументов нет кроме эклектических выкрутасов.
Кому нужна такая реюзабилити и отдельный модуль для нек-рой ограниченной реализации. Предлагаю класс CatString - один экземпляр на одного объекта-клиента на каждый процесс. --------------------
Объясни другому - поймешь сам (Народная примета) |
||||||
|
|||||||
Domestic Cat |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 3 Всего: 172 |
Я даже спорить не хочу. Паттерн, повторяю, не есть что-то жеско закрепленное на века великим
Fire-Plugом. Его пользуют так, как нужно в данной ситуации. По твоим постам видно, что ты этого просто не понимаешь.
"Экземпляр" - это, я так понимаю, объект? Тогда говори как принято. Кто такой объект-клиент? При чем тут процесс, по-твоему что, процессы должны делить между собой объекты?
Видимо, кое кто не знает, что в некоторых языках классы вместе с их статическими переменными могут быть выгружены из памяти...
Проверь по словарю значение этого слова. -------------------- |
||||||
|
|||||||
Fire-Plug |
|
||||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 15.3.2005 Репутация: -1 Всего: 0 |
С данным утверждением никто не спорит. Речь идет (до сих пор) о примере реализации некоторого шаблона, к-рому делается попытка присвоить название "синглтон". Реализация ф-ции, к-рая создает экземпляр класса в таком шаблоне предлагается в след виде:
Эта реализация противоречит опеределению синглтона, сформулированному GoF: "Гарантировать, что класс имеет только один экземляр и обеспечить глобальную точку доступа к нему", а именно - части определения об обеспечении глобального доступа. Покажем, что это так. Указ. ф-ция getInstance() предоставляет ссылку на уникальный объект для объекта того класса, кто первым его запросит. Для всех остальных запросов указатель= 0. Т.о., предлагаемая конструкция не обеспечивает глобального доступа к уникальному объекту, а следовательно, данный шаблон не есть синглтон. Предлагаемое затем решение хранить полученную ссылку в объекте нек-рого класса (т.е. локально) также притиворечит определению синглтона, а подобная практика его использования не приветствуется:
Указанная выше ф-ция getInstance() реализует некий другой шаблон. Я ранее предлагал (правда, в шутку) назвать такой шаблон Унитарион. Выводы: 1. Пример «синглтона», приведенный выше не реализует синглтон, т.к. противоречит его определению. 2. Выводы о вероятной ошибочности архитектуры и логики приложения при многократном доступе к нек-рому уникальному объекту общего назначения, созданному на основе шаблона синглтон, из разных классов и различных частей приложения – несостоятельны, т.к. речь идет не о синглтоне. Данное замечание не рассматривает детали реализации синглтона, как решения, гарантирующего глобальный(и многократный) доступ к объекту, а только оперирует его определением.
Но если уже договорилсь об определении, давайте ему следовать. --------------------
Объясни другому - поймешь сам (Народная примета) |
||||||||||
|
|||||||||||
Domestic Cat |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 3 Всего: 172 |
Это свидетельствует о том, что ты не понимаешь, что значат слова "точка глобального доступа". Например, некий ламер по имени Джеймс Даблью Купер, автор многих книг, в частности, "Паттерны в Java" и "Паттерны в C#", понимает это как точку, доступную всем, что абсолютно не значит, что получить ссылку на синглтон может любой желающий. В частности, он приводил пример с принтером - когда принтер занят, никто не может иметь доступа к нему; поэтому реализация Синглтона у Купера была именно такой (только не нул возвращался, а бросался иксепшн).
Это мнение одного человека непонятно для какого случая.
Обращайся к Куперу и его примерам, учи матчасть. -------------------- |
||||||
|
|||||||
Fire-Plug |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 15.3.2005 Репутация: -1 Всего: 0 |
Классы из памяти быть выгружены не могут, если только это не память разработчика. Очевидно, есть необходимость напомнить о таком понятии как "Время жизни" переменной и его определение для статических переменных, в т.ч. для членов класса. Полагаю, что невозможность привести здесь копии сотв. раздела из хотя бы "Язык программирования С++" Страуструпа очевидна. Но необходимо напомнить, что статическая переменная-член класса - это глобальная переменная с ограниченной видимостью. Если в "некоторых языках" это не так, хотя очень сомнительно, то это проблемы самих "некоторых языков" в интерпретации глобальных переменных (Что, снова придется обращаться к определениям, инвариантным относительно конкретного языка?) И кроме того, нечего вводить в заблуждение аудиторию, предлагая решение на «нек-ром языке», где соглашение о времени жизни статических переменных (возможно) иное, чем в С++, из-за чего эффект от применения подобного решения в С++ будет совершенно другим. ЗЫ: Здесь вообще-то форум по С++. --------------------
Объясни другому - поймешь сам (Народная примета) |
|||
|
||||
Domestic Cat |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 3 Всего: 172 |
Зря обижаешь разработчика и его память http://portal.acm.org/citation.cfm?id=609742.609750
Никто никого в заблуждение не вводил.
А я вижу, не слепой. -------------------- |
||||||
|
|||||||
Fire-Plug |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 15.3.2005 Репутация: -1 Всего: 0 |
Пример чрезвычайно плохохо Use case, архитектуры и никуда ни годного решения. Доступ в очередь к принтеру, а не к самому устройству, должен быть глобальным, а менеджер обслуживающий очередь и работающий с конкретным устройством, должен разрешать некритические ситуации, когда принтер выполняет текущее задание. Единственная ситауция, когда необходимо уведомить юзера и, быть может, отменить задание - проблема технического характера (нет связи с принтером, закончился картриж и т.д. и т.п.). Как на самом деле и реализовано. Так что поищи пример получше. Этот - слишком примитивный. Кстати, по твоему однократному объекту - не приведено ни одного весомого примера, только общие рассуждения типа "если бы да кабы". --------------------
Объясни другому - поймешь сам (Народная примета) |
|||
|
||||
chipset |
|
||||||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 164 |
Позвольте влезть в вашу высокопрофессиональную беседу.
Мне кажется, что если не каждый может получить синглетон, это уже автоматически означает что синглетон не доступен всем.
Купер тоже один ![]()
Что ты подразумеваешь под глобальностью?
Многократный доступ тоже возможен, это уже обсуждалось. Добавлено @ 08:43
Я уже приводил пример: Logger. Ловит исключения посланные изо всех концов приложения и кладёт их в файл. Второй обьект данного класса не только бессмысленен но ещё и опасен. --------------------
|
||||||||||||
|
|||||||||||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 3 Всего: 172 |
С какой стати я должен тебе что-то искать? Мне этот пустой спор уже надоел, мне неохота тратить время на фипню - а именно, должен иметь синглтон строчку return null / throw new Exception или нет. Наличие этой строчки обусловлено конкретной ситуацией, но никак не общими рассуждениями. Будь у тебя опыт, ты бы это понимал. Если ты не веришь Куперу - и не ему одному, дело твое. Переубеждать не собираюсь. -------------------- |
|||
|
||||
chipset |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 164 |
Ещё один недостаток я встретил в том, что UML не поддерживает их как stereotype
![]() Это сообщение отредактировал(а) chipset - 5.4.2005, 01:32 --------------------
|
|||
|
||||
Fire-Plug |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 15.3.2005 Репутация: -1 Всего: 0 |
Давайте не кастрировать определения в угоду Куперу. Речь идет не об абстрактной "точке глобального доступа", а глобальной точке доступа к нему, а именно - к уникальному объекту в контексте определения синглтона. Не зря, в частности, Александреску, описывая синглтон, проводит аналогию с глобальной переменной. А в смысле Купера – все знают, где дверь(т.е. доступная всем глоб. точка - адрес статич. ф-ции instance), но только один избранный узнает куда она ведет.
Применение шаблона Купера подразумевает наличие некоей политики для определения клиента, к-рому будет предоставлена ссылка на объект. Очевидно, что обобщенно сформулировать такую политику невозможно: она определяется только в контексте конкретной задачи. В то же время политика применения синглтона общая – всем, кто запрашивает – по аналогии с глобальной переменной. Итак, налицо различные сценарии с различным содержанием (для синглтона – уникальность объекта; для шаблона Купера – уникальность доступа), для к-рых имеет место попытка использовать один и тот же термин. Данная ситуация нормальна? Принцип «Как хочу, так и кручу», ведущим быть не может и не должен. Об определениях и семантике решений необходимо договариваться. В первую очередь, тем, кто публикует книги.
Нет уж! Изволь отвечать за свои слова. Ты с видом эксперта привел обзор ряда шаблонов. В описании одного из наиболее известных, вместо объективных сведений, т.е. предоставления версии GoF, Майерса, и в т.ч. версии Купера, как имеющую иной смысл, отличный от принятого ранее, приведена точка зрения только одного автора, к-рой следуешь ты лично. --------------------
Объясни другому - поймешь сам (Народная примета) |
||||||
|
|||||||
Domestic Cat |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 3 Всего: 172 |
Вполне. Суть в том, что существует один объект синглтона, все остальное - детали реализации.
Вот ты этим и займись - собери Александреску, ГоФ, Купера и др, и договаривайтесь.
Мое дело, что хочу, то и привожу. Если ты не понял, повторяю еще раз: мне этот разговор не интересен. Мне интересно обсуждать паттерны, а не строчку в синглтоне. -------------------- |
||||||
|
|||||||
Fire-Plug |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 15.3.2005 Репутация: -1 Всего: 0 |
Класс - это абстрактное понятие OOD. Для программиста класс - это тип, определяемый пользователем (Б.Страуструп) Для компилятора - это шаблон, по к-рому нужно сгенерировать код для создания объекта и операций над ним. Если апологеты Явы уже выгружают из памяти классы, а не объекты - флаг им в руки. Пусть сообщат об этом Гради Бучу. В отношении статич. переменных, в т.ч. членов-класса. Ява-код живет в искусственной среде Ява-машины, к-рая обращается с памятью по своему разумению. Если Ява имеет другое, чем С++, соглашение об их времени жизни, то нечего лезть со своим уставом в чужой монастырь. Как уже ранее упоминалось, эффект от похожих на первый взгляд реализаций в языках с различной интерпретацией времени жизни статич. переменных будет разный. Добавлено @ 09:45
Ты уже обсудил, приведя субъективное мнение одного автора. С таким же успехом от тебя можно ожидать и других "обсуждений". За подобный "обзор" соискатели обычно получают 3.14-зделей и от руководителей, и от оппонентов и от коллег. Мне лично уже тоже надоело иметь дело с носорогом. Period --------------------
Объясни другому - поймешь сам (Народная примета) |
||||
|
|||||
chipset |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 164 |
Ну а ты разве не привел субьективное мнение Александреску и GoF'a? Синглетон - он всегда синглетон, если его имеется один экземпляр и к нему имеется глобальный доступ. Ещё раз повторяю: глобальность - понятие растяжимое. Детали реализации определяются в зависимости от задачи и это не повод к тому чтобы ругаться и спорить тут, и тем более оскорблять других участников.
Это сообщение отредактировал(а) chipset - 7.4.2005, 09:58 --------------------
|
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |