Comments
Во всяком случае, я бы писал
что-то подобное, будь я Java-программистом.

Будь Вы Java-программистом, то использовали бы shared instance в DI контейнере, а не сомнительные паттерны.

Есть паттерны, которые не имеют смысла в динамических языках. Singleton — один из них.

Ты даешь им объект класса, а они делают include Singleton.
Что дальше? аннотации? или… может… СТАТИЧЕСКАЯ ТИПИЗАЦИЯ?
Кошмар рубиста наяву.

Спасибо, поплакал :)

Тоже крайне удивлен результатами опроса. Может быть, это джависты портят статистику? Хммм....

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


Пытаться дословно реализовать все паттерны из книги во всех языках — это бессмысленный карго-культ. Я вам выше написал, что Singleton не имеет никакого практического и теоретического смысла в Ruby. Все это многократно уже обсуждалось, на hacker news, например, можно найти статьи об этом.

Вы забываете, что синглтон в Руби — это еще и способ красиво оформить код. Я, например, пока и сам не попадал в ситуации, где использование синглтона было бы продиктовано архитектурными соображениями.


Мне вот, допустим, не нравится видеть new каждый раз, когда я хочу воспользоваться чем-то вроде SomeExternalApi:


SomeApi.new.do_something
# vs
SomeApi.do_something

Синглтон — это не паттерн N из книги банды четырех. Это просто идея (впрочем, как и большинство паттернов). Далеко не всегда они решают какую-то архитектурную задачу, зачастую они просто позволяют сделать код красивее (понятнее).


Предвижу минусы, но я настаиваю на этой точке зрения.

К сожалению, плохо знаком с Ruby. В Python это делается при помощи статических методов или методов класса. Или при помощи паттерна Borg. Думаю, что и в Ruby должно быть что-то похожее.


А вообще, мне кажется что тащить в другой язык инородные приемы и парадигмы — напрасная трата сил. Я как раз сейчас работаю с относительно большим проектом, который написал человек как первый на Python после Java. Это просто нечитаемый ужас-ужас-ужас. В Риме надо поступать как римляне. Если хочется писать на Java, то не надо превращать в Java Python или Ruby. Можно просто писать на Java.

статических методов или методов класса

Этот способ указан в посте. С парой причин, почему он лично мне не нравится.


тащить в другой язык инородные приемы и парадигмы — напрасная трата сил

В руби шикарно уживаются приемы из ФП. Более того, о каких приемах в контексте данного поста идет речь?
Синглтон — всего лишь название, чтобы всем было понятно, что речь идет о единственном представителе своего класса.


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

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

Я вам привел две строчки для сравнения:)
Это просто делает код красивее.


Что является антипаттерном? Приемы, которые нанесут вред коду? Какой вред вы видете в глобальной константе, содержащей stateless-объект с нужными методами?


Ну и еще можно, конечно, говорить о том, что это избавляет от множеств созданий/уничтожений объекта и т.д. и т.п., но это роли не играет, разумеется.


P.S. мне нравится этот диалог, но, по-моему, мы совсем уж ушли от изначальной темы про способы создания синглтонов в Ruby (на котором Вы не пишете).


UPD. Вы упомянули статические методы. Класс в данном случае ведь тоже объект. Просто в питоне и джаве это не подтверждается на уровне языка. Я могу ошибаться, но в ООП нет "статических методов". Есть только объекты и их методы. Соответственно, говоря о статических методах, мы начинаем интерпретировать класс как самостоятельный объект (в Ruby так оно и есть)

Уточнил. Я не прав насчет питона. В питоне классы — тоже объекты, что просто замечательно

Only those users with full accounts are able to leave comments. Log in, please.