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

    Ах, так у тебя ещё и секция с полями одна :lol: Слушай, не многовато ли оговорок?

    Не знаю. Главное, что если захочешь, достучаться сможешь. Собственно, речь была о том, что язык не может гарантировать то, что программист будет писать что-то путное.
    Это и рефлексии касается, и препроцессора, и инкапсуляции, и единиц трансляции с хидерами.
    Я понял, что мой некорректный с точки зрения здравого смысла пример некорректен и с точки зрения стандарта - и слава богу. Спасибо :)
      Цитата D_KEY @
      Почему? На выравнивание спецификаторы не влияют, и если секция с полями одна, то все будет ок.
      Впрочем, мы обсуждаем какие-то малоинтересные вещи.

      Ещё как влияют:
      Раздел 1.11 [class.access.spec]:
      Цитата
      The order of allocation of data members with separate access-specifier labels is unspecified (9.2).
        Цитата MyNameIsIgor @
        а ты приводишь грязные хаки

        На мой взгляд, использование рефлексии для обхода инкапсуляции такой же "хак", пусть и разрешенный формально в языке.
        Я уже признал, что был не прав :)
          Цитата D_KEY @
          Какие?

          Я уже писал, что затрудняюсь ответить. Может, кто-нибудь из наблюдающих за беседой шарпистов подскажет ?
          Цитата D_KEY @

          Вводим везде ссылки, примитивные типы объявляем иммутабельными, запрещаем от них наследоваться(это ведь итак нельзя?). Какие недостатки ты видишь?

          На первый взгляд да, иммутабельность типов-значений устранит возможность возникновения подобных ситуаций. Но это внесёт некоторую дополнительную сложность. Например, не напишешь а:
          ExpandedWrap disabled
            int s =0;
            for(int i=0;i<n;++i) s+= a[i];

          Возможно,сложность - это одна из причин, почему так не сделали.
            Цитата Flex Ferrum @
            Цитата D_KEY @
            Почему? На выравнивание спецификаторы не влияют, и если секция с полями одна, то все будет ок.
            Впрочем, мы обсуждаем какие-то малоинтересные вещи.

            Ещё как влияют:
            Раздел 1.11 [class.access.spec]:
            Цитата
            The order of allocation of data members with separate access-specifier labels is unspecified (9.2).

            Это про разделенные секции. Я говорил об одной :)

            Добавлено
            Цитата IL_Agent @
            На первый взгляд да, иммутабельность типов-значений устранит возможность возникновения подобных ситуаций. Но это внесёт некоторую дополнительную сложность. Например, не напишешь а:
            ExpandedWrap disabled
              int s =0;
              for(int i=0;i<n;++i) s+= a[i];

            Возможно,сложность - это одна из причин, почему так не сделали.

            Ну почему же не напишешь?
            Формально делаем += простым синтаксическим сахаром над x = x + y и все встает на свои места.
              Цитата D_KEY @
              Это про разделенные секции. Я говорил об одной :)

              Смотри. Сначала при компиляции было:
              ExpandedWrap disabled
                class A
                {
                public:
                int member1;
                int member2;
                 
                private:
                int member3;
                int member4;
                };


              Ты скомпилил, получил объектник, потом где-то подхачил:
              ExpandedWrap disabled
                class A
                {
                public:
                int member1;
                int member2;
                 
                public:
                int member3;
                int member4;
                };

              Только вот незадача - компиль так устроен, что он приватные данные всегда размещает перед публичными. Имеет право? Имеет. Таким образом, в первоначальном варианте данные в классе лежали так:

              member3
              member4
              member1
              member2

              После хака все данные стали публичными, и легли так:

              member1
              member2
              member3
              member4

              Чувствуешь разницу? :)
                Цитата D_KEY @
                На мой взгляд, использование рефлексии для обхода инкапсуляции такой же "хак", пусть и разрешенный формально в языке.

                Мне не понятно, зачем такая возможность вообще существует. Нет, конечно, запреты только сужают возможности. Но зачем вообще может понадобиться изменение приватных полей?
                  Цитата MyNameIsIgor @
                  Но зачем вообще может понадобиться изменение приватных полей?

                  Для реализации максимы: "если нельзя, но очень хочется, то можно!" :)
                    Цитата Flex Ferrum @
                    Для реализации максимы: "если нельзя, но очень хочется, то можно!"

                    Угу... Один знакомый так хачил триальную либу, у которой "защита" было во флаге приватной переменной... :bad:
                      Цитата D_KEY @
                      Ну почему же не напишешь?
                      Формально делаем += простым синтаксическим сахаром над x = x + y и все встает на свои места.

                      А если вместо s - поле иммутабельной структуры ?
                        Цитата D_KEY @
                        К чему этот вопрос?
                        Ты о низкоуровневых указателях на функцию и метод? Тут разница есть. А в функторе можно представить и то, и другое. Разницы действительно нет.
                        Это абстракции разных уровней.

                        Мне понять анонимный метод гораздо проще, чем функтор, который еще и писать надо :)
                        Цитата D_KEY @
                        Да, если что, обычный объект в Delphi RTTI не имеет. Включение RTTI (и ее объем) определяется программистом.
                        Интересно, наверно, ты уже рассказывал, а я пропустил.

                        Ну да, информация о классе включается директивами компиляции. В старых версиях была только одна, определяющая наличие описания для секции published. И в библиотеке она включена для потомков TPersistent.
                        В новых версиях ты определяешь для какой секции видимости нужна информация, и о чем, полях/свойствах/методах. И есть набор классов, позволяющий работать с этой информацией. Плюс добавились атрибуты: объекты-описания. И, кстати, в новых версиях таки RTTI по умолчанию включена.
                        ExpandedWrap disabled
                          program SimpleJSON;
                           
                          {$APPTYPE CONSOLE}
                           
                          uses
                            SysUtils, DBXJSON, DBXJSONReflect;
                           
                          type
                            TFoo = class
                            private
                              FName: string;
                            public
                              function Hello: string;
                              property Name: string read FName write FName;
                            end;
                           
                          { TFoo }
                           
                          function TFoo.Hello: string;
                          begin
                            Result := 'Hello from ' + Name;
                          end;
                           
                          //любой объект, лишь бы RTTI была для полей. По умолчанию стримятся поля данных
                          function GetJSON(AObj: TObject): string;
                          var
                            jMarshal: TJSONMarshal;
                            jData: TJSONValue;
                          begin
                            jMarshal := TJSONMarshal.Create(TJSONConverter.Create);
                            try
                              jData := jMarshal.Marshal(AObj);
                              Result := jData.ToString;
                            finally
                              jMarshal.Free;
                            end;
                          end;
                           
                          var
                            Foo: TFoo;
                            jStr: string;
                           
                          begin
                            try
                              Foo := TFoo.Create;
                              try
                                Foo.Name := 'FooFoo';
                                Writeln(Foo.Hello);
                                jStr := GetJSON(Foo);
                                Writeln(jStr);
                                readln;
                              finally
                                Foo.Free;
                              end;
                            except
                              on E: Exception do
                                Writeln(E.ClassName, ': ', E.Message);
                            end;
                          end.

                        Вывод:
                        Цитата
                        Hello from FooFoo
                        {"type":"SimpleJSON.TFoo","id":1,"fields":{"FName":"FooFoo"}}

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

                        Цитата D_KEY @
                        Нет, ты уже завел эту абстракцию, раз тебе это все понадобилось. Просто ты ее завел неявно. А неявное всегда хуже явного.

                        Ничего подобного :) Это взгляд завзятого сишника, которому нужно забраться в коде в печенки каждой абстракции. На самом деле их нужно просто использовать.
                          Цитата Romkin @
                          Это взгляд завзятого сишника, которому нужно забраться в коде в печенки каждой абстракции
                          Помнится тут дельфисты интересовались, как выглядит внутри конструктор в C++, чуть не на уровне машинных кодов. И что-то там еще разного говорили про важность поковыряться в исходниках библиотек, чтобы в частности быть уверенным в том, в каком порядке вызываются конструкторы и вызываются ли они вообще.
                            Цитата Flex Ferrum @
                            Чувствуешь разницу? :)

                            Да. Я уже говорил, что этот случай не учитывал.
                              Цитата trainer @
                              Помнится тут дельфисты интересовались, как выглядит внутри конструктор в C++, чуть не на уровне машинных кодов. И что-то там еще разного говорили про важность поковыряться в исходниках библиотек, чтобы в частности быть уверенным в том, в каком порядке вызываются конструкторы и вызываются ли они вообще.

                              Дык это как раз интересно, мы любопытные. Где этот код и как выглядит :)
                              Дело в том, что в Delphi этот код в стандартной библиотеке, и при желании его можно найти, всю магию компилятора. В документации-то описано как должно быть, без кода и соображений по скорости работы. Насчет важности такого ковыряния ничего не скажу, но сам факт что это есть и можно своими глазками посмотреть интересен.
                                Цитата MyNameIsIgor @
                                Цитата D_KEY @
                                На мой взгляд, использование рефлексии для обхода инкапсуляции такой же "хак", пусть и разрешенный формально в языке.

                                Мне не понятно, зачем такая возможность вообще существует. Нет, конечно, запреты только сужают возможности. Но зачем вообще может понадобиться изменение приватных полей?

                                Изменения? Не знаю. Но может быть для чего-то и пригодится.
                                Доступ к ним непосредственно на чтение может понадобится например для автоматического модульного тестирования.
                                В любом случае, не нравится - не используй.
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 202 203 [204] 205 206 ...  494 495


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