LINUX.ORG.RU

Помогите понять синглтоны

 , , ,


0

1

Наткнулся на такой вот пример создания в IO:

Singleton := Object clone
Singleton clone = Singleton

Насколько я понял, аналогом в JS будет:

Object.prototype.clone=function(){return Object.create(this)}
 
singleton=Object.clone()
singleton.clone=function(){return singleton}

Не могу врубиться, как это можно использовать, нахер это нужно? Покажите, плз, простенький пример какой-нибудь, игрушечный чтоли. Это уже третья попытка, понять сабж. Первые 2 — неудачны:) Я в отчаянии:)

UPD Все понял, кажется. Это нужно для ЯП где нет глобальных переменных. Для JS это, похоже, вообще не нужно. Все, тема закрыта, всем спасибо.



Последнее исправление: cool-100 (всего исправлений: 2)
Ответ на: комментарий от Dron

Да там тоже какая то демагогия: «В математике определяется множество бла-бла-бла», не перевариваю эту ахинею. Хотелось бы понять суть. Простенький какой-нибудь юзкейс можно?

cool-100
() автор топика
Ответ на: комментарий от cool-100

Синглтоны заменяют собой глобальные переменные при ООП головного мозга.

mix_mix ★★★★★
()

У тебя есть жирное приложение и в нем надо:

- юзать конфиг (Config)

- лазить в субд (DbConnectionPool)

- гадить в лог (Log)

- писать на почту (EmailSender)

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

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

зы. в очень больших приложениях синглетон начинает вредить, но это отдельная история

Deleted
()
Ответ на: комментарий от anonymous

Я, собственно, сам код, в смысле, что он делает, понимаю. Создаем единственный объект, а впоследствии, при попытках его клонировать, возвращается не новый, а тот же самый. Только я не пойму, зачем это? Просто запрет на создание объекта и все? Если я пишу приложение, я, как бы знаю, какие объекты клонировать, а какие нет, все и так под контролем. Здесь же получается, что если я забуду, что клонировать объект с таким-то именем нельзя, при попытке этого, вернется тот же самый экземпляр. То есть, на забывчивость чтоли рассчитано?

cool-100
() автор топика
Ответ на: комментарий от cool-100

в веб приложениях синглтоны не модны потому что там все обычно построено на быдлокодном использовании глобальной переменной window

Deleted
()
Ответ на: комментарий от Deleted

Это, формально, глобальный объект. Никто не заставляет его использовать. Создай свой, и пользуй. Это не вопрос.

cool-100
() автор топика

Это нужно для ЯП где нет глобальных переменных. Для JS это, похоже, вообще не нужно. Все, тема закрыта, всем спасибо.

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

Deleted
()
Ответ на: комментарий от Deleted

Да, это само сабой. Но в js можно создать объект, read-only, или, некоторые свойства объекта запретить к модификации, это все от юзкейса зависит, и как правило не особо и нужно. Для js неактуально это, короче.

cool-100
() автор топика
Ответ на: комментарий от Deleted

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

Ну, а допустим, создал ты синглтон, в него (экземпляр) же тоже могут все писать, или как? какая разница то?

cool-100
() автор топика
Ответ на: комментарий от cool-100

как настроишь так и могут (т.е по желанию)

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

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

Deleted
()

Привет, anonimous.

anonymous
()
Ответ на: комментарий от cool-100

в него (экземпляр) же тоже могут все писать, или как? какая разница то?

Разница такая что в некой гипотетической функции ты пишешь

function some() {
    var log = App().registry().get('log')

    ...
    log.write('bla bla bla')
    ...
}

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

тоже могут все писать, или как?

Вообще в js конечно этот App() можно просто переписать как App = function () { ... }, так-что разница с глобальной переменной минимальна. А вот в более других языках функцию/конструктор просто так не переопределишь и есть определённая защита от дурака.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)

Поооолностью с вами согласен, сэр

subj

niemand
()

Это нужно для ЯП где нет глобальных переменных

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

no-such-file ★★★★★
()

Интересно, что даже движок ЛОРа угадывает этого клоуна

Посмотрите «похожие темы»

niemand
()
Ответ на: комментарий от cool-100

то же самое

В js тоже самое, потому что в js function bla() {} это сахарок над bla = function() {}. Во многих языках, даже где есть функции как якобы «первоклассные» сущности, есть разница между анонимной функцией и функцией определённой явно. Т.е. идентификаторы явных функций не являются переменными.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

тоже самое

Я имел в виду «то же самое», в смысле запрета на модификацию извне.

function bla() {} это сахарок над bla = function() {}

Ну, точней,

 function bla() {} это сахарок над bla = function bla() {}
но есть разница во времени инициализации. Это не совсем одно и тоже, не во всех случаях, грубо говоря.

cool-100
() автор топика

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

TDrive ★★★★★
()
Ответ на: комментарий от no-such-file

В js тоже самое, потому что в js function bla() {} это сахарок над bla = function() {}.

function bla() {} инициализируются препроцессором, а bla = function() {} во время выполнения.

TDrive ★★★★★
()
Ответ на: комментарий от no-such-file

Хотя, я ступил, насчет модификации, там другой эффект происходит, извиняюсь, тот пример не в кассу был. Есть директива const для этого, но, ЕМНИП, она пока не везде поддерживается.

cool-100
() автор топика
Ответ на: комментарий от cool-100

Ну так, для этого достаточно не плодить этот объект.

Достаточно реализовать синглтон и не париться о том что его кто то может наплодить. Причем интерфейс работы с объектом/классом может не меняется, просто по new всегда прилетает один и тот же объект, также при копировании объекта фактически он может не копироваться.

TDrive ★★★★★
()
Последнее исправление: TDrive (всего исправлений: 1)
Ответ на: комментарий от cool-100

Ну так, для этого достаточно не плодить этот объект.

А ещё можно функции вообще не писать, достаточно код копипастить.

anonymous
()
Ответ на: комментарий от cool-100

Нет, просто бесит, года пишешь, а кто-то это удаляет. И вообще я не понимаю, зачем тебя банят. Если бы не высказывания в духе «быдло не может понять» я бы считал тебя вполне интеллигентным собеседником. Тут многие (особенно анонимы) дискутируют в духе ad hominem, и вообще к оскорблениям прибегают. Банить тебя плохо для идентификации. Это тем, кто за историей с самого начала следил легко тебя идентифицировать. Я вот не сразу разобрался с этими перерождениями.

komputikisto
()
Ответ на: комментарий от cool-100

Просто считай что синглтон - костыль из мира жабы, где нет глобальных переменных и нормальных функций.

hateyoufeel ★★★★★
()
Ответ на: комментарий от Deleted

туда может кто угодно и когда угодно записать другой инстанс

константы? кто сказал константы?

Ford_Focus ★★★★★
()

Как уже было сказано

синглтон - костыль из мира жабы

Не парься по поводу так называемых шаблонов. Все эти шаблоны имеют мало смысла. Их напридумывали люди, чьи идеи нас с тобой не интересуют. Ты же сам говорил, что читаешь только проверенных авторов. Так вот тебе критерий — если автор работает над какой-то статикой типа жабы, то его не стоит читать. Хотя есть исключения — Gregor Kiczales и Guy Steele, которые раньше занимались Лиспом, а сейчас жабой.

komputikisto
()
Ответ на: комментарий от Virtuos86

Не напрашивается. Бан != удаление темы. Действительно, это свинство. Люди писали что-то, обсуждали, вернулись с утра — а темы нет. Но перед кем тут бисер метать... Так что, все ок, nevermind.

cool-100
() автор топика
Ответ на: комментарий от cool-100

Но перед кем тут бисер метать...

Правильно, давай к нам, на сосач.

anonymous
()
Ответ на: комментарий от cool-100

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

VladimirMalyk ★★★★★
()
Ответ на: комментарий от VladimirMalyk

В JS пробрасывать вручную не обязательно, наследование никто не отменял.

cool-100
() автор топика
Ответ на: комментарий от komputikisto

Их напридумывали люди, чьи идеи нас с тобой не интересуют. Ты же сам говорил, что читаешь только проверенных авторов. Так вот тебе критерий — если автор работает над какой-то статикой типа жабы, то его не стоит читать.

Предлагаю создать церковь лиспа, и составить список авторов подвергнутых анафеме.

Kuzy ★★★
()
Ответ на: комментарий от Kuzy

церковь лиспа

Obligatory copypasta:

Ибо воистину. Первый Язык, жемчужина посреди простых камней, и нет языков кроме Него. Скобки, в которых пустота — тело Его, мистическое двуединство кода и данных — дух Его, божественная рекурсия — сердце Его. Истинно говорю вам, избегающий света Его есть безумец, вот, свершается кара над главой его, и убогостью отмечены поделия его, подобные пустым глиняным горшкам рядом с хрустальным сосудом благодати Его. Принявший же и постигший истинный свет Его подобен прямой и отточенной стреле, чисты помыслы его и крепка рука его, и благословенны творения его, дарующие радость и утоляющие печали, ибо одухотворены духом Его и отмечены благодатью Его.

anonymous
()
Ответ на: комментарий от cool-100

В твоём случае напрашивается. Тебя банят уже превентивно. И винить некого. Сначала ты работаешь на репутацию, потом репутация работает на тебя. Так что подставляешь людей, которые пытаются что-то дельное обсуждать в твоих темах, ты сам, как ни странно.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

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

cool-100
() автор топика
Ответ на: комментарий от Virtuos86

превентивно

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

ЗЫ Ты видимо, хотел сказать перманентно

cool-100
() автор топика
Ответ на: комментарий от tailgunner

Да, я в курсе, что ты тоже интересный.

cool-100
() автор топика
Ответ на: комментарий от cool-100

Про твои проблемы с мышлением исписана добрая половина твоих тредов, но тебя это не останавливает. Ты продолжаешь мнить себя человеком уровня Дейкстры и иже с ним. ОК.

Virtuos86 ★★★★★
()
Ответ на: комментарий от tailgunner

Если ты реально такой фейспалмный, я, таки поясню, что та бредовая фраза, в контексте семантики русского языка, если бы имела место быть, то означала бы, что меня банят еще до моей попытки регистрации, или сразу же, после регистрации. До того, как я успел написать первое сообщение.

Мда-а-а-а. Иной раз думаешь, черт, а ведь это реально происходит, это Хомо-сапиенс, формально, миллиарды их

cool-100
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.