LINUX.ORG.RU

Ты серьёзно читаешь всякое, содержащее фразы вроде «wrong usage of the pattern»? Это бессмысленный набор слов. Если бы он имел смысл, то по ссылке было бы 5 строк кода, которые просто показывают почему при некоторых обстоятельствах использование синглтона может привести к беде.

Stahl ★★☆
()

Глобально, со всеми вытекающими минусами, если я правильно понял автора

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

Ну в частности я сейчас столкнулся с Unit test'ами. У меня есть враппер к библиотеке на основе синглтона. Почему синглтон - потому что не вижу смысла, зачем может понадобится второй экземпляр этого враппера.
Набрёл ещё на интересную статью, как решить проблемы с тестами http://www.drdobbs.com/once-is-not-enough/184401625

UVV ★★★★★
() автор топика

А как его правильно использовать?

Никак (почти, по аналогии с goto). Синглетон — это антипаттерн.

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

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

А зачем понадобился первый экземпляр?

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

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

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

А зачем понадобился первый экземпляр?

Инициализировать библиотеку и продолжать общаться с ней on session basis

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

Инициализировать библиотеку и продолжать общаться с ней on session basis

Библиотека допускает несколько одновременных сессий? Какие-либо содержательные действия с этой библиотекой можно делать не через сессии?

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

Какие-либо содержательные действия с этой библиотекой можно делать не через сессии?

Только data conversion. Общение по сети только с сессией.

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

Библиотека допускает несколько одновременных сессий?

Define одновременно. Несколько использовать можно, но она не thread-safe.

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

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

Manhunt ★★★★★
()
Последнее исправление: Manhunt (всего исправлений: 2)
Ответ на: комментарий от Manhunt

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

Сессия - это сишная структура, так что я с другой стороны как бы )

Вот и получается, что твой синглтон притянут за уши.

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

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

Тогда это хозяйство можно вообразить, будто параметр сессии — это экземпляр класса «либа». Просто класс написан хреново, так что портит данные, если вызывать его члены из нескольких потоков. Соответственно, от враппера этой либы нужна дополнительная функциональность в виде обеспечения упорядоченного доступа к либе из разных экземпляров. А исходя из этого непонятно, как сингл он решил проблему.

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

Сессия - это сишная структура, так что я с другой стороны как бы )

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

Manhunt ★★★★★
()
Последнее исправление: Manhunt (всего исправлений: 1)
Ответ на: комментарий от UVV
class Session
{
    struct snmp_session m_session;
    struct snmp_session *m_ss;
public:
    Session(const char *peername)
    {
        snmp_sess_init(&m_session);
        m_session.peername = peername;
        // blablabla
        m_ss = snmp_open(&m_session);
    }
    ~Session()
    {
        snmp_close(m_ss);
    }
    blabla SnmpSynchResponse(struct snmp_pdu *pdu, struct snmp_pdu *response)
    {
        return snmp_synch_response(m_ss, pdu, &response);
    }
};
Manhunt ★★★★★
()
Ответ на: комментарий от UVV

Желание «запихать ... туда» имеет какие-нибудь рациональные причины, или его истоки лежат целиком в области подсознательного? :D

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

Lol.
Ну, хотелось свести все сетевые вызовы в одни класс, чтобы облегчить тестирование.
Да, с синглтоном тестирование усложняется )

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

хотелось свести все сетевые вызовы в одни класс

В теории, каждый класс в твоей программе должен соответствовать какому-то имени-существительному из предметной области. Если твой класс предназначен для того, чтобы свалить в него все какие попались под руку сетевые вызовы, то соответствующую сущность логично назвать «помойкой». Или «кладбищем вызовов». У тебя в предметной области помойки и кладбища предусмотрены?

Manhunt ★★★★★
()
Последнее исправление: Manhunt (всего исправлений: 2)
Ответ на: комментарий от Manhunt

Ok, ты придрался к словам. Не все сетевые вызовы, а все snmp вызовы. Так логичней? )

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

Log

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

Settings

Ты упоролся что ли?

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

Ok, ну так чё советуешь в итоге? Убрать синглтон и параметром во все объекты передавать?
P.S.: unit тесты всё равно отменяются, поскольку не вижу в них смысла для этих объектов...

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

Синглетон — это антипаттерн.

вы таки ещё скажите, что enum - это антипаттерн.

Как из одного вдруг вытекло другое?

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

ну а где различие между мультитоном (enum) и синглтоном, почему синглтон - антипаттерн, а мультитон - нет?

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

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

Не преумножайте сущности без надобности ©

Построй свою программу вокруг логгера-синглтона, и этой возможности ты лишишься.

Это даже к лучшему.

Все эти вопли вокруг Singleton — ерунда. Есть случаи, когда объект один и все тут. У нас одно Солнце, так нет же, обязательно найдется умник и скажет: «представь, что у нас два Солнца!». Да пофиг! Потому что, когда будет два Солнца, Земля не будет больше вращаться по эллиптической орбите и много-много чего еще будет по-другому. Но есть умники, которые думают, что заменив Singleton на что-то другое, мы автоматом получим нужную траекторию...

iVS ★★★★★
()
Последнее исправление: iVS (всего исправлений: 1)
Ответ на: комментарий от UVV

думать - это вообще полезно, делайте это почаще.

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

мультитоном (enum)

Под словом «enum» вообще-то обычно подразумевают «enumerated type». А ты говоришь о... мульти-что?

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

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

maloi ★★★★★
()

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

именно по-этому синглтоны и плохи. сейчас приведу примеры синглтонов и им подобных конструкций

1. gtk_main()/gtk_main_quit() - работают на основе единого счётчика синглтона, «благодаря» чему, гибкой модальности в многооконном приложении можно добиться только за счёт костылестроения

2. zodb - по умолчанию, предлагает синглтонное подключение к дб, «благодаря» чему, коммиты в дб производятся глобально и усложняется создание более одного подключения в одном приложении

3. SQLAlchemy - тоже самое - строим костыли

и так далее.

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

anonymous
()

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

anonymous
()

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

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

Не преумножайте сущности без надобности

Я лишь продемонстрировал, что природа логгера вовсе не подразумевает его единственности.

Потому что, когда будет два Солнца, Земля не будет больше вращаться по эллиптической орбите и много-много чего еще будет по-другому.

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

У нас одно Солнце, так нет же, обязательно найдется умник и скажет: «представь, что у нас два Солнца!». Да пофиг!

Чем меньше разные части программы знают друг о друге, тем программа проще. Многим юниорам это не очевидно, но по факту действует принцип «разделяй и властвуй». Это распространяется и на познания класса о единственности (или множественности, или вообще об устройстве) тех или иных объектов из окружения этого класса. (Кстати, здесь уместно вспомнить еще и про interface segregation; солнце — скорее всего слишком богатый и конкретный объект, и лучше бы классу не знать о том, что он имеет дело именно с солнцем, а не, например, с луной). Твоему классу передали инстанс солнца, ну работай с ним; одно в программе солнце или их много — это не в компетенции твоего класса. Такой класс будет гораздо проще будет переиспользовать, потому что его можно «как есть» разместить в абсолютно непохожем окружении, и он попросту не заметит никаких изменений. Такой код легче юнит-тестировать, потому что в него можно просто передать тестовую версию солнца, не хакая глобальное окружение.

Manhunt ★★★★★
()

А разве не лучше применить Dependency Injection?

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

иди, как твой товарищ выше - подумай, это полезно.

Классный совет, не забудь напомнить о нём своей маме. Ну а по делу можешь сказать что-нибудь?

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