На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Закрыто archimed7592 11-03-2008: Лимит страниц. Продолжаем Delphi vs C++

Страницы: (117) « Первая ... 14 15 [16] 17 18 ...  116 117  ( Перейти к последнему сообщению )  
> Delphi vs C++ , Часть 1
    Цитата Hryak @
    Я про то, что при использовании with скакать нужно больше

    Да ничего никому не нужно, стоит для самого себя оставить комментарии, которые и так оставлять не вредно. Как только видишь, что ситуация в последствии может стать неоднозначной, так и пометил. В большенстве же случаев with очень даже кстати, строчки получаются короче, а значит читабельнее, не говоря уж о затратах на набор текста.

    Цитата Hryak @
    Через годик решаем класс дополнить методом bar() - и всё тихо-тихо-незаметно ломается

    Ломается из-за того, что в дельфи есть with? Или все же из-за того, что применяется везде и всюду без разбора? Кстати, вероятность того, что ты описал ровно такая же, как и то, что ты объявишь функциф с таким же именем, что и стандартная :) Но ведь никто по этому поводу не плачет.

    Добавлено
    Цитата Flex Ferrum @
    но писать текст программы рассчитывая на то, что он будет просматриваться/редактироваться в рамках конкретной IDE - ИМХО, ошибка

    Почему же? Если какая-то IDE является стандартом для предприятия, и исходники не выходят наружу, то пуркуа бы да и не па?
      Цитата Smike @
      Взял наугад первый попавшийся чужой код с with. Мне все понятно ;)
      ExpandedWrap disabled
            with RGB do
            begin
              if R > 0 then
                R := Power(R, Gamma)
              else
                R := 0;
              if G > 0 then
                G := Power(G, Gamma)
              else
                G := 0;
              if B > 0 then
                B := Power(B, Gamma)
              else
                B := 0;
            end;

      Кстати, код, имхо, неудачный. Это называется копи-паст. Вместо того, чтобы написать функцию и три раза вызвать, тут нашли применение оператору with :lol:

      Так что, Smike, давай другой пример. ;)

      Добавлено
      Или это я туплю... :unsure:
      Не, все правильно, в глазах просто рябит от такого кода :)
      Сообщение отредактировано: Nich -
        Цитата Smike @
        И вот ты опять в лужу сел :) Долго время существовало для Дельфи 2 менеджера памяти: стандартный Борландовский и FastMM. Теперь FastMM стал стандартным. И тем не менее подключить можно любой другой.

        Нужен именно собственный, написанный ручками, ан еБорландовский и не FastMM :)
        Цитата Dantes @
        В C++ union не так уж и полезен, поскольку объекты, имеющие нетривиальные конструкторы, операторы присваивания и деструкторы, не могут быть его членами.

        вообще-то не могут являться его челнами не-POD-типы. Зато такие конструкции прокатывают на ура:
        ExpandedWrap disabled
          union flags {
           int word;
           struct {
             int fail_bit: 1;
             int open_bit: 1;
             ...
           };
          };
          Ну еще в старом добром C были макросы, с помощью которых можно сделать проще и нагляднее ;)
          ExpandedWrap disabled
            #define doRGBcomponent(rgb,c,gamma) rgb.c = rgb.c > 0 ? pow(rgb.c,gamma) : 0
            #define doRGB(rgb,gamma) \
              do { \
                double __Gamma = gamma; \
                doRGBcomponent(rgb,R,__Gamma); \
                doRGBcomponent(rgb,R,__Gamma); \
                doRGBcomponent(rgb,R,__Gamma); \
              } while (0)
            .......
            doRGB(RGB,Gamma);

          Хотя, принимая во внимание мощь сегодняшних редакторов кода и убогость сишных макросов, скопипастить и правда проще.
            Цитата Мяут @
            Цитата Smike @
            И вот ты опять в лужу сел :) Долго время существовало для Дельфи 2 менеджера памяти: стандартный Борландовский и FastMM. Теперь FastMM стал стандартным. И тем не менее подключить можно любой другой.

            Нужен именно собственный, написанный ручками, ан еБорландовский и не FastMM :)

            Борландовский действительно писали не ручками, а вот FastMM именно собственный, написанный ручками
              Цитата Smike @
              Надуманный пример. Никогда не сталкивался с трудностями при использовании with.

              Я тоже не сталкивался. Но я и не показатель, так как на Паскале максимум что написал - так это дипломный проект в 12 тыс. строчек и не сильно там with использовал.

              Цитата
              Взял наугад первый попавшийся чужой код с with. Мне все понятно ;)
              ExpandedWrap disabled
                    with RGB do
                    begin
                      if R > 0 then
                        R := Power(R, Gamma)
                      else
                        R := 0;
                      if G > 0 then
                        G := Power(G, Gamma)
                      else
                        G := 0;
                      if B > 0 then
                        B := Power(B, Gamma)
                      else
                        B := 0;
                    end;

              Даже если бы я не знал структуры RGB, то легко догадаться, что это именно R, G и B.

              Здесь понятно, но и пример это простой. Хотя от обилия R, G, B и такого равноформатированного кода действительно в глазах рябит. :)
              В C++ я бы выделил дублирующийся код в функцию и не переживал по поводу отcутствия with.

              Цитата Астарот
              Да ничего никому не нужно, стоит для самого себя оставить комментарии, которые и так оставлять не вредно. Как только видишь, что ситуация в последствии может стать неоднозначной, так и пометил.

              Ага, не скакать дак комментарии писать. :D Я, знаешь ли, предпочитаю самодокументированный код.
              Между (сорри, что псевдокод на С++, на Паскале ломает)
              ExpandedWrap disabled
                with (obj)
                { // foo, zoo - методы obj, bar - свободная функция
                  foo(bar());
                  zoo(bar());
                }
              и
              ExpandedWrap disabled
                  obj.foo(bar());
                  obj.zoo(bar());
                }
              выберу второй вариант.

              Цитата
              Ломается из-за того, что в дельфи есть with? Или все же из-за того, что применяется везде и всюду без разбора?

              Что значит - без разбора?
              Если внутри with идет обращение только к полям и методам ссылаемого объекта - проблем нет и не будет. Однако так бывает редко.

              Цитата
              Кстати, вероятность того, что ты описал ровно такая же, как и то, что ты объявишь функцию с таким же именем, что и стандартная

              Ох, держите меня семеро. Толи я плохо объясняю (помогите объяснить те, кто меня понимает) или просто оппоненты не желают меня понимать. Или я действительно фигню говорю... :whistle:
              Дело не в вероятности, а в последствиях наступления этого события.
              Показываю еще раз.

              ExpandedWrap disabled
                int bar(); // некая глобальная функция
                .....
                class SomeClass
                {
                  void foo(int);
                  int bar();  // внутри класса внешняя bar скрывается да и черт с ней, помнить о перекрытии
                    // нужно только разработчику класса, да и то, только если он сам желает эту скрытую
                    // функцию юзать. Но никак не пользователю класса...
                  void zoo();
                };
                 
                .....
                // далеко-далеко в другом модуле черт знает какого проекта:
                SomeClass obj;
                ...
                 
                // путь 1
                with (obj) {
                  foo(bar());
                  zoo();
                }
                 
                // путь 2
                obj.foo(bar());
                obj.zoo();


              Путь 1: кто такие foo, bar и zoo по внешнему виду совсем не понятно. Ясно только, что кто-то из них - метод SomeClass (хотя, может и нет, если код отрефакторили и забыли убрать уже ненужный with ;) ).

              Путь 2: Программисту, написавшему obj.foo(bar()); не нужно знать - есть ли, нет ли в SomeClass метод bar. Тут два варианта:
              а) он либо дергает глобальную функцию bar;
              б) если в классе, в чьем методе находится написанный код, или в его предках, есть метод bar - дергается он. Но диапазон влияющего кода - только определения этих классов, никак не ещё и определения класса SomeClass и его предков.

              with сразу налагает на программиста, его написавшего, ответственность за знание внутренностей with'уемого объекта, чего не требуется в первом пути (знать нужно только то, что реально используется в данном месте от этого объекта, т.е. foo и zoo).

              Программы пишут для того, чтобы их читать. Когда человек будет это читать и прочитает with (obj) ему придется в первую очередь бежать к определению класса SomeClass, чтобы посмотреть - а нет ли там методов foo, zoo и bar.
              Во втором пути ему это делать не придется, т.к. сразу видно, что foo и zoo являются методами SomeClass, а bar - не является (а даже если и является - как в данном случае - то это фиолетово для этого кода). Разделяй и властвуй и не помни о ненужных деталях.
              Сообщение отредактировано: Hryak -
                Hryak, боюсь, оппоненты твою логику все равно не осилят. Все же для этого надо разбираться в правилах поиска имен, которым плюсы учат с "младых ногтей".
                  Вообще на мой взгляд, тут не совсем в правилах поиска имен дело, сколько в инкапсуляции. У любого класса с точки зрения ООП есть интерфейс и реализация, ведь так. Так вот чтобы обратится через интерфейс к реализации, я должен указать имя объекта и имя метода. Все предельно просто. Используя with, в программу вносится неопределенность, такая же как если бы программист на C++ написал using namespace std; - ведь интерфейс становится не частью класса, а достояние всей глобальной области видимости.

                  with'ом, да пользользовался. В конце концов слегка запутался. Больше не буду :no:
                    Цитата Flex Ferrum @
                    Hryak, боюсь, оппоненты твою логику все равно не осилят. Все же для этого надо разбираться в правилах поиска имен, которым плюсы учат с "младых ногтей".

                    Не, ну должны же и в Делфи быть подобные правила... :wacko:
                      Цитата Hryak @
                      Или я действительно фигню говорю...

                      М-м...

                      Цитата Flex Ferrum @
                      Hryak, боюсь, оппоненты твою логику все равно не осилят. Все же для этого надо разбираться в правилах поиска имен, которым плюсы учат с "младых ногтей"

                      Ни в жисть не осилят :D Потому как логика довольно ущербна.

                      Не знаю уже, как остальные сторонники сипипи, отметившиеся здесь, но г-н Hryak честно признался в незнании ненавистного ему паскаля. Хорошо знающий язык, опытный программист никогда не будет испытывать трудностей, которые здесь живописали. Пишущему на паскале сипипи всегда будет китайской грамотой, равно как и наоборот. Былой опыт не считается.

                      Все эти споры о закорючках на самом деле со стороны смотрятся довольно нелепо. Я могу так говорить, так как давно не пишу на сипипи и еще давнее не пишу на паскале (на дельфи не пришлось, Бог миловал, - не люблю RAD'ы). Если бы речь шла о качествах компилятора или получаемого кода или каких-то уникальных фичах, присущих тому или иному языку, еще бы можно было понять, а так... :no:
                      Сообщение отредактировано: wind -
                        Цитата Астарот @
                        Кстати, вероятность того, что ты описал ровно такая же, как и то, что ты объявишь функциф с таким же именем, что и стандартная :) Но ведь никто по этому поводу не плачет.
                        угу, вот в с++ для этого сделаны namespaces... и только инаковерующие в каждом модуле первой строкой после include'ов пишут using namespace std; кстати, а что с namespace'ами в ОПаскале? :)

                        Цитата Астарот @
                        Да ничего никому не нужно, стоит для самого себя оставить комментарии, которые и так оставлять не вредно
                        типа коментарий написать проще, чем имя объекта перед именем члена?

                        Цитата wind @
                        или каких-то уникальных фичах, присущих тому или иному языку, еще бы можно было понять, а так... :no:
                        сколько уже было сказано... template тот же... сейчас в c++ без них жизни не видят, а в ОПаскале всё извращаются, да извращаются...

                        Цитата wind @
                        Пишущему на паскале сипипи всегда будет китайской грамотой, равно как и наоборот.
                        ну я вот никак не признаю... я очень хорошо знал паскаль... сипипи считал китайской грамотой, но делал попытки понять его... понять удалось, стал опаскаль китайской грамотой считать...
                          Цитата Flex Ferrum @
                          Все же для этого надо разбираться в правилах поиска имен, которым плюсы учат с "младых ногтей".

                          О чем речь? Любой программист до этого дойдет с опытом, если конечно его опыт будет идти ему на пользу.

                          Hryak почему-то упирает на проблему с распознаванием методов класса и обычных процедур внутри блока with. Я же в упор не вижу здесь проблемы. Проблема может быть только у компилятора, если перемудрить с with и включить в него несколько однотипных объектов.

                          Вот еще пару примеров использования with. Это в классе, отрисовывающем нестандартное окно, в процедуре, где вычисляется клиентская область:
                          ExpandedWrap disabled
                              with Rect do
                              begin
                                Inc(Left, Border);
                                Inc(Top, Border + CaptionHeight);
                                Dec(Right, Border);
                                Dec(Bottom, Border);
                              end;

                          with тут пришелся как нельзя лучше. Или тоже предложите переписать с дополнительной функцией? Не вижу никакого смысла.

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

                          А если например одному объекту задаются свойства?
                          ExpandedWrap disabled
                                with TTBXSpectrumXPTheme(TBXTheme) do
                                begin
                                  UseGradColor1:= clLime;
                                  UseGradColor2:= clGreen;
                                  HoverColor1:= clMoneyGreen;
                                  HoverColor2:= clLime;
                                  HighlightCl := clLime;
                                  BtnFaceCl := clGreen;
                                  BtnShadowCl := clMoneyGreen;
                                  BtnHighlightCl := clMoneyGreen;
                                  HighlightTextCl := clGreen;
                                  BtnTextCl := clLime;
                                  GrayTextCl := clMoneyGreen;
                                  MenuTextCl := clLime;
                                  WindowCl := clLime;
                                  WindowFrameCl := clTeal;
                                  WindowTextCl := clLime;
                                  GreenCl :=  clGreen;
                                  RedCl :=  clYellow;
                                  YellowCl :=  clLime;
                                end;

                          Предложите затайпкасченый из глобальной переменной объект вывести в отдельную переменную и писать перед каждым свойством?
                          И мой любимый пример с with :)
                          ExpandedWrap disabled
                            procedure TForm2.FormMouseDown(Sender: TObject; Button: TMouseButton;
                              Shift: TShiftState; X, Y: Integer);
                            begin
                              with ClientToScreen(Point(X, Y)) do
                                PopupMenu.Popup(X, Y);
                            end;

                          Здесь with подходит как нельзя лучше :)
                            Цитата Smike @
                            Предложите затайпкасченый из глобальной переменной объект вывести в отдельную переменную и писать перед каждым свойством?

                            Use the reference

                            Добавлено
                            Цитата Smike @
                            Здесь with подходит как нельзя лучше :)

                            ExpandedWrap disabled
                              PopupMenu.Popup(ClientToScreen(Point(X,Y)));
                              Мой переход, на Delphi, с плюсов, вызван в первую очередь, переходом на принципы и концепции "экстримального программирования", котороe приносит больше восторга, и провозглашений "бугага, я это сделал". :yes:
                                Цитата archimed7592 @
                                ну я вот никак не признаю...

                                Так что "не признаю"? Об этом и речь - удобным будет только привычный инструмент. Но это никак не характеризует прочие инструменты.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (117) « Первая ... 14 15 [16] 17 18 ...  116 117
                                Закрыто archimed7592 11-03-2008: Лимит страниц. Продолжаем Delphi vs C++



                                Рейтинг@Mail.ru
                                [ Script execution time: 0,1220 ]   [ 15 queries used ]   [ Generated: 15.08.25, 02:32 GMT ]