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

    Каких костылей?! Об RPC слышал когда-нить?

    Решается библиотеками. Причем тут язык?
      Цитата D_KEY @
      А когда, например, это бывает нужно? Реализовать можно. Но руками.

      Поздний вызов. Скрипты, удаленная работа с объектами и т.д.
      Delphi вообще в последнее время ориентируется именно на сетевые сервисы.
      О таких вызовах вспомнилось именно из-за соглашений: когда порядок подачи аргументов задан, то вызвать довольно легко.

      Цитата KILLER @
      А как такое сделать? Какой метод из трех нужно звать, если известно только его имя?

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

      Добавлено
      Цитата D_KEY @
      Решается библиотеками. Причем тут язык?

      Эссно библиотеками. Я и спрашивал, как делаете поздний вызов, технологию. Для разных соглашений о вызовах.

      Добавлено
      Но, кстати, без информации,генерируемой компилятором тут не обойтись.
        Цитата Romkin @
        Цитата D_KEY @
        А когда, например, это бывает нужно? Реализовать можно. Но руками.

        Поздний вызов. Скрипты, удаленная работа с объектами и т.д.
        Delphi вообще в последнее время ориентируется именно на сетевые сервисы.

        Скрипты писать на подобных языках - извращение то еще.
        На сетевые сервисы и С++ неплохо ориентирован. Библиотек достаточно.

        Цитата
        О таких вызовах вспомнилось именно из-за соглашений: когда порядок подачи аргументов задан, то вызвать довольно легко.

        Я не очень понимаю, как связан тот же RPC с порядком подачи аргументов в функцию уже "внутри" конкретного хоста?

        Цитата
        Но, кстати, без информации,генерируемой компилятором тут не обойтись.

        Ну почему же? Объекты регистрируются там, где нужно. Компилятор же вынужден генерировать информацию, которая может быть не востребована. На лицо преждевременная писсимизация, что не есть хорошо.
          Цитата Romkin @
          Каких костылей?! Об RPC слышал когда-нить?

          Конечно слышал... Но понимаешь, это все можно сделать разными средствами.

          Добавлено
          Цитата Romkin @
          Но, кстати, без информации,генерируемой компилятором тут не обойтись.

          А нафига? Почему не юзнуть тот же Dictonary, или как он у вас называется? Ключ - текстовое название функции/класса, значение - собственно указатель на нее/него.
            Цитата D_KEY @
            Объекты регистрируются там, где нужно. Компилятор же вынужден генерировать информацию, которая может быть не востребована. На лицо преждевременная писсимизация, что не есть хорошо.

            Если программист сказал генерировать - то генерировать :)
            ExpandedWrap disabled
              program Project4;
               
              {$APPTYPE CONSOLE}
               
              uses
                SysUtils, ObjAuto;
               
              type
                {$METHODINFO ON}
                TFoo = class
                published
                  procedure Hello(const s: string);
                end;
                {$METHODINFO OFF}
               
              { TFoo }
               
              var
                Foo: TFoo;
                MethodInfo: PMethodInfoHeader;
               
              procedure TFoo.Hello(const s: string);
              begin
                writeln('Hello ', s);
              end;
               
              begin
                try
                  Foo := TFoo.Create;
                  try
                    MethodInfo := GetMethodInfo(Foo, 'Hello');
                    ObjectInvoke(Foo, MethodInfo, [1], ['world']);
                    readln;
                  finally
                    Foo.Free;
                  end;
                except
                  on E: Exception do
                    Writeln(E.ClassName, ': ', E.Message);
                end;
              end.


            Добавлено
            Цитата KILLER @
            А нафига? Почему не юзнуть тот же Dictonary, или как он у вас называется? Ключ - текстовое название функции/класса, значение - собственно указатель на нее/него.

            Это та же информация, только уже в рантайме :D
              Самый примитивный, даже допиливать лень, вариант... Пойдет?
              ExpandedWrap disabled
                #include <string>
                #include <list>
                #include <functional>
                #include <iostream>
                #include <algorithm>
                #include <map>
                #include <sstream>
                 
                class CCommand
                {
                   typedef int(*TExecFnWithArgs)(const std::list<std::string>&);
                   typedef int(*TExecFn)();
                 
                   struct SExecInfo
                   {
                      TExecFnWithArgs m_pExecFnWithArgs;
                      TExecFn m_pExecFn;
                   };
                 
                public:
                   void BindCommand(const std::string& szCmd, TExecFn pExecFn)
                   {
                      m_CommandMap[szCmd].m_pExecFn = pExecFn;
                   }
                   void BindCommand(const std::string& szCmd, TExecFnWithArgs pExecFn)
                   {
                      m_CommandMap[szCmd].m_pExecFnWithArgs = pExecFn;
                   }
                 
                   int ExecuteCmd(const std::string& szCmd, const std::list< std::string >& vArgs)
                   {
                      std::map<std::string, SExecInfo>::iterator cmdIt;
                      cmdIt = m_CommandMap.find(szCmd);
                      if( cmdIt != m_CommandMap.end() )
                      {
                         if(cmdIt->second.m_pExecFnWithArgs != NULL)
                         {
                            return (*cmdIt->second.m_pExecFnWithArgs)(vArgs);
                         }
                      }
                      return -1; //error
                   }
                   int ExecuteCmd(const std::string& szCmd)
                   {
                      std::map<std::string, SExecInfo>::iterator cmdIt;
                      cmdIt = m_CommandMap.find(szCmd);
                      if( cmdIt != m_CommandMap.end() )
                      {
                         if(cmdIt->second.m_pExecFn != NULL)
                         {
                            return (*cmdIt->second.m_pExecFn)();
                         }
                      }
                      return -1; //error
                   }
                private:
                   std::map<std::string, SExecInfo> m_CommandMap;
                };
                 
                 
                //! есть у нас какаято функция в системе
                const std::string szMyFunc1 = "MyFunc1";
                int MyFunc1(const std::list< std::string >& vArgs)
                {
                   std::cout << "It is MyFunc1" << std::endl;
                   std::list< std::string >::const_iterator i = vArgs.begin();
                   std::list< std::string >::const_iterator iEnd = vArgs.end();
                   for(; i != iEnd; ++i)
                   {
                      std::cout << *i << std::endl;
                   }
                   std::cout << std::endl;
                   return 1;
                }
                 
                const std::string szMyFunc2 = "MyFunc2";
                int MyFunc2()
                {
                   std::cout << "It is MyFunc2";
                   return 2;
                }
                 
                 
                int main (int argc, char * const argv[])
                {
                   CCommand cmd;
                   cmd.BindCommand(szMyFunc1, MyFunc1);
                   cmd.BindCommand(szMyFunc2, MyFunc2);
                 
                   char command[256];
                   std::cout << "Enter command: ";
                   std::cin.getline(command, 256);
                 
                   std::list< std::string > lstArgs;
                 
                   std::copy( std::istream_iterator<std::string>( std::istringstream(command) ),
                              std::istream_iterator<std::string>( ),
                              std::back_inserter( lstArgs ));
                  
                   if( lstArgs.empty() == false)
                   {
                      std::string szExec = lstArgs.front();
                      lstArgs.pop_front();
                      if( cmd.ExecuteCmd(szExec, lstArgs) == -1 )
                      {
                         if( cmd.ExecuteCmd(szExec) == -1)
                         {
                            std::cout << "Unknown command";
                         }
                      }
                   }
                   return 0;
                }

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

              Добавлено
              Цитата Romkin @
              Это та же информация, только уже в рантайме

              Ну да... Так а чем хуже?
                Цитата KILLER @
                Можно сделать, через классы, в данном случае сделано через функции, и написано на коленке, что в голову первое взбрело в общем...

                Долго делать. Контроль типов параметров отсутствует, в частности.

                Цитата KILLER @
                Ну да... Так а чем хуже?

                Тем, что ты должен ее ручками сгенерировать для каждого объекта, который вызывать хочешь. И поддерживать в актуальном виде.
                В Delphi информацию о методах генерирует компилятор, по заявке. Заботиться не надо. Да, хранится естественно она в классе.
                Сообщение отредактировано: Romkin -
                  Цитата Romkin @
                  Долго делать. Контроль типов параметров отсутствует, в частности.

                  Один раз написать обертку и все...

                  Цитата Romkin @
                  Тем, что ты должен ее ручками сгенерировать для каждого объекта, который вызывать хочешь. И поддерживать в актуальном виде.

                  В каком смысле? Мне нужно знать только название функции, и аргументы... Ну и все по сути, остальное класс сделает сам...

                  Добавлено
                  Цитата Romkin @
                  В Delphi информацию о методах генерирует компилятор, по заявке. Заботиться не надо. Да, хранится естественно она в классе.

                  Ну и? Это если вообще взять голый С++, без всяких бустов, и современных технологий, ну да придется один раз тогда написать, и потом юзай сколько влезет... :D
                    Для Qt возможностей С++ не хватило, пришлось запилить moc.
                      Цитата KILLER @
                      В каком смысле? Мне нужно знать только название функции, и аргументы... Ну и все по сути, остальное класс сделает сам...

                      Что имеем: ну, название объекта, имя метода и массив аргументов.
                      Что надо: найти объект, найти метод, проверить типы аргументов, вызвать. Вернуть результат.
                      Если прописывать в словаре - то для каждого объекта, который ты так хочешь вызвать, тебе нужно описывать методы, их параметры и тип каждого параметра. Появился новый объект или изменился имеющийся - будь добр, корректируй словарь.
                      Простая передача списка строк - это не очень.
                      При вызове - генерировать список параметров с их типами, передавать и получать результат.
                      В Delphi класс и RTTI дают информацию об опубликованных методах, полную. И при вызове проверяется тип параметра. При этом никаких словарей нет, информацию о типе хранит класс.
                        Ну незнаю, в свое время CORBA нормально как мне кажется себя показала...
                          Цитата IL_Agent @
                          Для Qt возможностей С++ не хватило, пришлось запилить moc.

                          Ну они там довольно странно сделали события.
                            Просто нужна конкретная задача, тогда возможно и решение проще будет. А если абстрактно мыслить, то конечно можно найти кучу недостатков, даже в вашей реализации...
                              Цитата IL_Agent @
                              Для Qt возможностей С++ не хватило, пришлось запилить moc.

                              Первые версии Qt появились не для того С++, который мы знаем ;)

                              Добавлено
                              Цитата Romkin @
                              Цитата IL_Agent @
                              Для Qt возможностей С++ не хватило, пришлось запилить moc.

                              Ну они там довольно странно сделали события.

                              Ты про сигналы и слоты? Чего же странного, очень хорошая идея.
                                Кстати korvin еще N страниц назад предлагал реализовать что-то ORM-подобное на дельфи-сиплюсплюс. Как я понимаю, сирешотчочке низачод, потому что у них что-то уже реализовано: http://ru.wikipedia.org/wiki/NHibernate
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 223 224 [225] 226 227 ...  494 495


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