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

    Толсто :tong:
      Цитата Qraizer @
      вот нужен ли тебе в качестве удобной обёртки вокруг простой CRITICAL_SECTION аж полиморфный guard с RTTI и метаклассом, создающийся и разрушающийся не одной сотней инструкций и лежащий в хипе? Это при том, что EnterCriticalSection() и LeaveCriticalSection() укладываются от силы в пару десятков, когда нет конкуренции.

      1. RTTI можно отключить
      2. метакласс один на все экземпляры
      3. а тебе не по барабану, сколько он создаётся/разрушается? время жизни CS = времени жизни защищаемого ресурса и в большинстве случаев создаётся при старте приложения и уничтожается при завершении
      4. ну расположи его не в хипе, какие проблемы то?
      5. и какая связь между созданием/разрушением класса и входом/выходом из CS? :blink:
        Цитата DesweR @
        Органиченной, за что все и критикуют (и даже критики ООП).
        Она полностью достаточна и даже больше. Птолемеева система тоже более развита, сколько колец там было на тело? Птолемей сделал два - одно вокруг Земли, и по нему второе, уже с телом. Но говорят, перед Коперником уже до семи доходило. Вот оно, развитие.
        Цитата DesweR @
        А для реализации легковестного try/finally в С++ как будто не нужен "guard" из класса?
        Нужен. Только его не будет в объектном коде.
        ExpandedWrap disabled
          class CT
          {
            CRITICAL_SECTION& ct;
           
          public:
             CT(CRITICAL_SECTION& src): ct(src) { EnterCriticalSection(&ct); }
            ~CT()                               { LeaveCriticalSection(&ct); }
          };
           
          CRITICAL_SECTION ct;
           
          int main()
          {
           CT guard(ct);
          }
        ExpandedWrap disabled
          _TEXT   SEGMENT
          _main   PROC                                            ; COMDAT
          ; Line 16
                  push    OFFSET ?ct@@3U_RTL_CRITICAL_SECTION@@A  ; ct
                  call    DWORD PTR __imp__EnterCriticalSection@4
          ; Line 17
                  push    OFFSET ?ct@@3U_RTL_CRITICAL_SECTION@@A  ; ct
                  call    DWORD PTR __imp__LeaveCriticalSection@4
                  xor     eax, eax
                  ret     0
          _main   ENDP
          _TEXT   ENDS
        Даже с отключённой оптимизацией едва три десятка инструкций наберётся.
        ExpandedWrap disabled
          _guard$ = -4                                            ; size = 4
          _main   PROC
          ; File d:\disk_f\work\q\q1.cpp
          ; Line 15
                  push    ebp
                  mov     ebp, esp
                  push    ecx
          ; Line 16
                  push    OFFSET ?ct@@3U_RTL_CRITICAL_SECTION@@A  ; ct
                  lea     ecx, DWORD PTR _guard$[ebp]
                  call    ??0CT@@QAE@AAU_RTL_CRITICAL_SECTION@@@Z ; CT::CT
          ; Line 17
                  lea     ecx, DWORD PTR _guard$[ebp]
                  call    ??1CT@@QAE@XZ                           ; CT::~CT
                  xor     eax, eax
                  mov     esp, ebp
                  pop     ebp
                  ret     0
          _main   ENDP
          _TEXT   ENDS
          EXTRN   __imp__EnterCriticalSection@4:PROC
          ; Function compile flags: /Odtp
          ;       COMDAT ??0CT@@QAE@AAU_RTL_CRITICAL_SECTION@@@Z
          _TEXT   SEGMENT
          _this$ = -4                                             ; size = 4
          _src$ = 8                                               ; size = 4
          ??0CT@@QAE@AAU_RTL_CRITICAL_SECTION@@@Z PROC            ; CT::CT, COMDAT
          ; _this$ = ecx
          ; Line 8
                  push    ebp
                  mov     ebp, esp
                  push    ecx
                  mov     DWORD PTR _this$[ebp], ecx
                  mov     eax, DWORD PTR _this$[ebp]
                  mov     ecx, DWORD PTR _src$[ebp]
                  mov     DWORD PTR [eax], ecx
                  mov     edx, DWORD PTR _this$[ebp]
                  mov     eax, DWORD PTR [edx]
                  push    eax
                  call    DWORD PTR __imp__EnterCriticalSection@4
                  mov     eax, DWORD PTR _this$[ebp]
                  mov     esp, ebp
                  pop     ebp
                  ret     4
          ??0CT@@QAE@AAU_RTL_CRITICAL_SECTION@@@Z ENDP            ; CT::CT
          _TEXT   ENDS
          EXTRN   __imp__LeaveCriticalSection@4:PROC
          ; Function compile flags: /Odtp
          ;       COMDAT ??1CT@@QAE@XZ
          _TEXT   SEGMENT
          _this$ = -4                                             ; size = 4
          ??1CT@@QAE@XZ PROC                                      ; CT::~CT, COMDAT
          ; _this$ = ecx
          ; Line 9
                  push    ebp
                  mov     ebp, esp
                  push    ecx
                  mov     DWORD PTR _this$[ebp], ecx
                  mov     eax, DWORD PTR _this$[ebp]
                  mov     ecx, DWORD PTR [eax]
                  push    ecx
                  call    DWORD PTR __imp__LeaveCriticalSection@4
                  mov     esp, ebp
                  pop     ebp
                  ret     0
          ??1CT@@QAE@XZ ENDP                                      ; CT::~CT
          _TEXT   ENDS
        Цитата DesweR @
        P.S. А реализация RAII в Delphi гораздо проще, чем тебе кажется, нужен только интерфейсный объект.
        Если она проще и не дороже вот такого:
        ExpandedWrap disabled
          struct S {
           
           /* ... */
           
           S& operator= (const S& s) {
             int* ptr = new int;
           
             delete ptr1;
             ptr1 = ptr;
             *ptr1= *s.ptr1;
           
             return *this;
           }
          };
           
          struct SS : S {
           /* ... */
           
           SS& operator= (const SS& s) {
             S    tmp;           // Вообще-то по-нормальному это делается
             tmp  = s;           // конструктором копии, конечно.
             int* ptr = new int;
           
             delete ptr2;
             ptr2 = ptr;
             *ptr2= *s.ptr2;
           
             ptr = tmp.ptr1;     //
             tmp.ptr1 = ptr1;    // А это - перегрузкой std::swap() для S.
             ptr1 = ptr;         //
           
             return (*this);
           }
          };
        то покажи, пожалуйста. Это искусственный пример из некой темы. Класс SS производный от S, каждый имеет по указателю на int. Требуется обеспечить строгую гарантию, т.е. отсутствие утечек ресурсов и утери предыдущего состояния при любых ошибках.
        Цитата DesweR @
        столько воды из одного лишь суждения, что в Delphi, что ни конструктор - то обязательно с виртуальными методами, а что ни виртуальный метод - то обязательно с говнокодом
        Суждения не из-за этого, суждения с ваших же слов. О монолитности, о неявлении себя базовым классом при наследовании, о полном контроле базовых классов производным, о вмешательстве базовых классов в дела производных итп. Сведений более чем достаточно. Сами по себе виртуальные конст... сама по себе виртуальная инициализация после конструирования вещь иногда полезная, а говнокод ...да, ваш хороший код обязан с нашей точки зрения быть говнокодом в таких условиях, иначе он просто небезопасен.
        Сообщение отредактировано: Qraizer -
          Цитата D_KEY @
          :no: scala нацелена на мультипарадигмальность, на тесную интеграцию разных подходов(не только функционального и ОО, там есть попытки реализации различных идей).
          Даже алгебраические типы данных сделаны через специальный механизм так называемых case-классов

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

          Цитата D_KEY @
          Что он дает на практике?

          гибкость и удобство в управлении поведением объектной системы

          Добавлено
          Цитата Shaggy @
          2. метакласс один на все экземпляры

          на самом деле нет, определение "классовых методов" как раз фактически описывает новый метакласс
            Цитата DesweR @
            Как в кривом зеркале, ей богу. С высоты полёта (над обоими языками) дельфийская модель видится более развитой.

            А можешь подвести краткие итоги, и рассказать, на основании чего ты сделал такой вывод?

            Цитата DesweR @
            Опять кривое зеркало, давай более развернуто.

            Первое что на ум пришло, даже не думая: Вам приходится вручную следить за созданием объекта и его разрушением, чуть что не так, забыл проверить в деструкторев методе Deinitialize на nil, и все выхватил AV, отсуствует или есть но в убогой форме обобщенное программирование. Также, вся работа с классами - очень сильно смахивает - на кучу паттернов которые слили в одну кучу... Некоторые технологии, попросту встроили в сам язык, например COM ? Завтра придумают новую, и вы ее не сможете заюзать, или сможете, но с приминением анальных технологий, потому как язык позволяет только то, что он предоставляет... И будете ждать, пока новую технологию, встроят вам в язык... А ведь может пройти и немало времени... Ну и т.д. и т.п. это то что первое приходит на ум...

            Цитата DesweR @
            А для реализации легковестного try/finally в С++ как будто не нужен "guard" из класса? Впрочем это тоже проходили.

            Этот гард из класса, при необходимости, пишется ровно за 30 секунд закрытыми глазами. А вот представь что в делфи отсуствовали бы try/finaly, можешь привести пример кода, или класса, или еще чего, что у вас там есть, что вполне так же безопасно и легко могло бы заменить эти блоки кода? А заодно рассккажи как часто вы их юзаете?
              Ахахахахаха
              Цитата Adil @
              почему же? конструирует код метода метакласса, но не сам же метод метакласса =)

              Цитата Adil @
              а, так это же метаметод метакласса! Так бы метасразу и сказал.

              +1 :lol::lol::lol::lol::lol:
                Цитата DesweR @

                Как в кривом зеркале, ей богу. С высоты полёта (над обоими языками) дельфийская модель видится более сложной и запутанной.

                Fixed.

                Добавлено
                Не, серьзно зачем C++ с развитой системой шаблонов метаклассы?
                  Цитата DesweR @
                  С высоты полёта (над обоими языками) дельфийская модель видится более развитой.

                  Нет. С "высоты полета" более развитое ООП у ruby, python, scala, etc. ;)

                  Цитата
                  Цитата Qraizer @
                  Заодно, предупреждая очередное недоумение: с RAII та же картина - либо оно им не нужно, иначе не было б столько try/finally, либо бесполезно объяснять, что это такое, реализовать сам Дельфи не даст, как я понял. Вернее, даст, но... вот нужен ли тебе в качестве удобной обёртки вокруг простой CRITICAL_SECTION аж полиморфный guard с RTTI и метаклассом, создающийся и разрушающийся не одной сотней инструкций и лежащий в хипе? Это при том, что EnterCriticalSection() и LeaveCriticalSection() укладываются от силы в пару десятков, когда нет конкуренции. Ну, да, можно не классом, а рекордом или обджектом, только тогда автоматизации тоже не будет, и опять вернёмся к try/finally. Всё это тоже проходили.

                  А для реализации легковестного try/finally в С++ как будто не нужен "guard" из класса? :D Впрочем это тоже проходили.

                  Нет никакого "легковестного" try/finally. Исключение обрабатывается не в месте возникновения и часто даже не на один уровень выше, поэтому наличие лишних блоков try/finally ради освобождения ресурсов всегда только запутывает код, не принося ничего хорошего. Механизм деструкторов или "менеджеры контекста"(with в питоне, using в C#) позволяют решать проблемы работы с ресурсами гораздо лучше, а блоки try появляются только тогда, когда они нужны - для обработки исключений.

                  Добавлено
                  Цитата korvin @
                  Цитата D_KEY @
                  :no: scala нацелена на мультипарадигмальность, на тесную интеграцию разных подходов(не только функционального и ОО, там есть попытки реализации различных идей).
                  Даже алгебраические типы данных сделаны через специальный механизм так называемых case-классов

                  нет, не нацелена

                  Цитата
                  Scala is a general purpose programming language designed to express common programming patterns in a concise, elegant, and type-safe way. It smoothly integrates features of object-oriented and functional languages

                  http://www.scala-lang.org/
                  Цитата
                  Scala is object-oriented

                  Scala is a pure object-oriented language in the sense that every value is an object. Types and behavior of objects are described by classes and traits. Classes are extended by subclassing and a flexible mixin-based composition mechanism as a clean replacement for multiple inheritance.

                  Scala is functional

                  Scala is also a functional language in the sense that every function is a value. Scala provides a lightweight syntax for defining anonymous functions, it supports higher-order functions, it allows functions to be nested, and supports currying. Scala's case classes and its built-in support for pattern matching model algebraic types used in many functional programming languages.

                  Furthermore, Scala's notion of pattern matching naturally extends to the processing of XML data with the help of right-ignoring sequence patterns. In this context, sequence comprehensions are useful for formulating queries. These features make Scala ideal for developing applications like web services


                  Основное направление - интеграция ОО и функциональных подходов. Но если почитать документацию, то видны и другие интересные идеи.

                  Цитата
                  на мультипарадигменность нацелен CL.
                  И каким образом это доказывает "ненацеленность" на это других языков?

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

                  В чем костыль?
                  A Tour of Scala: Case Classes
                  ExpandedWrap disabled
                    abstract class Term
                    case class Var(name: String) extends Term
                    case class Fun(arg: String, body: Term) extends Term
                    case class App(f: Term, v: Term) extends Term


                  Цитата
                  Цитата D_KEY @
                  Что он дает на практике?

                  гибкость и удобство в управлении поведением объектной системы
                  Я спросил, что это дает на практике, а ты мне все те же общие слова...
                  Сообщение отредактировано: D_KEY -
                    Цитата D_KEY @
                    ...

                    ни в одной из приведенных тобою цитат нет ни слова о мультипарадигменности

                    Добавлено
                    Цитата Мяут-Настоящий @
                    Не, серьзно зачем C++ с развитой системой шаблонов метаклассы?

                    выведи типы параметров шаблона, список всех экземпляров шаблона в рантайме, измени инстансы шаблона в рантайме при смене параметра шаблона

                    Добавлено
                    Цитата D_KEY @
                    В чем костыль?
                    A Tour of Scala: Case Classes
                    ExpandedWrap disabled
                      abstract class Term
                      case class Var(name: String) extends Term
                      case class Fun(arg: String, body: Term) extends Term
                      case class App(f: Term, v: Term) extends Term

                    в отсутствии абстракции и использовании классов не по назначению. не ты ли тут утверждал, что публичные поля классов -- зло?
                      Цитата korvin @
                      Цитата D_KEY @
                      ...

                      ни в одной из приведенных тобою цитат нет ни слова о мультипарадигменности

                      :D Иногда поиск по ключевому слову не самый лучший способ понять, о чем речь

                      Цитата
                      Цитата Мяут-Настоящий @
                      Не, серьзно зачем C++ с развитой системой шаблонов метаклассы?

                      выведи типы параметров шаблона, список всех экземпляров шаблона в рантайме, измени инстансы шаблона в рантайме при смене параметра шаблона
                      Зачем это делать в рантайме?

                      Цитата
                      Цитата D_KEY @
                      В чем костыль?
                      A Tour of Scala: Case Classes
                      ExpandedWrap disabled
                        abstract class Term
                        case class Var(name: String) extends Term
                        case class Fun(arg: String, body: Term) extends Term
                        case class App(f: Term, v: Term) extends Term

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

                      А причем тут публичные поля ;) ?
                      "Отсутствие абстракции" - что это значит?
                      Классы используются по назначению. Иерархия классов в таком виде мало отличается от алгебраического типа данных.
                      Вернее, алгебраические типы данных могут быть представлены или как C-style union + теги, или же в виде иерархии классов.
                        Цитата D_KEY @
                        Я спросил, что это дает на практике, а ты мне все те же общие слова...

                        прозрачная обобщенная реализация "особых" классов: синглтонов, классов проецирующихся на таблицы БД, классы, хранящие таблицу своих экземпляров, классы описывающие группу классов, например: класс funcallable выступает классом метаклассов "вызываемых" объектов, каждый метакласс которого описывает определенную группу классов: классы обычных функций, классы generic-функций, и т.п.

                        грубо говоря, метакласс standard-class описывает структуру класса: список суперклассов, список слотов, список методов, список субклассов. а метакласс oo-class описывает свойства метакласса standard-class: наследование, полиморфизм, инкапсуляция.

                        Добавлено
                        Цитата D_KEY @
                        :D Иногда поиск по ключевому слову не самый лучший способ понять, о чем речь

                        иногда стоит говорить по теме

                        Добавлено
                        Цитата D_KEY @
                        Зачем это делать в рантайме?

                        что именно? с получением списка методов в рантайме С++-ники уже обломались один раз

                        Добавлено
                        Цитата D_KEY @
                        А причем тут публичные поля ;) ?

                        а при том, что единственный способ работать с алгебраическими типами ланных -- сопоставление с оброзцом, а для этого нужно знать структуру типа.
                          Цитата korvin @
                          Цитата D_KEY @
                          Я спросил, что это дает на практике, а ты мне все те же общие слова...

                          прозрачная обобщенная реализация "особых" классов: синглтонов, классов проецирующихся на таблицы БД, классы, хранящие таблицу своих экземпляров, классы описывающие группу классов, например: класс funcallable выступает классом метаклассов "вызываемых" объектов, каждый метакласс которого описывает определенную группу классов: классы обычных функций, классы generic-функций, и т.п.

                          Не вижу, зачем здесь метаклассы. Синглитоны в той же scala описываются просто с помощью object, Active Record(например, в Ruby) чудесно справляется без метаклассов, с хранением таблицы экземпляров справится объект-синглетон(или просто static-член класса), для вызываемых объектов достаточно интерфейса или просто соглашения об использовании оператора(как в С++ или питоне).

                          Цитата
                          грубо говоря, метакласс standard-class описывает структуру класса: список суперклассов, список слотов, список методов, список субклассов. а метакласс oo-class описывает свойства метакласса standard-class: наследование, полиморфизм, инкапсуляция.

                          Это круто, конечно, но есть ли какая-то в этом необходимость?
                            Цитата D_KEY @
                            "Отсутствие абстракции" - что это значит?

                            это значит "я его слепила из того, что было", только кишками наружи выставила

                            Добавлено
                            Цитата D_KEY @
                            Классы используются по назначению. Иерархия классов в таком виде мало отличается от алгебраического типа данных.
                            Вернее, алгебраические типы данных могут быть представлены или как C-style union + теги, или же в виде иерархии классов.

                            только технически, но это полностью противоречит сути классов
                              Цитата korvin @
                              Цитата D_KEY @
                              :D Иногда поиск по ключевому слову не самый лучший способ понять, о чем речь

                              иногда стоит говорить по теме

                              http://en.wikipedia.org/wiki/Scala_(programming_language)
                                Цитата D_KEY @
                                Синглитоны в той же scala описываются просто с помощью object

                                дык потому что там нет метаклассов

                                Добавлено
                                Цитата D_KEY @
                                просто static-член класса

                                это уже работа на уровне метакласса
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 213 214 [215] 216 217 ...  494 495


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.3693 ]   [ 15 queries used ]   [ Generated: 1.08.26, 13:37 GMT ]