jabber 18.12.2012 21:38 psto

Ууу.
Сейчас меня будут опять неправильно понимать.
Но я уже привык.

Вот смотри.

Есть pImpl.
pImpl — это идиома.
Не более, чем один из многих способов отделять мух от котлет.

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

Никто не кричит, что это "САМАЯ КРУТАЯ ФИШКА В ИСТОРИИ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ И Я ЕЁ УМЕЮ ПРИМЕНЯТЬ!!!".

Благо, что идея pImpl — тривиальна, напрочь связана с конкретным языком и не имеет "реализации" как таковой.
pImpl — сам себе реализация.
Шаблонный pImpl — извращение, в которое я могу постмодернистски поверить. Не более того.

Ценители различают несколько видов pImpl'ов.
Иногда бывают интересны отличия в применении идиомы pImpl при реализации ряда паттернов.

Есть фабрики (в широком смысле этого слова).
Фабрики — это инструмент.

Никто не бегает, не трясёт писькой и не орёт "У МЕНЯ В ДВИЖКЕ ЕСТЬ ФАБРИКИ!!!"
Потому что

- Ахуеть! Дайте две!, — отвечают ему одни.
- Да ты у нас орхетектор, — резюмируют другие.

Потому что фабрики есть везде. В том или ином виде.
Обычный new — это тоже, в широком смысле слова, — фабрика.
И уже тем более some_stream >> smart_pointer_to_variant.
И любой загрузчик — всегда фабрика.

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

В наборе шаблонных реализаций фабрик есть смысл.
Соответственно — есть смысл в их параметризации, policy и т.п.
В реальной жизни бывает много разных фабрик, — и схожесть их использования — не более чем обычная рутинная работа проектировщика.

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

Есть data-driven.
Data-driven — это подход. Целый спектр концептов.
Стирание границ между микро-, макро- и мета- кодом и данными.
Иногда — данные как код. Иногда — код как данные.
Всегда — структура как данные. Всегда — декларативность как застывшая архитектура.
Иногда — куча внешнего инструмента. И всегда — куча документации.

Если кто и бегает с воплями "У МЕНЯ НАТУРАЛЬНО ДАТАДРИВЕН!!!", то типично это означает либо новый проЭкт, либо полностью насмерть заdata-drivenный инструментарий со схемами объектов прямо в инструменте.
Куча DSL, генерация кода, интерпретация ассетов в run-time и так далее.
А может быть — просто winnie.ini.

Никто не будет жертвовать читабельностью и устойчивостью приложения ради красного словца "data-driven".

Решение уходить с поддерживаемого средой стиля в чистое море — это всегда серьёзное решение. Никто не будет заставлять всех писать GetObjects(SQL-запрос или XPath) в игровом коде БЕЗ специального и осознанного и давшегося в муках решения.
Потому что отладчик в настоящем data-driven потом нужно писать самому, и придумывать или использовать нотацию, имена и т.п. — тоже самому.
Потому что просто XML или просто SQL или просто XSD — это всего лишь начало(tm).

И, наконец, есть синглтон.
Синглтон — это или, а некоторые считают что еще и.

Вкратце, синглтон — он чтобы, а еще — чтобы.
А совсем вкратце: http://c2.com/cgi/wiki?SingletonConsider...
Ensure a class has only one instance,
and provide a global point of access to.

То есть "два-в-одном".
Потому что лучшие и самые ясные проектные решения — это когда два-в-одном.
И никак иначе.

То есть не просто namespace или аналогичные языковые и внеязыковые средства.
И не просто один экземпляр объекта, созданный (типично) фабрикой.
Ей же настроенный. Data-driven и через моникёр.

Не просто.

Поэтому все бегают, трясут писькой и радуются "У НАС ВСЁ ЧЕРЕЗ СИНГЛТОН И Я ТЕПЕРЬ ОРХИТЕКТАР!!!" и спрашивают "КАК МНЕ СДЕЛАТЬ ПОЛУТОН С ПОДСЧЁТОМ ССЫЛОК И ЧТОБЫ НИКТО НЕ УШЁЛ ОБИЖЕННЫМ?!!!"

- Ахуеть! Дайте пять!, — подхватывают одни.
- Какая у вас орхетектура, — изумляются другие.
- Как удобно! Мы всего лишь пишем Foo::GetInstance/*<Moo>*/().bar() — и всё работает, не то, что раньше!, — радуются программисты.
- И само создаёт объекты!!! И удаляет их!!!, — гудит толпа на многопоточной галёрке.
- И настраивается само, офтомотически!, — радуются конфигураторы и ревнители фабричного гудка.

- Теперь можно просто писать template<typename T> class Singleton, — снисходительно объясняет аффтар.
- И всё заипёццо.

И действительно.

И ведь реализация — нетривиальная (не то, что pImpl!).
И ведь паттерн — а вовсе даже не идиома.
И ведь шаблонно можно написать один раз. А потом еще раз двадцать подрихтовать под разные применения и policy.

И клиентский код не уродует совсем, если правильно используется.
Удобная штука.
Почему бы не сделать паттерн
МАКСИМАЛЬНЫЙ ИЗ ДВУХ ОБЪЕКТОВ
И идиомой не назовёшь.
И проблем в реализации — столько же (если хочется семантики как в макросе max).
И реализация нетривиальна.
И языком никак не поддержана.

Удивительно...

Итак, канонические drawbacks канонического (Meyers) синглтона:

Синглтон — это глобальная статическая переменная.
Избавляться от него так же тяжело.
Он точно так же расслабляет программистов.

Как всякая глобальная переменная, синглтон предоставляет единую точку входа.
Это (при аккуратном обращении и в правильном контексте) — хорошо.
А вот почему синглтон должен быть ровно одним классом — это для меня непонятно совсем.

Почему бы ему не быть фасадом для целой подсистемы?
Подумай о рендере, о файловой системе.

Почему бы ему не быть фабрикой?
Подумай о fopen и файловых системах.

Почему единственный экземпляр класса с конкретной точкой входа должен ранить весь класс в целом?
Подумай о std::ostream и std::cout.

Точно так же, как и со статическими переменными, непонятен порядок инициализации.
Причём вообще.
А если понятен — почему бы не инициализировать их централизованно?

Типичная запись вызова методов синглтона вообще приводит меня в бешенство.
foo::GetInstance().bar().
За это нужно публично кастрировать.
Зачем каждый раз писать GetInstance()?
Зачем весь коллектив пишет GetInstance()?
Чтобы компенсировать лень одного урода, которому было влом поместить всё это в namespace и аккуратно написать для каждого метода GetInstance() самому?
У нас C++ или замазка для мозгов?

Кидать исключения в синглтоне опасно.
Особенно во время его инициализации — потому что может быть статика.
И не только, поскольку другой синглтон может быть в состоянии инициализации и вызвать тебя, не подозревая, что ты сейчас начнёшь создаваться и т.д. А он может быть в статике.
Или — в твоём деструкторе.

Синглтон создается по инициативе программиста.
Который типично вообще не в курсе, что именно в его функции и создастся экземпляр. Более того, он часто не в курсе, что невинная цепочка вызовов приведёт к такому бардаку.

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

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

Это самые ходовые пойнты.
Я мог забыть что-то ещё, потому что никто в реальной жизни тупые синглтоны не использует.

Типично есть целая связка helperов, дающая или одно или второе или оба вместе: ensure a class has only one instance, and provide a global point of access to.
Но это конкретные helperы на конкретные ситуации.

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

Recommended by:

@RainerGomes: многобуков, почитаю позже

and @magog, @hatred, @nobiiru, @kurkuma
1. mad_hater 18.12.2012 22:03 Home7F5610C4

у меня глаза вытекли где ты это взял?

2. jabbermad_hater /1 18.12.2012 22:04 psto

угадай

3. 2538 18.12.2012 23:01

уже было

4. 2538 18.12.2012 23:05

ппц сколько говна в этом вашем цэпипи

5. 2538 18.12.2012 23:09

просто у вас нет модулей, вот вы и страдаете.

6. 2538 18.12.2012 23:09

вирта на вас нет

7. 0verMind 19.12.2012 06:48

Очередной питух, неосиливший Lisp

8. 2383282538 /5 19.12.2012 08:21

дваждую

9. lHooFool 19.12.2012 12:29

Чет как-то хуйни понаписал вроде, я не до конца понял, но мне кажется это просто плюсопроблемы.

10. Cthulhu 19.12.2012 17:24 Miranda

У тебя тут много умных слов, но я ничего не понял. Наверное ты очень хороший орхетектор.

11. 238328Cthulhu /10 19.12.2012 17:25

его лайкают а тебя нет жпг то

12. jabber2538 /3 19.12.2012 22:10

оперативно

13. jabber2538 /4 19.12.2012 22:11

и чо

14. jabber2538 /5 19.12.2012 22:12

в D есть, где твой турбопаскаль теперь?

15. jabber2538 /6 19.12.2012 22:13

@238328 мой вирт

16. jabber0verMind /7 19.12.2012 22:13

лол //наоборот как раз

18. jabberCthulhu /10 19.12.2012 22:14

не я //):

19. jabber238328 /11 19.12.2012 22:14

толсто

20. jabber238328 /8 19.12.2012 22:20

ппц ты тупой

21. lHooFooljabber /17 20.12.2012 04:41

Ладно

22. jabberlHooFool /21 20.12.2012 04:41 psto

чо

23. lHooFooljabber /22 20.12.2012 04:42

Не знаю. Как дела?

24. jabberlHooFool /23 20.12.2012 04:42 psto

Откуда? 1.

25. lHooFooljabber /24 20.12.2012 04:42

У меня тоже.

26. jabberlHooFool /25 20.12.2012 04:43 psto

отвечай на мой ответ

27. lHooFooljabber /26 20.12.2012 04:43

У меня аргументы кончились.

28. jabberlHooFool /27 20.12.2012 04:44 psto

сполосни их

29. lHooFooljabber /28 20.12.2012 04:44

У меня воды горячей нет, можно я их просто протру влажной салфеткой?

30. jabberlHooFool /29 20.12.2012 04:45 psto

смотря от чего она влажная

31. lHooFooljabber /30 20.12.2012 04:46

Я не лезу в ее личную жизнь, а она в мою.

32. jabberlHooFool /31 20.12.2012 04:46 psto

не пизди, ты ею тереть собирался

33. lHooFooljabber /32 20.12.2012 04:47

Это плата за то, что она живет с друзьями у меня.

34. jabberlHooFool /33 20.12.2012 04:48 psto

тем более ты должен знать от чего

35. lHooFooljabber /34 20.12.2012 04:49

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

36. jabberlHooFool /35 20.12.2012 04:50 psto

зачем тебе работа и учёба если смерть неизбежна

37. lHooFooljabber /36 20.12.2012 04:51

Чтобы не умереть в армии, каналицационном коллекторе или дома у родителей.

38. jabberlHooFool /37 20.12.2012 04:52 psto

какая разница где умирать лул

39. lHooFooljabber /38 20.12.2012 04:53

В моей маленькой комнате в общаге я хотя бы смогу умереть в тепле и комфорте смотря Adventure Time. В иных случаях — я умру в страшных муках.

40. jabberlHooFool /39 20.12.2012 04:57 psto

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

41. lHooFooljabber /40 20.12.2012 04:57

А зачем жить?

42. jabberlHooFool /41 20.12.2012 04:59 psto

А зачем ты живешь? Ведь ты мог бы прямо сейчас умереть и делать то же самое.

43. lHooFooljabber /42 20.12.2012 05:00

Я не могу убить себя. Это единственная причина моей жизни.

44. jabberlHooFool /43 20.12.2012 05:00 psto

Можешь.

45. lHooFooljabber /44 20.12.2012 05:01

Могу. Но не хочу. Пожертвовать собой — легко, а вот просто убить нет.

46. jabberlHooFool /45 20.12.2012 05:02 psto

Вооот. А почему ты не хочешь?

47. 2538jabber /14 20.12.2012 15:36 fx

анус твой турболаскай

48. Cthulhu2538 /47 20.12.2012 15:36 work

А в его анусе оберон?

49. 2538Cthulhu /48 20.12.2012 15:38 fx

хачкель

50. 25382538 /49 20.12.2012 15:38 fx

или гомо лисп

51. 238328Cthulhu /48 20.12.2012 15:41

в моём анусе все анусы мира

52. 2538238328 /51 20.12.2012 15:42 fx

One Ring to rule them all

53. 2383282538 /52 20.12.2012 15:43 367487326135615239590855

>2013
>star trek

54. 2538238328 /53 20.12.2012 15:44 fx

N Ч0?

55. Cthulhu238328 /53 20.12.2012 15:45 work

Вот и выросло поколение...

56. 2383282538 /54 20.12.2012 15:45 367487326135615239590855

да понимаешь неуважение просто, ты как лох, в 2014 таким заниматься

57. 238328Cthulhu /55 20.12.2012 15:45 367487326135615239590855

нахрен нужны эти Стругацкие?

58. 2538238328 /56 20.12.2012 15:45 fx

через три часа всё кончится, какая разница вообще

59. 2383282538 /58 20.12.2012 15:45 367487326135615239590855

какие

60. 2538238328 /57 20.12.2012 15:46 fx

61. 2383282538 /60 20.12.2012 15:46 367487326135615239590855

ставь борщ!!)))

62. 2538238328 /61 20.12.2012 15:48 fx

(: // уже на самом деле

63. 2383282538 /62 20.12.2012 15:48 367487326135615239590855

хорошо быть тобой

64. 2538238328 /63 20.12.2012 15:50 fx

мне норм

65. 2383282538 /64 20.12.2012 15:52 367487326135615239590855

нет //на самом деле //

66. 2538238328 /65 20.12.2012 15:53 fx

нет, норм

67. kurkuma 20.12.2012 18:07

Все так.

68. mad_hater 20.12.2012 18:08 HomeE8777D15

бля да на ИНТЕРКАЛ надо писать во-первых название красивое во вторых язык простой

69. kurkumamad_hater /68 20.12.2012 18:11 Gajim

Газовые горелки Intercal (Интеркал) SGN в Минске. Беларусь ...

70. kurkumamad_hater /68 20.12.2012 18:11 Gajim

ИНТЕРКАЛ — микроботаник Виртуальный дневник Интеркал.

72. mad_haterkurkuma /71 20.12.2012 18:12 HomeE8777D15

да вот на этом

73. 238328jabber /15 20.12.2012 19:09 367487326135615239590855

сквирт

74. 238328lHooFool /41 20.12.2012 19:15 367487326135615239590855

ппц ты тупой

75. 2538238328 /74 20.12.2012 19:16 fx

ты

76. 0verMind2538 /75 20.12.2012 19:16 Gajim

я

77. 25380verMind /76 20.12.2012 19:16 fx

да

78. 2383282538 /58 20.12.2012 19:17 367487326135615239590855

пруф?

79. 2538238328 /78 20.12.2012 19:18 fx

в прессе

80. kurkuma238328 /78 20.12.2012 19:18 Gajim

я весь кончился пряма тута

81. 2538kurkuma /80 20.12.2012 19:20 fx

ах ты сучка

82. 238328kurkuma /69 20.12.2012 19:23 367487326135615239590855

ппц ты тупой

83. 2383282538 /75 20.12.2012 19:24 367487326135615239590855

почему?

84. 2538238328 /83 20.12.2012 19:25 fx

кто обзывается тот сам так называется
!

85. 2383282538 /84 20.12.2012 19:28 367487326135615239590855

зачем ты нашёл причину? ппц ты тупой // :)
////только олдфаги поймут

86. 2538238328 /85 20.12.2012 19:29 fx

ракование нулевого уровня

87. 2383282538 /86 20.12.2012 19:29 367487326135615239590855

я раковал еще тогда, когда это было модно

88. kurkuma238328 /85 20.12.2012 19:31 Gajim

я олдфаг и хiхiл

89. 238328kurkuma /88 20.12.2012 19:32 367487326135615239590855

возможно вы имели в виду: олдфаг и iiiii

90. kurkuma238328 /89 20.12.2012 19:32 Gajim

i пiдiр i сiciл

91. 238328kurkuma /90 20.12.2012 19:33 367487326135615239590855

i iiiii i iiiii

92. 2538238328 /87 20.12.2012 19:33 fx

а я раковал когда это было уже не модно

93. 2538238328 /91 20.12.2012 19:33 fx

!!!! ! !!!!!!!!! !

94. 2383282538 /92 20.12.2012 19:33 367487326135615239590855

было у меня в блоге, прости

95. kurkuma2538 /93 20.12.2012 19:33 Gajim

блджад как???!!!!

96. 2383282538 /93 20.12.2012 19:33 367487326135615239590855

:)
i

97. 238328kurkuma /95 20.12.2012 19:34 367487326135615239590855

magnets

98. kurkuma238328 /97 20.12.2012 19:34 Gajim

маджик

99. 2538238328 /94 20.12.2012 19:35 fx

твоё что насрал, и то пока летит

100. 2538kurkuma /98 20.12.2012 19:36 fx

таджик

101. kurkuma2538 /100 20.12.2012 19:37 Gajim

сделай!! или ты не таджик?

102. 2538kurkuma /101 20.12.2012 19:37 fx

на всё воля аллаха, куркума-джян

103. kurkuma2538 /102 20.12.2012 19:38 Gajim

:-J

104. 2538kurkuma /103 20.12.2012 19:39 fx

инщалла

105. jabberjabber /46 21.12.2012 03:31

Видимо понял что на самом деле не хочет ггг

106. jabberkurkuma /67 21.12.2012 03:31

Как?

107. jabbermad_hater /68 21.12.2012 03:32

фейл по обоим пунктам

108. lHooFooljabber /46 21.12.2012 03:40

Потому, что разочарую несколько людей.

109. jabberCthulhu /48 21.12.2012 03:45 psto

оберона его ануса звучат вызывающе

110. jabber2538 /49 21.12.2012 03:46 psto

хачкель-истеричка не видит этот псот, а жаль, вот бы ему бомбануло!

111. jabber238328 /51 21.12.2012 03:47 psto

не льсти себе

112. jabberlHooFool /108 21.12.2012 04:24 psto

Но ведь ты же умрёшь и тебя это не будет больше беспокоить, так какая тебе разница? Более того, они тоже умрут и уже вполне разочарованы этим фактом. Так что нет, не то.

113. kurkumajabber /106 22.12.2012 10:50 Gajim

как-то так

Do you really want to delete ?