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

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

      Добавлено
      Цитата Qraizer @
      О как.
      Цитата korvin @
      ...в хаскелле, и я считаю...
      Одна запятая, а как меняет смысл...

      зачем ты искажаешь смысл моих слов?
      Сообщение отредактировано: korvin -
        Не, я понял правильно. Но вдруг ошибся ты? Я проверил, не ошибся.
          Какой то неинтересный холивар. Дельфи язык какой то.. в общем, мне оно не нравится. Не знаю почему. С++ хорош. C# тоже хороший язык, но он зелёный. Не знаю почему он такой, но он зелёный. Objective-C, кстати, оранжевый. Дельфи синий, а С++ белый. Джаву пробовал - тоже не воткнула. Именно на таком уровне "нравится-не нравится" нужно вести дискуссию. Я так считаю, вот.
          А ещё можно на таком уровне - "в мире ежесекундно выполняется примерно 500 моих строчек, написанных на С++, 5 на C# и ни одной на Дельфи". Поэтому С++ - самый хороший.
          Сообщение отредактировано: Бобёр -
            korvin, ты повторяешься. За полгода, или сколько там, твоего участия в холиварах, мог бы и уяснить, что под объектом и его конструированием C++-сники понимают не то же, что дельфисты. В Дельфи объект это всего лишь место в памяти, которое еще нужно наполнить содержимым. А в C++ объект это готовая к работе сущность, не требующая дополнительных инициализаций

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

            Методы инициализации в Дельфи создают инварианты. В C++ этим занимается конструктор. Тем же чем занимается конструктор Дельфи, в C++ занимается operator new.
              Цитата korvin @
              Цитата D_KEY @
              Про инварианты слышал?

              про методы инициализации слышал? при чем тут инварианты? они (методы инициализации) их не нарушают

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

              Добавлено
              Цитата Бобёр @
              Дельфи язык какой то.. в общем, мне оно не нравится.

              :lool:
                Цитата Qraizer @
                Не, я понял правильно. Но вдруг ошибся ты? Я проверил, не ошибся.

                ну как-то нелогично говорить, что что-то тебе не нравится, но при этом считать это нормальным =)

                D_KEY, давай не будем продолжать спор, ты просил объяснить логику, я объяснил, а хорошо такое поведение или плохо вы уже с делфистами обсудили на стопицот постов в другом холиваре =)
                  Цитата
                  В С++ автомобиль - это полностью собранное и прошедшее испытания средство передвижения.

                  Не факт. Если пользователь не написал конструктор, то даже "сконструированный" объект будет хуже запорожца.
                    Цитата D_KEY @
                    Методы инициализации не тоже самое, что конструкторы. Конструкторы отвечают за создание объекта. Время жизни объекта начинается после полного выполнения конструктора(не раньше) или вообще не начинается(если произошел фэйл).
                    В процессе конструирования ты можешь вызывать методы, специально рассчитанные на то, что их будут вызывать из конструктора, вот только виртуальными и тем более абстрактными такие методы быть не должны, потому что ни ты не знаешь, что там напишет твой потомок, ни потомок не знает, что ты будешь вызывать этот метод при создании объекта.

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

                    Добавлено
                    Цитата amk @
                    korvin, ты повторяешься. За полгода, или сколько там, твоего участия в холиварах, мог бы и уяснить, что под объектом и его конструированием C++-сники понимают не то же, что дельфисты. В Дельфи объект это всего лишь место в памяти, которое еще нужно наполнить содержимым. А в C++ объект это готовая к работе сущность, не требующая дополнительных инициализаций

                    программист != язык программирования, так-то

                    Добавлено
                    Цитата Бобёр @
                    Не факт. Если пользователь не написал конструктор, то даже "сконструированный" объект будет хуже запорожца.

                    на это тебе ответят "значит так объект задуман"

                    Добавлено
                    Цитата amk @
                    korvin, ты повторяешься. За полгода, или сколько там, твоего участия в холиварах, мог бы и уяснить, что под объектом и его конструированием C++-сники понимают...

                    и да, мы тут как бы сейчас джаву обсуждаем...
                      Цитата korvin @
                      с точки зрения языка объект уже есть

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

                      Добавлено
                      Цитата Бобёр @
                      Если пользователь не написал конструктор, то даже "сконструированный" объект будет хуже запорожца.

                      Почему же. Это просто будет объект в дефолтной комплектации :)

                      Добавлено
                      Цитата korvin @
                      Цитата amk @
                      korvin, ты повторяешься. За полгода, или сколько там, твоего участия в холиварах, мог бы и уяснить, что под объектом и его конструированием C++-сники понимают...

                      и да, мы тут как бы сейчас джаву обсуждаем...

                      В java в данном случае тоже самое. Только вот поведение конструкторов у них не продуманно в этом плане.
                        Цитата Бобёр @
                        Если пользователь не написал конструктор, то даже "сконструированный" объект будет хуже запорожца.
                        Это будет лего-набор, из которого автомобиль еще надо собрать. Часто конструктор делает довольно тривиальные вещи, ограничиваясь тем, что передает параметры в конструкторы своих составных частей.
                        Цитата D_KEY @
                        Почему же. Это просто будет объект в дефолтной комплектации
                        Именно. Нормальная практика в случаях, когда объект сборки не требует. Но при этом готовы к работе все составляющие объекта.
                          Цитата D_KEY @
                          Цитата DesweR @
                          Цитата D_KEY @
                          DesweR, я не понимаю, что тебя не устраивает, поясни мысль. Или тебе перевести нужно?

                          Ну там же по русс чёрному по белому написано что "finally is necessary when you need to set something other than memory back to its original state", т.е. вернуть самому в исходное состояние то, что сам GC не способен.

                          А я о чем писал?

                          Опять о своём, о "ресурсах" и RAII. Давай в 100500-ый раз не будем поднимать эту тему.

                          Цитата Qraizer @
                          Цитата DesweR @
                          Они бывают нужны в некоторых ситуациях, помнишь пример с VCL? аналогичного решения без вирт. методов в конструкторе так никто и не показал.

                          Здрассссти-пжалста. Это ты их просто 328 (триста двадцать восемь прописью) раз не увидел.

                          Я не видел решений удовлетворяющие ТЗ.

                          Цитата amk @
                          В Дельфи объект это всего лишь место в памяти, которое еще нужно наполнить содержимым. А в C++ объект это готовая к работе сущность, не требующая дополнительных инициализаций

                          В С++ объект пошагово досоздаётся в каждом конструкторе производного класса, а в Delphi на момент вызова конструкторов производных классов - объект уже полностью создан.

                          Цитата D_KEY @
                          вот только виртуальными и тем более абстрактными такие методы быть не должны, потому что ни ты не знаешь, что там напишет твой потомок, ни потомок не знает, что ты будешь вызывать этот метод при создании объекта.

                          Здрасьти, по твоей логике виртуальные методы в принципе не должны нигде использоваться, т.к. бог его знает где они вызываются и как их переопределяют :o

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

                          "С точки зрения языка С++" fixed.
                            Цитата korvin @
                            кстати по поводу отлова исключений, допустим есть такой код:
                            ExpandedWrap disabled
                              try {
                                  throwSpecificException();
                              } catch (GeneralException exn) {
                                  doSomething();
                              } catch (SpecificException exn) {
                                  doSomethingElse();
                              }

                            где SpecificException -- наследник GeneralException

                            ...

                            Можно и так, к услугам классовые ссылки.
                            ExpandedWrap disabled
                              program Project1;
                               
                              {$APPTYPE CONSOLE}
                               
                              uses
                                SysUtils,
                                Generics.Defaults,
                                Generics.Collections;
                               
                              type
                                TGeneralException = class(Exception);
                                TSpecificException  = class(TGeneralException);
                                TMoreSpecificException  = class(TSpecificException);
                                TVeryMoreSpecificException  = class(TMoreSpecificException);
                               
                                TExceptionsComparer = class(TComparer<TPair<ExceptClass, TProc>>)
                                  function Compare(const A, B: TPair<ExceptClass, TProc>): Integer; override;
                                end;                            
                               
                               
                              function TExceptionsComparer.Compare(const A, B: TPair<ExceptClass, TProc>): Integer;
                              begin
                                if A.Key = B.Key then
                                  Exit(0);
                               
                                if A.Key.InheritsFrom(B.Key) then
                                  Exit(-1);
                               
                                if B.Key.InheritsFrom(A.Key) then
                                  Exit(1);
                               
                                raise Exception.Create('');
                              end;
                               
                               
                              procedure SortExceptions(const AE: Exception; AExcepts: array of TPair<ExceptClass, TProc>; const AIsAllExcept: Boolean);
                              var
                                LExcept: TPair<ExceptClass, TProc>;
                              begin
                                TArray.Sort<TPair<ExceptClass, TProc>>(AExcepts, TExceptionsComparer.Create);
                               
                                for LExcept in AExcepts do
                                  if AE is LExcept.Key then
                                  begin
                                    LExcept.Value.Invoke;
                               
                                    if not AIsAllExcept then
                                      Break;
                                  end;
                              end;
                               
                               
                              begin
                                try
                                  raise TMoreSpecificException.Create('');
                                except
                                  on E: TGeneralException do
                                    SortExceptions(E,
                                                   [TPair<ExceptClass, TProc>.Create(TVeryMoreSpecificException,
                                                                                     procedure begin WriteLn('TVeryMoreSpecificException'); end),
                                                    TPair<ExceptClass, TProc>.Create(TGeneralException,
                                                                                     procedure begin WriteLn('TGeneralException'); end),
                                                    TPair<ExceptClass, TProc>.Create(TMoreSpecificException,
                                                                                     procedure begin WriteLn('TMoreSpecificException'); end),
                                                    TPair<ExceptClass, TProc>.Create(TSpecificException,
                                                                                     procedure begin WriteLn('TSpecificException'); end)],
                                                   False);
                                end;
                               
                                WriteLn('');
                               
                                try
                                  raise TMoreSpecificException.Create('');
                                except
                                  on E: TGeneralException do
                                    SortExceptions(E,
                                                   [TPair<ExceptClass, TProc>.Create(TVeryMoreSpecificException,
                                                                                     procedure begin WriteLn('TVeryMoreSpecificException'); end),
                                                    TPair<ExceptClass, TProc>.Create(TGeneralException,
                                                                                     procedure begin WriteLn('TGeneralException'); end),
                                                    TPair<ExceptClass, TProc>.Create(TMoreSpecificException,
                                                                                     procedure begin WriteLn('TMoreSpecificException'); end),
                                                    TPair<ExceptClass, TProc>.Create(TSpecificException,
                                                                                     procedure begin WriteLn('TSpecificException'); end)],
                                                   True);
                                end;
                               
                                ReadLn;
                              end.

                            ExpandedWrap disabled
                              TMoreSpecificException
                               
                              TMoreSpecificException
                              TSpecificException
                              TGeneralException


                            Добавлено
                            К слову, в DelphiPrism вроде можно как-то так:
                            ExpandedWrap disabled
                                try
                                  raise TMoreSpecificException.Create('');
                                except
                                  on E: TGeneralException do
                                    case E of
                                      TVeryMoreSpecificException:
                                        WriteLn('TVeryMoreSpecificException');
                               
                                      TGeneralException:
                                        WriteLn('TGeneralException');
                               
                                      TMoreSpecificException:
                                        WriteLn('TMoreSpecificException');
                               
                                      TSpecificException:
                                        WriteLn('TSpecificException');
                                    end;
                                end;
                            Сообщение отредактировано: DesweR -
                              какой ужасный ужас
                                Цитата DesweR @
                                Цитата D_KEY @
                                Цитата DesweR @
                                Цитата D_KEY @
                                DesweR, я не понимаю, что тебя не устраивает, поясни мысль. Или тебе перевести нужно?

                                Ну там же по русс чёрному по белому написано что "finally is necessary when you need to set something other than memory back to its original state", т.е. вернуть самому в исходное состояние то, что сам GC не способен.

                                А я о чем писал?

                                Опять о своём, о "ресурсах" и RAII.

                                Да? Давай посмотрим, в чем ты меня обвинил:
                                Цитата DesweR @
                                Цитата D_KEY @
                                Правильная книжка. В ней, например, автор пишет, что в С++ лучше продумано поведение конструкторов :) Еще пишет, что finally необходим при работе с другими(не памятью) ресурсами

                                Ой врать-то :lool:

                                Собственно, на это обвинение мне и пришлось сейчас ответить. И я показал соответствующие цитаты.

                                Цитата
                                а в Delphi на момент вызова конструкторов производных классов - объект уже полностью создан.

                                Как же он может быть создан, если конструктор еще не отработал :-?

                                Цитата
                                Цитата D_KEY @
                                вот только виртуальными и тем более абстрактными такие методы быть не должны, потому что ни ты не знаешь, что там напишет твой потомок, ни потомок не знает, что ты будешь вызывать этот метод при создании объекта.

                                Здрасьти, по твоей логике виртуальные методы в принципе не должны нигде использоваться, т.к. бог его знает где они вызываются и как их переопределяют :o

                                Нет, это по твоей извращенной логике так. Конструктор не является методом объекта(и не может им являться, поскольку этот объект конструирует). Ты вызываешь метод потомка до того, как он сумел обеспечить свои инварианты.

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

                                "С точки зрения языка С++" fixed.
                                В обсуждаемой Java такая же стратегия конструирования объектов.

                                Добавлено
                                Цитата korvin @
                                какой ужасный ужас

                                +100500
                                Сообщение отредактировано: D_KEY -
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 272 273 [274] 275 276 ...  494 495


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.3885 ]   [ 14 queries used ]   [ Generated: 1.08.26, 16:43 GMT ]