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 это, похоже, вообще не нужно. Все, тема закрыта, всем спасибо.

Ответ на: комментарий от Dron

Да, но там че то мудрено, я не врубаюсь, хотелось бы на пальцах.

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

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

cool-100 ()

Возьми нормальный ЯП и сразу сам все поймешь

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

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

mix_mix ★★★★★ ()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

cool-100 ()

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

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

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

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

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 ★★★★★ ()
Ответ на: комментарий от no-such-file

Object.defineProperty(global, "App", {value: function(){console.log("foo")}})

App()
App=function(){console.log("bar")}
App()
//  foo
//  foo

то же самое

cool-100 ()

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

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

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 ()

А куда делась предыдущая тема, в которой про Алана Кея что-то обсуждали? Ты удалил или модераторы?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Если ТС гоняет с новым юзернеймом, ответ напрашивается сам собой.

Virtuos86 ★★★★★ ()

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

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

Не парься по поводу так называемых шаблонов. Все эти шаблоны имеют мало смысла. Их напридумывали люди, чьи идеи нас с тобой не интересуют. Ты же сам говорил, что читаешь только проверенных авторов. Так вот тебе критерий — если автор работает над какой-то статикой типа жабы, то его не стоит читать. Хотя есть исключения — 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 ()
Ответ на: комментарий от cool-100

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

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

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

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

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