Russian Qt Forum
Ноябрь 23, 2024, 02:15 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3] 4 5   Вниз
  Печать  
Автор Тема: Изобретение велосипедов  (Прочитано 32567 раз)
vulko
Гость
« Ответ #30 : Ноябрь 24, 2014, 12:59 »

Он практически ничем не отличается от моего бустовского и очень далек от вашего явовского.

мой код написан с помощью xmlpull api. парсилок есть 3 или 4 только в jdk. можно ещё и сторонние поискать, т.к. буст это сторонняя библиотека.

Что, прямо таки никаких отличий?))
Код:
const pt::ptree::value_type &it : xml.get_child( "producer" )
const ValueType &it : xml.getChild("producer")

может дело в for-each цикле? в жабе он кстати был задолго до того как его включили в очередной с++ стандарт.

или может value_type это клевое именование типов? может ValueType прятнее читается и воспринимается как тип, а не хрен пойми что угодно?)))
также как называть методы get_child?)) ещё классно делать вот так getchild. потому что для с++ кодеров обычно побарабану все, они же умнее всех остальных)))
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #31 : Ноябрь 24, 2014, 13:01 »

или может value_type это клевое именование типов? может ValueType прятнее читается и воспринимается как тип, а не хрен пойми что угодно?)))
Ээээ.

Код
C++ (Qt)
typedef pt::ptree::value_type MySuperXmlValueType;
Записан
vulko
Гость
« Ответ #32 : Ноябрь 24, 2014, 13:10 »

Нахрена мне в xml std::pair? Какая равноценность, когда пара тэг-значение никогда не равноценна!
Т.е. других претензий не осталось. Это же прекрасно. Улыбающийся
С сокетами из Java EE что нибудь покажите?
Или там примерно как и здесь все просто и эффективно?
Код
C++ (Qt)
               parser = new XmlPullParcer();
String prodTag = "producer";
String itemTag = "item";
String vTag = "v";
String dTag = "d";
while ((event = parser.next()) != XmlPullParser.END_DOCUMENT) {
   if (event == XmlPullParser.START_TAG) {
       if (prodTag .equals(parser.getName())) {
        System.out.println("producer name:" + parser.getAttributeValue(null, "name"));
       } else if (itemTag.equals(parser.getName())) {
        System.out.println("item name:" + parser.getAttributeValue(null, "name"));
       } else if (vTag.equals(parser.getName())) {
        System.out.println("v: " + parser.nextText());
       } else if (dTag.equals(parser.getName())) {
        System.out.println("d: " + parser.nextText());
   }
}
 


может ты покажешь свой код на жабе?
а если такого нет, то твои истории о "крутости" плюсов и рассуждения на тему того что для чего придумано, просто неадекватны.

это как в соседней теме пантер мне рассказывал о том что лада калина это клевая тачка. правда через сообщение выяснилось что это его первая машина и он не очень то искушен...
Записан
vulko
Гость
« Ответ #33 : Ноябрь 24, 2014, 13:13 »

или может value_type это клевое именование типов? может ValueType прятнее читается и воспринимается как тип, а не хрен пойми что угодно?)))
Ээээ.

Код
C++ (Qt)
typedef pt::ptree::value_type MySuperXmlValueType;


а толку?)

если потом все это превращается в MySuperXmlValueType.first и MySuperXmlValueType.second?)))
из говна не сделать конфетку. надо было изначально в упаковку конфету засовывать, а не говно.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #34 : Ноябрь 24, 2014, 14:03 »

если потом все это превращается в MySuperXmlValueType.first и MySuperXmlValueType.second?)))
Все кто знает про pair знает и про first/secont. Это лучше, чем для каждого нового кортежа заводить свой тип с понятными полями. Здесь один раз запомнил и пользуйся, а не лазь по документации в поисках "А как там автор исхитрился назвать...".
В яве, кстате, есть Pair, там вместо first/second - left/right, что еще более странно.

Резюмируя: Неудобства от pair минимальны, по сравнению с приведенным вами неудобным и плохо расширяемым кодом на яве для разбора xml.
« Последнее редактирование: Ноябрь 24, 2014, 14:29 от Old » Записан
vulko
Гость
« Ответ #35 : Ноябрь 24, 2014, 14:59 »

если потом все это превращается в MySuperXmlValueType.first и MySuperXmlValueType.second?)))
Все кто знает про pair знает и про first/secont. Это лучше, чем для каждого нового кортежа заводить свой тип с понятными полями. Здесь один раз запомнил и пользуйся, а не лазь по документации в поисках "А как там автор исхитрился назвать...".
В яве, кстате, есть Pair, там вместо first/second - left/right, что еще более странно.

Резюмируя: Неудобства от pair минимальны, по сравнению с приведенным вами неудобным и плохо расширяемым кодом на яве для разбора xml.


Ну во-первых, это не Java.
Это экстеншн:
Цитировать
The standard Java libraries fail to provide enough methods for manipulation of its core classes. Apache Commons Lang provides these extra methods.


Во-вторых:

Код:
[b]L	getKey()[/b]
Gets the key from this pair.

abstract L getLeft()
Gets the left element from this pair.

abstract R getRight()
Gets the right element from this pair.

[b]R getValue()[/b]
Gets the value from this pair.

Так что оно никак не смущает, т.к. есть getKey() и getValue() методы, поскольку этот класс Pair имплементирует Map.Entry интерфейс.
Записан
vulko
Гость
« Ответ #36 : Ноябрь 24, 2014, 15:00 »

Резюмируя: Неудобства от pair минимальны, по сравнению с приведенным вами неудобным и плохо расширяемым кодом на яве для разбора xml.

резюмируя, в с++ вообще нет ничего высокоуровнего для работы с xml Подмигивающий

boost это 3rd party как я уже не раз говорил. или может я не прав?))
Записан
vulko
Гость
« Ответ #37 : Ноябрь 24, 2014, 15:03 »

Old, есть у тебя опыт разработки на жабе?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #38 : Ноябрь 24, 2014, 15:46 »

Old, есть у тебя опыт разработки на жабе?
Нет.
Но это не важно, я могу оценить красоту решения на многих языках и ява не намного отличается от тех же плюсов.
Разговор начался с того, что вы сказали как замечательно работать на яве с xml документами и сокетами, и как это не удобно делать в полюсах. Я попросил вас показать это в коде и увидел жуть аналогичную QXmlStreamReader. Сокетов не увидел вообще. Как я могу оценить удобство явы по этому?
Я вовсе не оспаривают достоинства явы, хотелось просто увидеть обещанные удобства.
« Последнее редактирование: Ноябрь 24, 2014, 15:48 от Old » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #39 : Ноябрь 24, 2014, 15:57 »

резюмируя, в с++ вообще нет ничего высокоуровнего для работы с xml Подмигивающий

boost это 3rd party как я уже не раз говорил. или может я не прав?))
Ну и что? Это никак не мешает её использовать. Улыбающийся
Записан
vulko
Гость
« Ответ #40 : Ноябрь 24, 2014, 16:48 »

Old, есть у тебя опыт разработки на жабе?
Нет.
Но это не важно, я могу оценить красоту решения на многих языках и ява не намного отличается от тех же плюсов.
Разговор начался с того, что вы сказали как замечательно работать на яве с xml документами и сокетами, и как это не удобно делать в полюсах. Я попросил вас показать это в коде и увидел жуть аналогичную QXmlStreamReader. Сокетов не увидел вообще. Как я могу оценить удобство явы по этому?
Я вовсе не оспаривают достоинства явы, хотелось просто увидеть обещанные удобства.

Я не обещал никаких удобств! И ничего тебе не должен.
Я лишь констатировал тот факт, что они там есть.

Удивительно, как человек не имеющий опыта жаба разработки, так смело утверждает, приправляя все это чудесным "понимаете"...)))
Цитировать
Понимаете, ява это комплекс средств, что бы быстро разрабатывать корпоративный софт и разработчики там всего лишь  ресурс. От них не требуется думать, проводить изыскания, находить эффективные решения - от них требуется гнать код.


Посмотрим на волшебный asio... почему кстати такое название? типа async io?)

Код:
int main(int argc, char* argv[])
{
  try
  {
    if (argc != 3)
    {
      std::cout << "Usage: sync_client <server> <path>\n";
      std::cout << "Example:\n";
      std::cout << "  sync_client www.boost.org /LICENSE_1_0.txt\n";
      return 1;
    }

    boost::asio::io_service io_service;

    // Get a list of endpoints corresponding to the server name.
    tcp::resolver resolver(io_service);
    tcp::resolver::query query(argv[1], "http");
    tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);

    // Try each endpoint until we successfully establish a connection.
    tcp::socket socket(io_service);
    boost::asio::connect(socket, endpoint_iterator);

    // Form the request. We specify the "Connection: close" header so that the
    // server will close the socket after transmitting the response. This will
    // allow us to treat all data up until the EOF as the content.
    boost::asio::streambuf request;
    std::ostream request_stream(&request);
    request_stream << "GET " << argv[2] << " HTTP/1.0\r\n";
    request_stream << "Host: " << argv[1] << "\r\n";
    request_stream << "Accept: */*\r\n";
    request_stream << "Connection: close\r\n\r\n";

    // Send the request.
    boost::asio::write(socket, request);

    // Read the response status line. The response streambuf will automatically
    // grow to accommodate the entire line. The growth may be limited by passing
    // a maximum size to the streambuf constructor.
    boost::asio::streambuf response;
    boost::asio::read_until(socket, response, "\r\n");

    // Check that response is OK.
    std::istream response_stream(&response);
    std::string http_version;
    response_stream >> http_version;
    unsigned int status_code;
    response_stream >> status_code;
    std::string status_message;
    std::getline(response_stream, status_message);
    if (!response_stream || http_version.substr(0, 5) != "HTTP/")
    {
      std::cout << "Invalid response\n";
      return 1;
    }
    if (status_code != 200)
    {
      std::cout << "Response returned with status code " << status_code << "\n";
      return 1;
    }

    // Read the response headers, which are terminated by a blank line.
    boost::asio::read_until(socket, response, "\r\n\r\n");

    // Process the response headers.
    std::string header;
    while (std::getline(response_stream, header) && header != "\r")
      std::cout << header << "\n";
    std::cout << "\n";

    // Write whatever content we already have to output.
    if (response.size() > 0)
      std::cout << &response;

    // Read until EOF, writing data to output as we go.
    boost::system::error_code error;
    while (boost::asio::read(socket, response,
          boost::asio::transfer_at_least(1), error))
      std::cout << &response;
    if (error != boost::asio::error::eof)
      throw boost::system::system_error(error);
  }
  catch (std::exception& e)
  {
    std::cout << "Exception: " << e.what() << "\n";
  }

  return 0;
}

Много двоеточий вижу... прямо глаза в глазах рябит.
Ещё ни одной большой буквы не вижу, кроме комментов и плэйн текста в консоль.
Ах да, ещё это нифига не высокоуровневое апи.
Ну да, клево же по буквам читать http responce... Улыбающийся

Ещё интересно, такой http client, наверное не умеет сохранять куки. Да и вообще никакого куки менеджера в волшебном asio наверное нет?! М?

Ну и аналогичный код на жабе.

Код:
public class HttpClientTutorial {
 
  private static String url = "http://www.apache.org/";

  public static void main(String[] args) {
    // Create an instance of HttpClient.
    HttpClient client = new HttpClient();

    // Create a method instance.
    GetMethod method = new GetMethod(url);
   
    // Provide custom retry handler is necessary
    method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
    new DefaultHttpMethodRetryHandler(3, false));

    try {
      // Execute the method.
      int statusCode = client.executeMethod(method);

      if (statusCode != HttpStatus.SC_OK) {
        System.err.println("Method failed: " + method.getStatusLine());
      }

      // Read the response body.
      byte[] responseBody = method.getResponseBody();

      // Deal with the response.
      // Use caution: ensure correct character encoding and is not binary data
      System.out.println(new String(responseBody));

    } catch (HttpException e) {
      System.err.println("Fatal protocol violation: " + e.getMessage());
      e.printStackTrace();
    } catch (IOException e) {
      System.err.println("Fatal transport error: " + e.getMessage());
      e.printStackTrace();
    } finally {
      // Release the connection.
      method.releaseConnection();
    } 
  }
}

Никакого колдунства с хедерами и т.п. делать не нужно.
Все обернуто высокоуровневыми интерфейсами. HttpRequest, HttpResponce, HttpClient. Все это имеет огромный функционал, начиная от поддержки всяких https, удобного логина, удобных POST/GET запросов, возможности легко впихнуть внутрь JSON и распарсить...
Куки поддерживает, причем сохраняет их автоматически для инстанса HttpClient. Можно их легко сохранять и подгружать.

Функционал очень широкий. Я не профессионал в бусте, но думаю что многого там нет.
Записан
vulko
Гость
« Ответ #41 : Ноябрь 24, 2014, 17:01 »

резюмируя, в с++ вообще нет ничего высокоуровнего для работы с xml Подмигивающий

boost это 3rd party как я уже не раз говорил. или может я не прав?))
Ну и что? Это никак не мешает её использовать. Улыбающийся

Да, но тогда некорректно сравнивать жабу с с++ и бустом.
Это все равно что сравнить жабу се + ее против просто плюсов с стл.

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

А так да, никто не мешает её использовать.

Кстати возвращаясь к теме удобства, наверное про инлайн классы ты тоже не в курсе?
Невероятно удобно.
Ещё невероятно удобно то, что нет хедеров, нет множества классов в одном файле и файл называется точно также как и класс! ещё есть удобное разделение по пакетам, соотв. структуре на файловой системе.
Записан
vulko
Гость
« Ответ #42 : Ноябрь 24, 2014, 17:04 »

Ах да... ну добавить вишенку на вершину торта забыл... =)

Откомпилированный байт код можно запускать на любой машине с JRE.
А плюсовый так откомпилировать не получиться даже при всем желании.
Приходиться воротить хитрые скрипты, утолщать проект.

Да и библиотеки тоже приходиться компилировать под разные платформы...
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #43 : Ноябрь 24, 2014, 17:08 »

Я не обещал никаких удобств! И ничего тебе не должен.
Я лишь констатировал тот факт, что они там есть.
Чем этот факт подкреплен?

Удивительно, как человек не имеющий опыта жаба разработки, так смело утверждает, приправляя все это чудесным "понимаете"...)))
А с чем вы не согласны?

Ещё интересно, такой http client, наверное не умеет сохранять куки. Да и вообще никакого куки менеджера в волшебном asio наверное нет?! М?
Конечно не умеет, asio это самый низкий уровень. Он работа с сокетами, а вы показали работу с протоколом http. Это разные вещи.

Кстати для работы с http на с++ есть куча годных библиотек, с поддержкой всех указанных вами кайфов. Например, это есть в Qt или в cpp-netlib. Последнее использует asio и реализует верхний уровень для http.
Вот пример простого клиента:
Код
C++ (Qt)
using namespace boost::network;
using namespace boost::network::http;
 
client::request request_("http://127.0.0.1:8000/");
request_ << header("Connection", "close");
client client_;
client::response response_ = client_.get(request_);
std::string body_ = body(response_);
 

Все обернуто высокоуровневыми интерфейсами. HttpRequest, HttpResponce, HttpClient. Все это имеет огромный функционал, начиная от поддержки всяких https, удобного логина, удобных POST/GET запросов, возможности легко впихнуть внутрь JSON и распарсить...
Куки поддерживает, причем сохраняет их автоматически для инстанса HttpClient. Можно их легко сохранять и подгружать.
Это все можно в cpp-netlib, cCURL, POCO C++ и еще 100500 разных библиотеках на C++, много из которых позволяют это делать очень удобно.
« Последнее редактирование: Ноябрь 24, 2014, 17:24 от Old » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #44 : Ноябрь 24, 2014, 17:21 »

Да, но тогда некорректно сравнивать жабу с с++ и бустом.
Я это уже писал.
Я не хочу их сравнивать, я хотел увидеть красивое решение задачи на яве, против ее некрасивого решения на С++. Пока получается обратное.
Причем, вы начали разговоры про красоту одного и убогость другого.
« Последнее редактирование: Ноябрь 24, 2014, 17:25 от Old » Записан
Страниц: 1 2 [3] 4 5   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.269 секунд. Запросов: 23.