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


    Так же, как и в случае любого вызова виртуального метода из базового класса

    Добавлено
    PS: достало уже по шестому кругу. Смените пластинку. :wall:
      Цитата --Ins-- @
      Так же, как и в случае любого вызова виртуального метода из базового класса

      В случае любого вызова виртуального метода у меня нет задачи обеспечения инвариантов реализации базового класса. А в процессе конструирования - есть.
        Цитата D_KEY @
        А в процессе конструирования - есть.


        Невелика проблема. Все, что нужно на этапе конструирования - создай зараннее. Если вдруг забудешь - первая же отладка тебе о этом скажет. И стек вызовов будет красноречив, на все про все уйдет 1 минута. И ты успешно это разрулишь и пойдешь дальше. А гибкость никуда не исчезнет
        Сообщение отредактировано: --Ins-- -
          Цитата --Ins-- @
          достало уже по шестому кругу. Смените пластинку. :wall:

          Ну так я leo отвечал. Он не в курсе наших кругов и я надеялся на что-то новенькое от него :)
          А что еще обсуждать? Delphi догнивает(хотя работы, думаю, хватит еще не на одно десятилетие :) ), C++ несколько изменил нишу, но живет и развивается достаточно правильно. Думаю, история нас уже рассудила. В Java и C# хоть и можно делать виртуальные вызовы, но это делать не рекомендуют.
            Цитата --Ins-- @
            PS: достало уже по шестому кругу. Смените пластинку.

            :-? А что делать? Вы позиционируете виртуальные вызовы из конструкторов и деструкторов как полезную фичу. Вам показывают, что это приводит к достаточно хитрым дизайн-ликам (как-то: появляется возможность работы с недоконструированными и полуразрушенными объектами), и разработчики на эти лики напарываются, и вынуждены подставлять костыли, чтобы всё работало. Ну, блин, свойство у этой фишки такое!
              Цитата --Ins-- @
              Невелика проблема. Все, что нужно на этапе конструирования - создай зараннее. Если вдруг забудешь - первая же отладка тебе о этом скажет. И ты успешно это разрулишь и пойдешь дальше.

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

              Цитата
              А гибкость никуда не исчезнет

              Нет тут никакой гибкости :tong:
                Цитата Flex Ferrum @
                и вынуждены подставлять костыли, чтобы всё работало.


                Я не считаю что возможность управлять очередностью вызовов базового конструктора является костылем. По очень простой причине: метод Create при его выполнении в Delphi ничем не отличается от любого другого, а в любом другом управление такой очередностью тоже не является костылем. Как уже правильно заметили, это в терминологии с++ не совсем конструктор. И я вправе сам решать в каком порядке мне инициализировать свой экземпляр
                Сообщение отредактировано: --Ins-- -
                  Цитата D_KEY @
                  Что-то последнее время прихожу к выводу, что отладка - уже следствие неправильно организованных процессов и "лишних" косяков

                  +100500. В идеале, неправильно работающая программа не должна скомпилироваться. :)

                  Добавлено
                  Цитата --Ins-- @
                  Я не считаю что возможность управлять очередностью вызовов базового конструктора является костылем. По очень простой причине: метод Create при его выполнении в Delphi ничем не отличается от любого другого, а в любом другом управление такой очередностью тоже не является костылем. Как уже правильно заметили, это в терминологии с++ не совсем конструктор

                  Ответь на простой вопрос: в понимании Delphi'ста в какой момент объект считается полностью созданным? До или после вызова Create? В C++ с этим полная определённость: если конструктор отработал, то объект создан. Если не отработал - то нет. А в Delphi?
                    Цитата --Ins-- @
                    метод Create при его выполнении в Delphi ничем не отличается от любого другого

                    Отличается тем, что передаваемый объект находится в "состоянии" отсутствия гарантий соблюдения инвариантов.
                      Цитата Flex Ferrum @
                      Ответь на простой вопрос: в понимании Delphi'ста в какой момент объект считается полностью созданным? До или после вызова Create?


                      Трудно сказать. Физически - после выполнения NewInstance. Смотря в каком контексте мы подразумеваем слово "полностью созданный"
                        Цитата --Ins-- @
                        Трудно сказать.

                        :blink: :blink: :blink: Но нужно! Ведь это важно!

                        Цитата --Ins-- @
                        Физически - после выполнения NewInstance. Смотря в каком контексте мы подразумеваем слово "полностью созданный"

                        С ним можно работать, вызывать его методы и т. п. В общем, это тот момент, когда объект становится операбельным для клиента.
                          Цитата Flex Ferrum @
                          С ним можно работать, вызывать его методы и т. п. В общем, это тот момент, когда объект становится операбельным для клиента.


                          После вызова NewInstance объект представляет из себя именно объект, а не просто участок памяти. Другое дело, что он еще не инициализирован. Является ли это состояние доступным для вызова методов и т.д. - это определяет программист. Если он предусмотрит инвариант все обнулено - то можно сказать что с этого момента. Здесь нет четкой грани, все в руках проектировщика. Но как правило объект готов ко всем вызовам после Create. Возможность получить на этом этапе вызов, который работает не с тем состоянием объекта, на который мы расчитывали - возможен. Но это легко разрулить. И строго говоря, так же легко и не допустить даже не вдаваясь в подробности реализации базового класса
                            Цитата --Ins-- @
                            После вызова NewInstance объект представляет из себя именно объект, а не просто участок памяти. Другое дело, что он еще не инициализирован. Является ли это состояние доступным для вызова методов и т.д. - это определяет программист.

                            Ясно. Собственно, именно из этого и растут ноги у FreeAndNil, а также проверки незанулённости (по факту - допустимых инвариантов) на входе в методы. Поскольку дизайн допускает оперирование "полусозданными" (и "полуразрушенными") объектами, и оставляет доведение этих объектов до операбельного состояния на совести клиента, то отсюда и высокий уровень error prone. Фишка в том, что клиент (строго говоря) хоть и должен что-то, но не обязан. И если при конструировании это ещё можно более-менее проконтролировать, то вот при разрушении - гораздо сложнее. В реальной жизни (больших системах с кучей потоков, взаимосвязанных сущностей и т. п.) даже с полными гарантиями возникают ситуации, когда требуются ухищрения для того, чтобы развязать клубки связей между объектами. А когда ещё и дизайн языка в этом не помогает - это совсем аллес и ахтунг...

                            Добавлено
                            И вместо того, чтобы спокойно писать программы в "контрактном" стиле, ваши программисты вынуждены защищаться от самих себя, от собственных и чужих ошибок "неверного использования", "случайного вызова" и прочего.
                              Цитата Flex Ferrum @
                              Собственно, именно из этого и растут ноги у FreeAndNil, а также проверки незанулённости (по факту - допустимых инвариантов) на входе в методы.


                              Я по прежнему считаю что они растут из-за кривизны рук. Найди в коде VCL хоть одну такую проверку? Сомневаюсь, что найдешь. Можно проектировать не думая, и тогда да, без подобных "на всякий случай" не обойтись. А можно подходить ответственно и быть спокойным
                                Цитата --Ins-- @
                                Можно проектировать не думая, и тогда да, без подобных "на всякий случай" не обойтись.

                                Если язык привносит дополнительные места, где надо думать, это разве хорошо? Проектирование вообще не должно думать про AfterConstruction и NewInstance всякие :)
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 481 482 [483] 484 485 ...  494 495


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.7134 ]   [ 15 queries used ]   [ Generated: 28.07.26, 15:51 GMT ]