psilogic: (Default)
psilogic ([personal profile] psilogic) wrote2005-11-06 11:23 pm

Программистское

Под катом много мата. Накипело.


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

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

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

[identity profile] psilogic.livejournal.com 2005-11-06 09:19 pm (UTC)(link)
Да при чем тут грабли вообще? Вон выше пример паттерна. Объясни, при чем тут грабли?

[identity profile] rmihael.livejournal.com 2005-11-06 10:05 pm (UTC)(link)
анонимный коммент выше -- мой. пароль отвалился.

[identity profile] psilogic.livejournal.com 2005-11-06 10:43 pm (UTC)(link)
дочёрта усилий - для правильной реализации? она ж тупая?
ааа... понял - для ПРАВИЛЬНОЙ... а там небось наворотили говна... а?

[ наследованием и так далее было вполне себе паттерном. Просто слова тогда ещё не придумали. ]

Так ведь придумали же: "виртуальные функции", "наследование". А это называется плагиат чистой воды: переименовать и выдать за открытие

[identity profile] rmihael.livejournal.com 2005-11-07 06:55 am (UTC)(link)
> дочёрта усилий - для правильной реализации? она ж тупая?
> ааа... понял - для ПРАВИЛЬНОЙ... а там небось наворотили говна... а?
Ну если брать в качестве примера ту реализацию, которую вы привели в стёртом комменте -- то до правильной ей очень далеко. Во-1ых не закрыты конструктор копирования, деструктор и оператор присваивания. Во-2ых никак не определён порядок уничтожения синглтона. В-3их - оно вообще не заработает, потому что вы забыли выполнить присваивание в getInstance().В-4ых - а почему именно так? Ведь можно вместо проверки указателя на null использовать статические переменные -- или класса, или функции.
А что начинает твориться, когда есть несколько зависимых синглтонов...

> Так ведь придумали же: "виртуальные функции", "наследование". А это
> называется плагиат чистой воды: переименовать и выдать за открытие
не помню, что кто-то выдавал эти приёмы за своё открытие. Да и в книге GOF нигде не говориться, что описанные там паттерны -- изобретение авторов. Наоборот, во вступлении прямым текстом пишут, что это не так.

[identity profile] psilogic.livejournal.com 2005-11-07 11:40 am (UTC)(link)
[ Ну если брать в качестве примера ту реализацию, которую вы привели в стёртом комменте -- то до правильной ей очень далеко. ]

[ Во-1ых не закрыты конструктор копирования, деструктор и оператор присваивания. ]

Конструктор закрыт

[ Во-2ых никак не определён порядок уничтожения синглтона. ]

Вот потому то деструктор вообще не написан - его реализация зависит от конкретного случая. Если надо, чтобы уничтожался он овнером, то одно, если по счетчику ссылок - другое и т.п. Аналогично с конструктором присваивания.

[ потому что вы забыли выполнить присваивание в getInstance().]

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

[ В-4ых - а почему именно так? ]

А почему не так? Работает - и ладно.

[ Ведь можно вместо проверки указателя на null использовать статические переменные -- или класса, или функции. ]

Можно. Можно вообще написать еще 10 вспомогательных классов и красивенькую иерархию в розе нарисовать :) Но это если платят за строки, а не за сроки :)

[ А что начинает твориться, когда есть несколько зависимых синглтонов... ]

А что начинает твориться? :)

Вы так и не ответили на мой вопрос. Вот ввели понятие "синглтон", описали. КАК это помогает производственному процессу? Вы сказали про грабли - на КАКИЕ грабли мешает наступать и почему?

[ Наоборот, во вступлении прямым текстом пишут, что это не так. ]

Ну и зачем новые названия для старых понятий? Что дают новые слова??

[identity profile] rmihael.livejournal.com 2005-11-07 04:33 pm (UTC)(link)
> Конструктор закрыт
Только обычный, а не копирования.
> Вот потому то деструктор вообще не написан - его реализация зависит от
> конкретного случая. Если надо, чтобы уничтожался он овнером, то одно,
> если по счетчику ссылок - другое и т.п. Аналогично с конструктором
> присваивания.
Конкретных случаев не так уж и много. И вполне полезно их рассмотреть в одном месте во избежание различных граблей. У тех же Влислидеса и Александреску примеров таких граблей именно для синглетона приведено немало.
> А что в коде, составленному после чтения болтовни по паттернам, я бы ни
> в коем случае не опачатался бы? :)
Да стебусь я слегка :)
> А почему не так? Работает - и ладно.
Именно, что работает. А остальные варианты работают далеко не всегда. И если бы я в своё время не прочитал подробного разбора синглетона как шаблона, то непременно бы реализовал бы его на статическом члене класса. Тем более, что строк там меньше.
> А что начинает твориться? :)
Начинает играть неопределённый порядок уничтожения объектов. Сам на такое натыкался, очень неприятный баг.
> Вы так и не ответили на мой вопрос. Вот ввели понятие "синглтон",
> описали. КАК это помогает производственному процессу? Вы сказали про
> грабли - на КАКИЕ грабли мешает наступать и почему?
1. Словарная функция.
2. Грабли у Александреску и Влислидеса, делать конспект у меня охоты нет, уж извините :)
3. Опыт накапливается. Не нравится вам какой-то шаблон -- не используйте. Мне вон Visitor не нравится, так я без него и обхожусь.
> Ну и зачем новые названия для старых понятий? Что дают новые слова??
А зачем математики определения вводят? Вон Ньютон уже вполне спокойно оперировал пределами и производными. Хотя определения появились сильно позже. По вашей логике надо было просто тщательно курить "Флюкции и флюенты", а не страдать чепухой с формальными определениями.

[identity profile] psilogic.livejournal.com 2005-11-07 05:00 pm (UTC)(link)
[ Только обычный, а не копирования. ]

А зачем? Защита - не самоцель, при остром желании в одном месте можно ведь и memcpy поюзать.

[ У тех же Влислидеса и Александреску примеров таких граблей именно для синглетона приведено немало. ]

И как ПАТТЕРН позволяет грабли обойти? Пример?

[ И если бы я в своё время не прочитал подробного разбора синглетона как шаблона, то непременно бы реализовал бы его на статическом члене класса. Тем более, что строк там меньше. ]

Объясняй, давай, в чем бонус.

[ Начинает играть неопределённый порядок уничтожения объектов. Сам на такое натыкался, очень неприятный баг. ]

При чем тут паттерн?

[ 1. Словарная функция. ]

И только :)

[ 2. Грабли у Александреску и Влислидеса, делать конспект у меня охоты нет, уж извините :) ]

Хоть 1 пример граблей с пояснениями, почему именно ПАТТЕРН от именно этих граблей спасает.
Ошибки разные можно годами описывать - было бы желание :)

[ А зачем математики определения вводят? ]

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

[identity profile] rmihael.livejournal.com 2005-11-07 05:11 pm (UTC)(link)
Давайте сначала определимся, что считать паттерном. А то как бы всё это в терминологический спор не вылилось.

[identity profile] psilogic.livejournal.com 2005-11-07 08:44 pm (UTC)(link)
Вот вы и объясните - я же только по диагонали просмотрел, а вы, наверное, книжку прочли...

[identity profile] firtree.livejournal.com 2005-11-07 10:40 pm (UTC)(link)
> И как ПАТТЕРН позволяет грабли обойти? Пример?

Не паттерн, а книжка про паттерны. В ней есть комментарии: вот здесь такие-то грабли, не наступите, типовые способы их обхода такие:...

> Объясняй, давай, в чем бонус.

А может, ты сам Александреску почитаешь?

[identity profile] psilogic.livejournal.com 2005-11-07 10:51 pm (UTC)(link)
дык мне 1 пример чтобы понять, есть ли смысл читать
may be там про те грабли, которые давно знакомы...

[identity profile] firtree.livejournal.com 2005-11-07 11:35 pm (UTC)(link)
Ну вот ты можешь мне точно описать время жизни глобальной статической переменной? А можешь сделать так, чтобы оно было меньше или больше по вкусу? Например, для конструирования нужна информация, которая при запуске спрашивается у пользователя или из конфигурационного файла. Или при окончании возникает потребность в переменной уже после окончания main () (для этого придуман феникс). Высший пилотаж - это задавать отношения между синглтонами "этот создаётся раньше, этот создаётся позже". Причём заметь, между синглтонами в разных единицах компиляции, которые знать друг друга не знают. А если надо обойти семантику "освобождение обратно захвату"? В смысле, не "[{}]", а "[{]}". Хотя это редко нужно, и лучше передизайнить.

Так вот, для многих из этих задач синглтон как глобальная статическая переменная непригоден. Это и есть грабли.

[identity profile] psilogic.livejournal.com 2005-11-08 09:28 am (UTC)(link)
Глобальная статическая по определению рождается на старте программы и уничтожается на выходе. Порядок рождения/уничтожения относительно других статических объектов неопределен. Если же ты хочешь "по вкусу" - то это будет уже не статическая, а динамическая (new/delete) а для разделяемого доступа статическим надо сделать указатель на нее.

[ Высший пилотаж - это задавать отношения между синглтонами ]

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

[identity profile] firtree.livejournal.com 2005-11-08 10:16 am (UTC)(link)
Та-а-ак, и как же ты сделаешь динамическую переменную с разделяемым доступом?

[identity profile] psilogic.livejournal.com 2005-11-08 11:03 am (UTC)(link)
очень просто: УКАЗАТЕЛЬ на нее сделаю статическим (для реализации указателя возможны варианты: extern-переменная, static-переменная, static-переменная класса, переменная в namespace, переменная, получаемая через get/set функции, которые опять же могут быть разных видов итд, итп)

[identity profile] firtree.livejournal.com 2005-11-08 02:50 pm (UTC)(link)
Ну и? А инициализировать переменную кто будет, Пушкин? А удалять?

[identity profile] psilogic.livejournal.com 2005-11-08 04:25 pm (UTC)(link)
Это зависит от конкретной задачи. Если согласно требованиям удалять будет Пушкин - значит Пушкин :)

[identity profile] firtree.livejournal.com 2005-11-08 04:56 pm (UTC)(link)
О, с синглтоном большая часть науки и граблей, собственно, и состоит в том, кто и когда его создаёт и удаляет. Ну и ещё некоторое количество граблей - кому и как давать к нему доступ, например, в многопоточной среде.

(no subject)

[identity profile] psilogic.livejournal.com - 2005-11-08 18:48 (UTC) - Expand

[identity profile] firtree.livejournal.com 2005-11-08 10:19 am (UTC)(link)
Кстати, вот тебе задача, на которую я не знаю ответа: как ты сделаешь персистентный синглтон?

[identity profile] psilogic.livejournal.com 2005-11-08 11:01 am (UTC)(link)
что такое персистентный?

[identity profile] firtree.livejournal.com 2005-11-08 02:49 pm (UTC)(link)
Сохраняющий состояние между запусками программы.

[identity profile] psilogic.livejournal.com 2005-11-08 04:24 pm (UTC)(link)
Стандартно: в файл клади

[identity profile] firtree.livejournal.com 2005-11-08 04:50 pm (UTC)(link)
А в какой момент? И вопрос, не относящийся к синглтону, но всё равно заковыристый: как определить, где файл?

(no subject)

[identity profile] psilogic.livejournal.com - 2005-11-08 18:46 (UTC) - Expand

[identity profile] max-gashkov.livejournal.com 2005-11-06 11:59 pm (UTC)(link)
Стандарты и паттерны — вещи разного порядка, вот что я хотел сказать.

«Синглтон» произносится быстрее, чем «глобальный статический объект!» :Р

[identity profile] psilogic.livejournal.com 2005-11-07 11:41 am (UTC)(link)
Ну порядок может и разный, а принцип один: ковровая стандартизация всего вплоть до стиля "как быстро бегать между станками"