1. C++ / Говнокод #3549

    +159

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    class ControlerSingleton
    {
    private:
    	static int ControlCode;
    	static bool disaPear;
    	static int ArraySize;
    	//...
    	void Constructor()
    	{
    		//...
    		ArraySize=sizeof(masi)/sizeof(masi[0]);
    		disaPear=Pear();
    		threadRAII.Wait();
    		ControlCode=threadRAII.result();
    		//...
    	};
    	static int construct=Constructor();
    public:
    	const bool Pear()
    	{
    	//...
    };

    Своеобразный "конструктор" в классе синглтона.

    Запостил: Говногость, 23 Июня 2010

    Комментарии (112) RSS

    • А чего это void Constructor() не static?
      И как его в int construct присвоили?
      Что тут происходит вообше? Интересно просто :)
      Ответить
      • >А чего это void Constructor() не static?
        По памяти писал. Статик там есть.
        Ответить
      • >И как его в int construct присвоили?
        И int там есть. Тоже попутал что-то...
        Ответить
      • >Что тут происходит вообше?
        Это "типа" паттерн Синглтон. Не он, но чем-то похож. Инициализация статических членов класса происходит при вызове функции constructor. Эта функция реально результата не возращает, но как-бы имеет возвращаемы тип int. Этот "псевдо-конструктор" вызывается, во время инициализации статического члена int construct.
        Ответить
        • показать все, что скрытозачем вообще синглтоны нужны, если можно статическими методами/полями всё делать? синглтоны идут сосмоллтока, и там это было оправдано, потому что статики не было, но видеть синглтоны например в яве - это же смешно и неуклюже.

          в дотнете в этом смысле поумнели. ну сравните, допустим, яву:
          ява: Runtime.getRuntime().totalMemory().
          дотнет: GC.GetTotalMemory(0

          Ну скажи, ты этот обхект - Runtime - сериализовать что ли собираешься? Нахрен он нужен?

          Или в с++ сложнее со статическими функциями/полями? В сишарпе и яве есть статический конструктор. А тут? Как ни крути, синглтоны - дебилизм, юзающийся по инерции там, где он не нужен.
          Ответить
          • >ты этот обхект - Runtime - сериализовать что ли собираешься? Нахрен он нужен?
            Ты так спрашиваешь, будто я это написал. :D
            Ответить
          • Синглтон от статик-класса отличается, как минимум, возможностью унаследовать его от какого-нибудь интерфейса, и потом передать на него ссылку/указатель в метод, ожидающий получить нечто, реализующее данный интерфейс.

            Мне даже приходилось такое делать. Бывает очень полезно.
            Ответить
          • я сейчас из синглтонов делаю неймспейсы... есть преимущества и недостатки...
            из преимуществ вызовы вфглядят так
            Manager::SomeMethod()
            из недостатков, нужно делать методы Init/Close которые не вызовутся автоматически (хотя в синглтонах их иногда тоже надо вызывать, либо где-то создавать сам синглтон), нельзя создать класс наследник (но это реально редко надо)...
            Ответить
            • показать все, что скрыто> из недостатков, нужно делать методы Init/Close которые не вызовутся автоматически (хотя в синглтонах их иногда тоже надо вызывать, либо где-то создавать сам синглтон)


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

              Хм, в сишарпе статических деструкторов как таковых нет... Как выход - подписаться на событие AppDomain.CurrentDomain.DomainUnload разве что...


              > нельзя создать класс наследник (но это реально редко надо)...

              Не могу придумать пример.
              Хотя в голову пришла например консоль. Если консоль - синглтон, то можно сделать ей интерфейс IStream и работать как с потоком: ((IStream)Console.GetConsole()).ReadByte s(). Это да.
              Но в то же время в бессинглтоновой модели это легко реализуется аггрегацией: Console.GetIntputStream().
              Так что небольшое это и преимущество...
              Ответить
              • статика конструируется до main...

                то есть можно писать так
                int* i = new int();
                в момент вызова main в i будет валидный указатель на int...
                Ответить
              • это называется отложенная инициализация...
                Ответить
                • показать все, что скрыто> статика конструируется до main...

                  > это называется отложенная инициализация...

                  Не очень-то она отложенная. Т.е. если у меня в проекте (допустим, большущая библиотека) 1000 классов, то на стартапе у меня будут конструироваться статические конструкторы всех 1000 классов?

                  Можно сделать отложенно через синглтоны -- проверять на null и конструировать синглтон НО! это потоконебезопасно, во время такого конструирования с другого потока могут этот же синглтон вызвтаь, в итоге конструктор вызовется два раза. Е*аться с критиченскими секциями? Их тоже нужно где-то иницилизировать, хаха (под винапи нету статической инициализации критич. секций в отличие от ПОЗИКС)

                  Крутой же с++ ))

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

                  А чем можем похвастаться с++?
                  Ответить
                  • я тебе написал, что все статические члены классов проинициализируются до main. и написал кусок кода который точно работает вне функций, этот кусок выполнится до main.
                    если у тебя в каждом из 1000 классов, 1 статический член, который не может быть инициализирован в компайл тайме, он будет инициализироваться до вызова main... все конструкторы (кроме статических членов функции) вызываются в том же потоке, в котором позже вызовется main... под винапи критические секции инициализируются специальной оберткой (фейл с твоей стороны считать что это невозможно).
                    Ответить
                    • показать все, что скрыто> под винапи критические секции инициализируются специальной оберткой (фейл с твоей стороны считать что это невозможно).

                      покажи тогда, мне пригодится на будущее (с++ не предлагать, только с...)
                      Ответить
                      • аналог PTHREAD_MUTEX_INITIALIZER т.е.
                        Ответить
                      • class CriricalSection
                        {
                          CRITICAL_SECTION section;
                        public:
                          CriricalSection()
                          {
                            InitializeCriticalSection( &section );
                          } 
                        
                          void Lock()
                          {
                            EnterCriticalSection( &section );
                          }
                        
                          void Unlock()
                          {
                            LeaveCriticalSection( &section );
                          }
                        
                          ~CriricalSection()
                          {
                            DeleteCriticalSection(&section);
                          }
                        }

                        как использовать сам догадаешься??
                        Ответить
                        • я просил с, а не с++, ибо речь шла про встроенные средства винапи.
                          так или иначе, это даст мне статическую инициализацию? т.е.

                          static CriricalSection syncRoot;
                          
                          int main() { syncRoot.Lock(); }


                          так?
                          Это псевдостатика, реально же это рантайм-инициализация, т.е. оно рантаймно вызывает функции в __main. А я просил истинно статическую инициализаци.

                          Вот ты столько кода наприсал, а в позиксе это реализуется одной строчкой:

                          pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;


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

                          Я это имел в виду.
                          Ответить
                          • че-то мне кажется что тут будет инициализация при первом использовании, так как в компайл тайме нельзя получить доступ к объекту ядра, используемом в mutex для реализации очереди потоков...
                            Ответить
                            • это именно что инициализация, т.е. объект уже готов к использованию. при первом использовании уже будет нечто большее, чем просто инициализация - это внутреннее дело операционной системы вообще, чё она там делает under the hood. Главное, что объект уже статически готов к использованию (могу вызывать pthread_mutex_lock в любой точке программы), и он отложен ("доинициализируется" по требованию). А в с++ - или тупой брутфорс, или инициализируй вручную в рантайме.
                              Ответить
                              • к счастью мы с тобой ценим разные подходы к программированию...
                                мне нравится то что в С++ вся инициализация пройдет на этапе загрузки, так как паттерн

                                Use()
                                {
                                  If (notInit)
                                  {
                                    Init()
                                  }
                                }

                                меня не устраивает полностью и я его считаю говнокодом...
                                Ответить
                                • Почему? В моно проверка произойдёт только один раз, автоматически, лениво, потокобезопасно, после чего участок кода (if(notInit) Init()) запатчится nop'ами. Это всё гуд.
                                  Ответить
                                  • это все ужасно... самый ужасный поступок программы это запись в блок кода, современные процессоры на это очень плохо реагируют (сброс не только конвеера, но и линии кеша по этому адресу)... ты сейчас выглядишь очень глупо, пытаясь найти оправдание несовершенству компилятора Шарпа...
                                    Ответить
                                    • Это происходит один раз при инициализации.
                                      Ответить
                                    • Ты хрень щас несёшь. Одно дело когда кусок кода проигрываться миллион раз и каждый раз код патчится. Другое дело - когда один раз. Сброс кеша твой будет только один раз. Т.к. инициализация происходит до непосредственной работы с классом, никакой конвеер не сбрасываетя, ибо его тут и не было ещё. Оверхед намного меньший, чем ежли б грузить все статические объекты по очереди.
                                      Ответить
                                      • конвеер в процессоре существует всегда! или ты опять думаешь что это все волшебство??

                                        ну мне допустим не нравится что какой-то простой метод, вдруг случайно обратится к неинициализированному синглтону и будет висеть в его инициализации, из-за этого я (да и многие С++ программисты, которые в курсе) не люблю статические данные в функции, так как они (вроде ГСС страдает такой хней)инициализируются при первом вызове... это плохо... С++ гарантирует что статические данные инициализируются до вызова меин, и проблем во время работы не будет!
                                        Ответить
                                        • > ну мне допустим не нравится что какой-то простой метод, вдруг случайно обратится к неинициализированном у синглтону и будет висеть в его инициализации

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

                                              Непонял, где ты этот оверхед взял? Он случается только один раз. Так же и методы - оверхед происходит только один раз, во время компиляции. Дальше уже патчится указатель на скомпилированный участок.
                                              И вообще, причём здесь кеши и конвееры? Это то же самое, как если бы нативная программа впервые вызвала некую функцию. В моно всё реалдизуется трамполинами, это участки кода-переходы, они создаются на один раз, а потом удаляются (или патчатся, или просто удаляютя)...

                                              А сиплюс например умеет share инстансы шаблонов? Или для кажого типа генерит свою нативную реализацию? А вот моно умеет share. В памяти и на диске меньше памяти, и кеш круче.
                                              Ответить
                                              • > Он случается только один раз.
                                                а я и говорю что один раз... просто никто не знает когда именно...
                                                Ответить
                                              • а если вспомнить про многопоточность, то там еще и синхронизация... в общем один сплошной фейл...
                                                Ответить
                                                • Вот это я не знаю, как они там синхронизуют. Однако опять же, синхронизация происходит только один раз за все время работы. Это совсем не оверхед. Вот если бы при каждом вызове был лок - то другое дело.
                                                  Ответить
                        • Не издевайтесь так над людьми:
                          CriricalSection locker;
                          //...
                          void func(void)
                          {
                            locker.Lock();
                            if(expression)
                              throw Exception;
                            locker.Unlock();
                          };

                          Это бы автоматизировать, что-бы нельзя было ошибиться.
                          Ответить
                          • макросы, макросы... или шаблонами можно?
                            Ответить
                          • template< class Locker >
                            class AutoLock
                            {
                                Locker& mLocker;
                              public:
                                AutoLock( Locker& locker ) : mLocker(locker)
                                {
                                  mLocker.lock();
                                }
                            
                                ~AutoLock()
                                {
                                  mLocker.unlock();
                                }
                            }

                            пожалуста...
                            Ответить
                            • использование

                              void func(void)
                              {
                              AutoLock<CriticalSection> auto_cs;
                              if(expression)
                              throw Exception;
                              };
                              Ответить
                              • а что будет если я хочу рекурсивные локи?

                                т.е. func может вызвать самого себя, в котором будет ещё один лок. Сработает? Пупок не развяжется?
                                Ответить
                                • прикинь, все будет ок... критическая секция это разрешает... только вот код который на это ориентируется, достоин поста на этом сайте...
                                  Ответить
                            • А если новичёк в рабочей комманде начнёт дергать Lock напрямую? Эта реализация CriricalSection поощряет не верное использование.
                              К томуже в AutoLock приходится указывать каждый раз параметр шаблона, что не удобно.
                              Ответить
                              • typedef спасает от параметра шаблона. (хотя может можно было и без него, по типу конструктора параметр подобрался бы автоматически, но я люблю наглядность)...
                                новичку один раз стоит показать как надо, и он с этого, как с иглы, никогда не слезет...
                                на gamedev.ru есть подсказка на эту тему...
                                Ответить
                              • примитив можно дергать напрямую, этот код лиш обертка к этому дерганию...
                                Ответить
                                • >примитив можно дергать напрямую
                                  Да, и это будет не хорошо из-за возможности появления исключений.
                                  Ответить
                                  • почитай александреску, там вроде был способ это избежать...
                                    для обхода проблем с исключениями и досрочным выходом и придуман этот паттерн, не пользуешься - сам себе макака...
                                    Ответить
                                    • >почитай александреску, там вроде был способ это избежать...

                                      Вообщето я об этом паттерне и говорил. "Двойная проверка". Именно Александреску его и описывает. :D
                                      Ответить
                                      • я имел ввиду автоматические переменные, а не тип блокировки...
                                        Ответить
                        • Зачем использовать медленую критическую секцмю, если можно использовать паттерн "двойная проверка"?
                          Ответить
                          • > паттерн "двойная проверка"?
                            Что это?

                            Критические секции не такие уж и медленные
                            Ответить
                            • http://lmgtfy.com/?q=%D0%BF%D0%B0%D1%82%D1%82%D0%B5%D1%80%D0%BD+%D0%B4%D0%B2%D0%BE%D0%B9%D0%BD%D0%B0%D1%8F+%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0
                              Ответить
                              • это антипаттерн иопта

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

                                и громоздко

                                и рантайм-проверка

                                и хаки

                                что вам статические конструкторы по требованию не нравятся???
                                Ответить
                                • >что вам статические конструкторы по требованию не нравятся???
                                  Какой же вы всё-таки тролль... Я никогда это не опровергал. Не на одном С++ мир замкнулся.
                                  Вы одиноки? Ищите повод поговорить? Советую обратиться к хорошему психологу.
                                  Ответить
                          • недавно cfdev выступал за паттерн "лучше все 7 раз проверить, чем писать ассерт"... я так понимаю это из того же разряда??
                            Ответить
                            • Создание объекта идёт лишь раз и каждый раз при вызове дёргать критическую секцию - идиотизм.
                              Ответить
                              • Это вы про меня? В сишарпе, за который я говорю, пропатчится нопами, никто дёргать критическую секцию не будет.
                                Ответить
                            • >лучше все 7 раз проверить, чем писать ассерт
                              Это из разряда: я не доверяю автоматическим средствам и сделаю всё сам. Я предлагал использовать оптимизирующий паттерн. Паттерн и паранойя - это разные вещи.
                              Ответить
                    • показать все, что скрыто> все конструкторы (кроме статических членов функции) вызываются в том же потоке, в котором позже вызовется main

                      Я-то говорил про создание отложенных синглотонов. Как может отложенный сингдтон вызываться по требованию из другого потока (в нашем случае - main)? Здесь нужен какой-то хитрый рантайм уже (что-то вроде сигналов/прерываний, чтобы остановить главный поток, перезаписать регистры след. инструкции, прыгнуть на код создангия, потом вернуть обратно - бред )) ).
                      Ответить
                      • если у тебя в голове есть хоть капля ума, то ты догадаешься начать использовать потоки и синглтоны только в main...
                        Ответить
                        • > если у тебя в голове есть хоть капля ума, то ты догадаешься начать использовать потоки и синглтоны только в main..

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

                          и причём здесь ум? неговнокодерскому синглтону должно быть без разницы, в контексте какого потока он создаётся. здесь проблема только в синхронизации записи указателя получается.
                          Ответить
                      • тебе не надоело принадлежать к той части людей которые считают работу компьютера волшебством??
                        Ответить
                        • я прекрасно знаю внутренности, с чего ты решил обратное?
                          Ответить
                  • в С++ нет проверок на инициаоизацию статики при обращении к классу, так как она инициализируется до main, инициализация статических членов функции зависит от компилятора (в gcc при первом вызове)
                    Ответить
                    • показать все, что скрыто> в С++ нет проверок на инициаоизацию статики при обращении к классу, так как она инициализируется до main, инициализация статических членов функции зависит от компилятора

                      Ну вот это я бы и не назвал "отложенной инициализацией", потому что она нифига не отложенная. В сишарпе если ты за весь ход программы ни разу не обращался к классу X, то его статический конструктор ни разу и не вызовется... А с++ прёт напролом. Минус сиплюсу в этом плане.
                      Ответить
                      • а мне например больше нравится вызов всех конструкторов до мейн, так как неиспользуемые части кода в С++ не попадают в билд... так что С# опять слился...
                        Ответить
                        • > так как неиспользуемые части кода в С++ не попадают в билд...

                          а если у нас библиотека? а в конечной энд-юзеровской проге если какие-то функции объявлены, но не используются - это говнокод же. компилятор сишарпа делает часто ворнинг о таких вещах. а если помечено как дебуг или тест, то компилятор стрипит.
                          так что не сливает тут сишарп, это сиплюс потакает говнокоду и хакам просто.
                          Ответить
                          • и что?? в билд попадет только то что используется...
                            Ответить
                            • Ты не понял? Это сомнительная фишка. Чтобы функция не попадала в рантайм - это когда такое нужно? Это нужно когда хаком реализуется тесты или дебуг-код какой-то? Так я же тебе уже сказал - если пометить код соответствуюими аттритубами, то компилятро их не включит в билд.

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

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

                                  нету.
                                  не используется только если в каких-то библиотеках (конгкретным приложением). но было бы глупо стриппить библиотеки, не так ли?
                                  Ответить
                                  • а у меня движок содержит 100500 классов и функций на все случаи жизни (один движок юзают почти пол сотни проектов)...
                                    Ответить
                                    • > а у меня движок содержит 100500 классов и функций на все случаи жизни (один движок юзают почти пол сотни проектов)...

                                      в сишарпе другой подход - умное разделение на сборки. т.е. движок содержится не одной кучей в одном ДЛЛ, а разбросан по более конкретизированным модулям. Если что-то не нужно - просто не подключай либу и не распространяй. Так или иначе, байткод очень компактный, если с либой тащутся ненужные функции - это немного в размере.
                                      Ответить
                                      • у нас нет DLL. все в статических либах... размер либ перед компиляцией 150мб...
                                        Ответить
                                        • > у нас нет DLL. все в статических либах... .

                                          ну и глупо.
                                          (и как я уже говорил, если не нравится иметь много файлов, в моно можно с помощью mkbundle эксешник и набор дллшек зашить в одно эксе. можно также статически линковать mono.dll, но уже нужно платить деньги вороде бы)
                                          Ответить
                                          • lib файл... под iPhone набор этих же либ весит 400Мб...
                                            в результате 10Мб виндовый билд
                                            7,5Мб билд под iPhone...
                                            Ответить
                                            • Ну это определённо избытки статики. Неча хвалиться подходом, являющимся костылём к говноидее. Если разделять на подмодули, то на сишарпе можно добиться 7,5 МБ и без стрипа.
                                              Ответить
                                              • так и говори, стрипать надо руками, причем целыми модулями... а если мне из модуля нужно всего 2 функции...
                                                Ответить
                                          • А если юзать mkbundle, то полезно будет заюзать upx, ибо mkbundle сохраняет байткод, который является хорошо сжимаемым... В итоге с упксом можно ещё добиться 30% от результата (под винду. хз как под айфон), т.е. билд в 3-4 мб.
                                            Ответить
                                        • И что, у тебя нга стартапе грузятся статические объекты всех 150 мь исходников? Юзер там не скучает пока программа поднимается?
                                          Ответить
                            • Кроме того, в сишарпе эксешники могут использоваться как библиотеки, поэтому компилятор не может ничего стрипить. Да и код не так много места и занимает - байткод он же компактный. То что на сишарпе весит 20 кб на сиплюсе весит 200-300 кб. Так что сомнительная фишка. Сишарп нисколько не сливает.
                              Ответить
                              • жду от тебя программу в 20кб у которой есть хотя бы 1 окно...
                                Ответить
                                • class MainClass
                                  {
                                     public static void Main (string[] pargs)
                                     {
                                        Application.Init ();		
                                        MainWindow win = new MainWindow ();
                                        win.Show ();
                                        Application.Run ();
                                     }
                                  }


                                  5.5 кб.

                                  МоноДевелоп и то ещё всякого мусора напихал типа неймспейса Stetic зачем-то...
                                  Ответить
                • Отложенную инициализацию лучше делать, используя обёртку.
                  Ответить
          • >>зачем вообще синглтоны нужны, если можно статическими методами/полями всё делать?
            Потому что объект может представлять интерфейс, а класс -- нет.

            void doAll(SomeInterface something);
            ////unit-test:
            doAll(myMock);
            //Production-1
            doAll(myProduction);
            //Production-2
            doAll(Pool.getInstance());


            заметьте -- я даже не знаю -- Pool это синглтон или у него N инстрансов и пуллинг (инстанс-контроллинг класс).

            >>видеть синглтоны например в яве - это же смешно и неуклюже.
            Только тому, кто слабоват в ООП;)
            Ответить
            • > Потому что объект может представлять интерфейс, а класс -- нет.

              Я про то, что в большинстве случаев это не нужно, но синглтоны всё равно пихают зачем-то.

              > заметьте -- я даже не знаю -- Pool это синглтон или у него N инстрансов и пуллинг (инстанс-контроллинг класс).

              тогда это уже не паттерн синглтон, а скорее фабрика

              > Только тому, кто слабоват в ООП;)

              Гордиться силой в ООПе всё равно что гордиться познаниями в бейсике. Кстати у меня знание ООП 65%!
              Ответить
              • >>Я про то, что в большинстве случаев это не нужно, но синглтоны всё равно пихают зачем-то.
                Ну для классов-утилит это однозначно не нужно.
                А если у сущности есть состояние, то лучше сделать ее синглтоном, что бы потом можно было врубить инстранс-контроллинг.

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

                >>Гордиться силой в ООПе всё равно что гордиться познаниями в бейсике.
                Не скажите, многие крупные программы как раз страдают из-за плохого понимания ООП и (как следствие) дурной архитектуры.

                >>. Кстати у меня знание ООП 65%!
                по какой школе?:)))
                Звучит как "на 5% более красивые волосы"
                Ответить
                • > Не фабрика, а фабричный метод, тогда уж. Потому что фабрика создает несколько разных объектов. Но фабричный метод может прятать внутри синглтон или пул инстансов или по инстансу на клиента (определять его по параметрам) итд.

                  пофиг, как называть, хоть самокатом

                  > Ну для классов-утилит это однозначно не нужно.

                  Вот чем явовский Runtime не "класс-утилита"? Он ничего не наследует и не реализует, состояния особого не имеет. Однако сделали синглтоном, ведь сука в смоллтоке же так же!

                  > Не скажите, многие крупные программы как раз страдают из-за плохого понимания ООП и (как следствие) дурной архитектуры.

                  Ага, или от слишком хорошего понимания, что для того чтобы сложить два числа нужно использовать 10 фабрик и 5 адаптеров
                  Ответить
                  • >>пофиг, как называть, хоть самокатом
                    ну послушайте, паттерны для того и паттерны, что бы иметь внятные названия, и что бы программисты понимали, о чем речь.

                    >>Вот чем явовский Runtime не "класс-утилита"?
                    У него есть состояние, например метод "addShutdownHook" явно куда-то что-то сохраняет:)

                    >>Ага, или от слишком хорошего понимания, что для того чтобы сложить два числа нужно использовать 10 фабрик и 5 адаптеров
                    Такое тоже бывает, но редко:)
                    Чаще наоборот.
                    Вы наверное в сях тоже не каждую функцию в отдельный модуль выносите
                    Ответить
                    • >У него есть состояние, например метод "addShutdownHook" явно куда-то что-то сохраняет:)

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

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

                      паттерны это очевидная вещь, названия для них нужно знать чтобы уметь их обсудить с неумеющими видеть очевидности программистами; таковых не знаю.
                      Ответить
                      • >>И что толку?
                        Если я завтра захочу хранить по массиву шатдаун-хуков для каждого треда -- я просто перепишу один метод, что бы каждому треду возвращали по своему рантайму:) Это вырожденный пример, но более жизненного сходу не придумать.
                        Надеюсь, суть он отражает.

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

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

                        Вот например емкая фраза: "Различающееся поведение вынеси в стратегию".
                        Или "Вместо getType сделать визитор".

                        Или "Оформить ввиде композита и подымать событие ввиде chain-of-responsiblity ".

                        Все это было бы трудно описать на пальцах -- все таки паттерны не дураки придумали)
                        Ответить
                        • > "Оформить ввиде композита и подымать событие ввиде chain-of-responsiblity ".

                          слова "подымать" и "композит" охуенно сочетаются

                          > Все это было бы трудно описать на пальцах -- все таки паттерны не дураки придумали)

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

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

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

                            А что такого?
                            Это как бы у Вас претензия к паттернам такая?:)

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

                            Обычно нужно. Над хорошими проектами работает несколько человек, и архитектуру тоже придумывает несколько. В идеале (по правилам XP) там вообще парное программирование.

                            >>это опять будет не совсем синглтон
                            Именно синглтон, просто пример правда не очень живой.

                            >>и по-моему это глупо делать ради одного свойства уже весь объект отдельным на поток.

                            А если будет два свойства?
                            Вы будете копипастить код в каждом методе?:)

                            Но вообще Runtime и правда мог бы быть утилитой, тем более что свойств у него нет (сейчас посмотрел).

                            Но его делали в 96м году, а тогда сделали много глупостей: класс Date, интерфейс Cloneable итд.
                            Про это еще Блох писал)
                            Ответить
                            • > А если будет два свойства?

                              если бы да кабы

                              а если программу попытаются запустить на девятитысячеядерном квантовом процессоре Марклар13 выпущенном на альдебаране??? там такая неопределённость будет, что миллион рантаймов одновременно - это ещё не предел. Давайте под это тоже заранее подстраиваться.

                              >Но его делали в 96м году, а тогда сделали много глупостей: класс Date, интерфейс Cloneable итд.

                              А что не так с ними?
                              Ответить
                              • >>если бы да кабы
                                Вот присловутое "знание ооп" и помогает делать программы более гибкими, что бы их можно было изменять и рефакторить, а не переписывать с ноля))

                                Вы никогда не пытались поддерживать крупный проект в течение 5ти лет?

                                >>А что не так с ними?
                                Date mutable, и потому почти весь deprecated.
                                Умные программисты джава хранят дату в лонге)

                                Cloneable вообще интерфейс-маркер, почитайте как он работает. Глупо и нелогично
                                Ответить
                                • > >>А что не так с ними?
                                  Date mutable, и потому почти весь deprecated.
                                  Умные программисты джава хранят дату в лонге)

                                  не додумались до классов по значению, как в шарпе, вот и страдают, дебилки

                                  > Cloneable вообще интерфейс-маркер, почитайте как он работает. Глупо и нелогично

                                  чем хоть он отличается от других интерфейсов?
                                  Ответить
                                  • >>не додумались до классов по значению, как в шарпе, вот и страдают, дебилки

                                    1) Не в шарпе, а в CLR.
                                    2) Даже и без них все было бы хорошо -- буть Date неизменяем. Но чертово требование обратной совместимости((((

                                    >>чем хоть он отличается от других интерфейсов?

                                    У него нет методов. ни одного.
                                    Если ты имплементишь его -- ты обязан оверрайтнуть метод clone.

                                    Прост обязан, и все. Хотя метода clone у интерфейса нет
                                    Ответить
                                    • > 1) Не в шарпе, а в CLR.

                                      и там, и там.

                                      > У него нет методов. ни одного.

                                      понял. это интерфейсный костыль для эмуляции аннотаций, когда ихещё небыло, аха.
                                      Ответить
                                      • >>и там, и там.
                                        Ну value-types все таки есть в платформе, а не в конкретном языке.

                                        В vb.net они тоже есть.

                                        >>это интерфейсный костыль для эмуляции
                                        именно. называется "интерфейс-маркер"
                                        Ответить
                                        • > Ну value-types все таки есть в платформе, а не в конкретном языке.

                                          поведение value types чётко прописане в стандарте сишарпа. и value types CLR'а отличаются от value types сишарпа немного.

                                          так можно договориться до того, что в с++ как в языке нет переменных, они предоставляются платформой (в регистрах или в стеках)...

                                          > называется "интерфейс-маркер"

                                          ага, или самокат.
                                          Ответить
                                          • >>value types CLR'а отличаются от value types сишарпа немного.
                                            можно пруфлинк?

                                            >>ага, или самокат.
                                            Вы нелюбите терминологию
                                            Ответить
                        • > Если я завтра захочу хранить по массиву шатдаун-хуков для каждого треда -- я просто перепишу один метод, что бы каждому треду возвращали по своему рантайму:)

                          хм, в яве имеем public void addShutdownHook(Thread hook) и ставить хек на уже гуляющий поток не имеет смысла...

                          не очень понял замысла.

                          энивейз, допустим если в фреймворке бы было просто addShutdownHook(FunctionProc); то если бы нужно было хранить для каждого треда бы просто сделал новый метод addShutdownHook(FunctionProc proc, Thread context) и всё. Хотя и это глупо, можно в addShutdownHook(FunctionProc); автоматически определять текущий поток.

                          Или я не так понял пример? Вообще хрень какая-то.
                          Ответить
                          • >>хм, в яве имеем public void addShutdownHook(Thread hook)

                            Я моем примере пользователь не знал, что в логике используется тред.
                            А Вы предлагаете насильно передавать туда тред.

                            >> Хотя и это глупо, можно в addShutdownHook(FunctionProc); автоматически определять текущий поток.

                            И иметь Map<Поток, List<Хук>> ?:)))

                            Очень удобно.
                            Куда удобнее было бы иметь по объекту на поток.

                            Чем проще класс, чем он глупее -- тем легче его тестировать.

                            Я не понимаю: Вы сторонник процедурного подхода что ли?
                            Ответить
                            • > Очень удобно.
                              Куда удобнее было бы иметь по объекту на поток.

                              Чем это неудобно?

                              > Я не понимаю: Вы сторонник процедурного подхода что ли?

                              смешанного ) не слишком ООП и не слишком процедурный шобэ
                              так скать, ООП это хорошо, однако не надо забывать, программа это как бы ещё в первую очередь императив вокруг объектов, а не объекты и где-то там может быть на 2 часа работы останется императив
                              Ответить
                              • >>Чем это неудобно?
                                В моем примере объект знает только про свои данные, про потоки он вообще ничего не знает.

                                В вашем -- класс знает про потоки.

                                В моем решении классы более узкозаточенные, более тупые, и потому они легче и их проще тестировать и поддерживать.
                                Почитайте про cohesion.
                                Ответить
      • >Что тут происходит вообше?
        Внутри этого конструктора ожидается завершение потока и получения из него результата.
        Ответить
    • показать все, что скрытокак блевать хочется

      threadRAII - как крута!
      Ответить

    Добавить комментарий