На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (495) « Первая ... 397 398 [399] 400 401 ...  494 495  ( Перейти к последнему сообщению )  
> Delphi vs C++ vs C# , ну и Java немножко, где-то ближе к старшему байту номеров страниц
    Цитата DesweR @
    Цитата D_KEY @
    Так это ты зациклился на синтаксисе. Вышеперечисленные средства не просто синтаксический сахар, это как раз смена "парадигмы" с "явного делания чего-то при выходе" на "захват ресурса и автоматическое его освобождение". И костыль в виде finally можно выпиливать.

    Да?

    Да.
      DesweR, с вами мы finally уже обсуждали. Про GC в дельфи, плиззз!
        Цитата DesweR @
        А для нетривиальных ситуаций разве не нужно расставлять локальные блоки { ... } (а-ля try ... finally)? ;)

        Вообще-то try - это обычно часть механизм обработки исключений(в Delphi не так?).
        И какое отношение к ним имеют обычные локальные блоки - для меня загадка.

        Цитата
        А на нетривиальную деинициализацию не нужно ничего биндить (а-ля finally ... end)? ;)

        Пример пожалуйста можешь привести?

        Цитата
        Если я правильно понял, то идиома Scope Guard из C++ - как раз тот костыль try-finally из Delphi.

        Эта идиома как раз позволяет не писать костылей. Захватили ресурс - освободили ресурс. И никаких лишних телодвижений.
        Для "нетривиальных случаев" пишется костыль в виде объекта, который дергает произвольную лямбду, а не освобождает ресурсы. И тут уже пиши что хочешь, как в твоем любимом finally.

        Добавлено
        MyNameIsIgor, как видишь, не выдержал :'(

        Добавлено
        Цитата MyNameIsIgor @
        Про GC в дельфи, плиззз!

        Да-да.
          Цитата D_KEY @
          Синтаксический сахар - это один из способов обеспечения удобного использования парадигмы. То, что with в питоне сейчас реализован именно так, не является его семантическим свойством. Выпили finally из python 4, реализуй with иначе, но с сохранением той же семантики, и он перестанет быть синтаксическаим сахаром.

          Да нет тут никакой парадигмы, слишком большое слово для такой мелочи =) Ладно, сегодня не холиварный день, всех с Наступающим!
            Цитата korvin @
            Да нет тут никакой парадигмы, слишком большое слово для такой мелочи =)

            Управление ресурсами без костылей - это не мелочь ;)
            Особенно хорошо, что до этого дошли и языки с GC, а то раньше там без finally никак было.

            Цитата
            Ладно, сегодня не холиварный день

            Скоро будет не холиварная неделя, потому сегодня с утра еще можно немного побубнить :)
              Цитата D_KEY @
              коро будет не холиварная неделя, потому сегодня с утра еще можно немного побубнить

              Тем более, что и задач то сегодня практически нет... По крайне мере я свои закрыл ещё вчера :D
                Цитата D_KEY @
                И какое отношение к ним имеют обычные локальные блоки - для меня загадка.

                При выходе из такого блока, даже если внутри него возникло исключение, объект, принадлежащий ему, гарантированно уничтожается, где его деструкторе выполняется всё то, что вам необходимо.
                Такая же ситуация и в Delphi, блок finally ... end выполнится при любых ситуациях на участке try ... finally. Те же уши только в профиль.

                Цитата D_KEY @
                Пример пожалуйста можешь привести?

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

                Цитата D_KEY @
                Эта идиома как раз позволяет не писать костылей. Захватили ресурс - освободили ресурс. И никаких лишних телодвижений.

                Костыль от костылей :D

                Цитата MyNameIsIgor @
                Про GC в дельфи, плиззз!

                Чего чего?

                Добавлено
                D_KEY
                Вот тебе псевдокод, приведи аналогичный на C++, чтобы я почувствовал синтаксическую и семантическую разницу.
                ExpandedWrap disabled
                  begin
                    //код
                    //код
                    //код
                   
                    //создание объекта
                    try
                      //запись лог - начало работы
                      //код
                      //ИСКЛЮЧЕНИЕ!
                      //код
                    finally
                      //запись лог - конец работы
                      //освобождение объекта
                    end;
                   
                    //код
                    //код
                    //код
                  end;
                  Цитата DesweR @
                  Цитата D_KEY @
                  И какое отношение к ним имеют обычные локальные блоки - для меня загадка.

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

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

                  Цитата
                  Такая же ситуация и в Delphi, блок finally ... end выполнится при любых ситуациях на участке try ... finally. Те же уши только в профиль.

                  Совершенно разная ситуация. Свой дурацкий finally ты будешь писать каждый раз. Тут же управление ресурсом делегируется отдельному объекту, а твой код уже не думает об этом.

                  Цитата
                  D_KEY
                  Вот тебе псевдокод, приведи аналогичный на C++, чтобы я почувствовал синтаксическую и семантическую разницу.
                  ExpandedWrap disabled
                    begin
                      //код
                      //код
                      //код
                     
                      //создание объекта
                      try
                        //запись лог - начало работы
                        //код
                        //ИСКЛЮЧЕНИЕ!
                        //код
                      finally
                        //запись лог - конец работы
                        //освобождение объекта
                      end;
                     
                      //код
                      //код
                      //код
                    end;

                  Такой код не нужен в принципе, вы его вынуждены писать, поскольку у вас нет нормального управления ресурсами :'(

                  Добавлено
                  А конкретный случай логирования - это вообще задача аспектного программирования.
                    Цитата DesweR @
                    Чего чего?

                    Того того.
                      Цитата D_KEY @
                      Управление ресурсами без костылей - это не мелочь ;)
                      Особенно хорошо, что до этого дошли и языки с GC, а то раньше там без finally никак было.

                      Угу, не прошло и двадцати лет... В такие моменты я сразу вспоминаю, за что люблю Лисп.
                        Цитата D_KEY @
                        Цитата
                        ExpandedWrap disabled
                          begin
                            //код
                            //код
                            //код
                           
                            //создание объекта
                            try
                              //запись лог - начало работы
                              //код
                              //ИСКЛЮЧЕНИЕ!
                              //код
                            finally
                              //запись лог - конец работы
                              //освобождение объекта
                            end;
                           
                            //код
                            //код
                            //код
                          end;

                        Такой код не нужен в принципе, вы его вынуждены писать, поскольку у вас нет нормального управления ресурсами :'(

                        Т.е. тот же код по сути должен выглядеть так:
                        ExpandedWrap disabled
                          // Без GC
                          begin
                             // код
                             // код
                             // код
                          end;


                        ExpandedWrap disabled
                          // С GC
                          begin
                             // код
                             // код
                             // код
                             with {ресурсы}
                                // код
                                // код
                                // код
                             end;
                           
                             // код
                             // код
                             // код
                          end;
                        Сообщение отредактировано: D_KEY -
                          Цитата korvin @
                          Майкрософтовский GC дергает каждый объект? О ужас...

                          На сколько я знаю, не каждый. Те объекты, у которых есть финализаторы, ставятся в очередь на финализацию. Объект можно оттуда убирать, но тогда его финализатор вызван не будет.
                            IL_Agent, так зачем финализаторы в шарпе? Только чтобы один раз базу было ненапряжно удалять?
                              Цитата DesweR @
                              Если я правильно понял, то идиома Scope Guard из C++ - как раз тот костыль try-finally из Delphi.
                              На самом деле ничто из этого не костыли. Это по-разному декомпозированная одна и та же идиома. Иногда проще один раз написать __try/__finally, чем RAIIшничать, например в нетривиальном конструкторе обособленнего класса. Но ИМХО клиентскому коду всегда следует предоставлять RAII-классы. Автор один раз написал, клиенты кучу раз используют. Очень жаль, что SEH в Дельфи является частью языка, а не его расширением, ибо это означает отсутствие альтернативы.
                                Цитата Qraizer @
                                Это по-разному декомпозированная одна и та же идиома.

                                Не согласен :)
                                finally не является идиомой освобождения ресурсов. Это "идиома" выполнения произвольного кода после блока try в не зависимости от того, произошло ли исключение.
                                RAII же напрямую не связан с исключениями - это идиома владения ресурсами и автоматического их освобождения в отсутствии владельца. В частности, она бы была полезна и в С, без механизма исключений.
                                Сообщение отредактировано: D_KEY -
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 397 398 [399] 400 401 ...  494 495


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.5291 ]   [ 14 queries used ]   [ Generated: 30.07.26, 07:07 GMT ]