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

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

Страниц: 1 ... 3 4 [5] 6 7 8   Вниз
  Печать  
Автор Тема: Парсинг строки определенного типа  (Прочитано 48667 раз)
_OLEGator_
Гость
« Ответ #60 : Май 06, 2014, 09:31 »

Простота формата = простоте кода = простота поддержки.

Не согласен. Спагетти-код поддерживать невозможно.
А быдло программисты должны мучиться, нельзя писать код с расчетом на них.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #61 : Май 06, 2014, 11:36 »

Вот вариант того (народный метод в лоб), что мне сейчас удалось написать на коленке:
...
Это тот "простейший метод" сделать  это прогоняясь по строке. Обратите внимание на число проверок (необходимых), для того, что бы в итоге не получить полную чушь.
Т.е. при отсутствии чудесных средств (которыми программист обязан владеть) надо было писать как Вы исполнили "на коленке"? (тот код даже неудобно цитировать). Неправда, можно было написать нормально, напр
Код
C++ (Qt)
int x, y;
QString phone, mail;
static const QString prefixX = "+X";
static const QString prefixY = "-Y";
static const QString str_Phone = "Phone";
static const QString str_Mail = "Mail";
 
try {
ExpectWord(src, prefixX);
x = ExpectInt(src);
 
ExpectWord(src, prefixY);
y = ExpectInt(src);
 
ExpectWord(src, str_Phone);
phone = NextWord(src);
 
ExpectWord(src, str_Mail);
mail = NextWord(src);
}
catch (...) {
..
}
- скорости здесь можно выжать очень хорошую
- контроль ошибок полный
- читабельность отличная, вообще нет переходов вверх (спагетти)
- поддержка: ну думаю что делают вызовы - всем понятно по их именам

Основное возражение: Кааак??? Это я должен еще писать какие-то велосипеды??? (ExpectWord, NextWord). Да, решение с QRegExp намного короче. Но ведь это достигнуто за счет отсутствия всякого контроля. Типа "нашла - хорошо, не нашла - ну и ладно".  

А если кто то так заботиться о обработке ошибок и т.п..
Да, заботится, и не надо тут "делать одолжение", контроль ошибок - это часть работы.

то boost::spirit предоставляет гибкие решения и этой проблемы. Оставаясь на порядок более гибким, понятным и производительным решением..)
Позвольте, но ведь Вы только что воспевали регулярку! А теперь выходит надо применять совсем др инструментарий, и затратить не один день на его изучение. Как же так Непонимающий

А может все куда проще - руками делать не умеем, вот и ищем тулзы чтобы прикрыться  Улыбающийся
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #62 : Май 06, 2014, 11:54 »

Цитировать
Позвольте, но ведь Вы только что воспевали регулярку! А теперь выходит надо применять совсем др инструментарий, и затратить не один день на его изучение. Как же так
Спирит я привёл как пример инструмента, где уже реализован механизм за контролем ошибок (прямо из коробки)

В чём проблема реализовать контроль над ошибками используя regex? Также читаете построчно файл и к каждой строке применяете регулярку.. Если не проходит, то выкидываем эту строку в логгер, который знает что с ней делать.. Всё.

Цитировать
А может все куда проще - руками делать не умеем, вот и ищем тулзы чтобы прикрыться
Аха.. Зато я смотрю, другие прекрасно умеют)
« Последнее редактирование: Май 06, 2014, 11:56 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
k0p4
Гость
« Ответ #63 : Май 06, 2014, 12:14 »

Во-первых, код приведённый m_ax`ом весьма странный.
Давайте разберём по порядку и сравним мой код, и код Макса.

Итак,
1. Почему мы матчим не "-Y " и " +X " стринги, а отдельно "-Y", "+X" и пробелы? В формате файла четко указано что после (в случае +X еще и перед) выражением идут пробелы. Какой смысл их проверять? Если мы не смогли сматчить  "-Y " и " +X ", то значит формат уже не верный. Какова причина возврата стольких ошибок? Просто сделать спагетти? : )
Код:
    if (!str.startsWith(prefixY))
    {
        qDebug() << "1 ;(";
        return false;
    }
 
    int n = prefixY.size();
    if (str[n] != space)
    {
        qDebug() << "2 ;(";
        return false;
    }
 
    // Очень порадовала проверка : )
    if (++n == str.size())
    {
        qDebug() << "3 ;(";
        return false;
    }
 
    int m = str.indexOf(space, n);
    if (m == -1)
    {
        qDebug() << "4 ;(";
        return false;
    }

Заменяется на
Код:
 
        if (!line.startsWith("-Y "))
            continue;

2. Каюсь, забыл бул на toInt().
Код:
bool ok = false;
    y = str.mid(n, m-n).toInt(&ok);
    if (!ok)
    {
        qDebug() << "5 ;(";
        return false;
    }

3. Так же заменяется
Код:
    if (str[m] != space)
    {
        qDebug() << "6 ;(";
        return false;
    }
 
    n = str.indexOf(prefixX, ++m);
 
    if (n != m)
    {
        qDebug() << "7 ;(";
        return false;
    }
 
    n += prefixX.size();
 
    if (n == str.size())
    {
        qDebug() << "8 ;(";
        return false;
    }

На

Код:
       // Handle error.
        if ((posX = line.indexOf(" +X ")) == -1)
            continue;

4. Забыл бул, как и выше : )
5. Если на то пошло, и вы так дотошно проверяете несоответствие формата для парса в лоб, что бы сообщить конкретную позицию, то почему я не вижу ни одной такой же проверки в РегЕкспе.
6.
Цитировать
Это тот "простейший метод" сделать  это прогоняясь по строке. Обратите внимание на число проверок (необходимых), для того, что бы в итоге не получить полную чушь.
Полная чушь.
7.
Цитировать
И это только из предположения, что "скипперами" являются только одиночные пробелы! Если, например, в правилах (внезапно) появилось условие на неограниченность пробелов, или наличие табов, то придётся руками править весь приведённый код выше(
Как будут вести себя регекспы? Или вы сравниваете затраты на поддержку кода?
8.
Цитировать
Это по вашему проще, чем пару движениями изменить регулярку? Ну тогда, знаете..
Какбе, я ж уже писал Олду, что я целиком и полностью за регулярки, а еще лучше, спирит. Но конкретно для поставленной задачи ТСа лучше решения в лоб - нет. Я это аргументировал, провёл замеры и тд. Очень похоже на то, что вы пытаетесь запихнуть регулярки туда, где они совсем и не нужны, аргументируя это расширяемостью.
9.
Цитировать
Во-вторых, все эти вопли о производительности здесь лишены смысла.. Да, в данном случае, решение в лоб, работает быстрее.. Но.. Но не более чем в три раза.. Это даже не порядок величины! Стоит ли ради этого городить весь этот костыльный вариант?
Скажите, а вы когда нибудь писали под embedded? А сколько стоит повышение производительности крупных проектов хотя-бы на 10%? А если будет стоять задача распарсить огромные куски данных?
10.
Цитировать
Всё! Это решение гораздо более устойчивее к начальным условиям. Потребуется добавить что то сверх формата, то в RegExp это делается заменой только одной строки.. А что будет в "народном"варианте в лоб? Код как минимум увеличится в разы..
И не говорите мне, что сопровождать эту кашу будет легче..  Напротив(
Нет, ну если из "народной лапши" так же выпилить Ваши проверки - то сопровождать будет легче в разы.
11.
Цитировать
А если кто то так заботиться о обработке ошибок и т.п.. то boost::spirit предоставляет гибкие решения и этой проблемы.
Оставаясь на порядок более гибким, понятным и производительным решением..)
Вы целиком и полность правы.
12.
Цитировать
Лично с моей точки зрения, решение"построчного пробега" - это последнее, что пришло бы мне в голову( В общем случаее и в частности..   
Досадно : )

_OLEGator_, Вы наверняка работаете в команде до 5 человек, да? )

Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #64 : Май 06, 2014, 12:14 »

В чём проблема реализовать контроль над ошибками используя regex?
Проблема в желании низкоквалифицированных программистов найти оправдание своей не компетенции, для этого придумываются всяческие наивные доводы. Улыбающийся

А код какой стройный Улыбающийся
Код
C++ (Qt)
int x, y;
QString phone, mail;
static const QString prefixX = "+X";
static const QString prefixY = "-Y";
static const QString str_Phone = "Phone";
static const QString str_Mail = "Mail";
 
try {
ExpectWord(src, prefixX);
x = ExpectInt(src);
 
ExpectWord(src, prefixY);
y = ExpectInt(src);
 
ExpectWord(src, str_Phone);
phone = NextWord(src);
 
ExpectWord(src, str_Mail);
mail = NextWord(src);
}
catch (...) {
..
}

Для чего столько было программировать, можно же было просто написать так и все: Улыбающийся
Код
C++ (Qt)
bool super_parser( int &x, int &y, string &phone, string &email );
 

Вот и все решение. А то накодили там. Улыбающийся
Да еще исключения туда для чего-то добавили и это в Qt. А что с этим будет делать вахтерша баба Маша после ядерной войны? А? Улыбающийся
« Последнее редактирование: Май 06, 2014, 12:19 от Old » Записан
k0p4
Гость
« Ответ #65 : Май 06, 2014, 12:25 »

В чём проблема реализовать контроль над ошибками используя regex?
Проблема в желании низкоквалифицированных программистов найти оправдание своей не компетенции, для этого придумываются всяческие наивные доводы. Улыбающийся

А код какой стройный Улыбающийся
Код
C++ (Qt)
int x, y;
QString phone, mail;
static const QString prefixX = "+X";
static const QString prefixY = "-Y";
static const QString str_Phone = "Phone";
static const QString str_Mail = "Mail";
 
try {
ExpectWord(src, prefixX);
x = ExpectInt(src);
 
ExpectWord(src, prefixY);
y = ExpectInt(src);
 
ExpectWord(src, str_Phone);
phone = NextWord(src);
 
ExpectWord(src, str_Mail);
mail = NextWord(src);
}
catch (...) {
..
}

Для чего столько было программировать, можно же было просто написать так и все: Улыбающийся
Код
C++ (Qt)
bool super_parser( int &x, int &y, string &phone, string &email );
 

Вот и все решение. А то накодили там. Улыбающийся
Да еще исключения туда для чего-то добавили и это в Qt. А что с этим будет делать вахтерша баба Маша после ядерной войны? А? Улыбающийся


Похоже, что Вы меня не услышали : ) Вобщем, как и Макс. Вы постоянно отводите тему в сторону готовые решения против велосипедов. Очевидно, что лучше использовать готовые решения. И я, в частности, для общих случаев использую готовые решения (по мере возможности : ) ). В частных случаях лучше использовать велосипеды. Например, если стандарт файла уже принят и менятся не будет - лучше использовать решение в лоб. Так как его (с моей точки зрения, конечно же) будет легче поддерживать и оно будет производительней, чем готовое универсальное решение. Велосипед, заточенный под конкретную задачу будет всегда быстрей, чем готовое универсальное решение.
И не надо думать, что все кто не используют Ваши инструменты глупее Вас или просто низкоквалифицированные. Это заблуждение, ящитаю.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #66 : Май 06, 2014, 12:30 »

Похоже, что Вы меня не услышали : )
Нет-нет. Мой ответ адресован одному "профессионалу", который считает, что чем меньше программист знает, тем он круче. Улыбающийся
Не принимайте написанное на свой счет. Подмигивающий
« Последнее редактирование: Май 06, 2014, 12:40 от Old » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #67 : Май 06, 2014, 12:40 »

Вы постоянно отводите тему в сторону готовые решения против велосипедов.
Неправильно вы понимаете. Улыбающийся
Эта тема продолжение целой серии обсуждений, поэтому не стоит по моим ответам только в ней, судить о моем отношении к велосипедам.
Мы все постоянно пишем велосипеды, если бы были готовые решения на все, мы бы давно были не нужны.
Когда же по моему оправдан велосипед. Мы написали программу, запустили профайлер и поняли, что основные тормоза вызывают такие-то решения. Если для программы жизненно важно ускорение в этих местах, то я буду писать свой велосипед. Причем я вначале изучу эту область и посмотрю на другие решения, которые могут помочь в этом. До этого я не вижу смысла в велосипедах, особенно при работе в больших командах. Регулярки это практически стандарт, и другому программисту будет проще разобраться с ними, чем с сложным велосипедом другого (да еще и низкоквалифицированного) программиста.


И не надо думать, что все кто не используют Ваши инструменты глупее Вас или просто низкоквалифицированные.
Сейчас не идет речь о "Ваших" инструментах, идет разговор о том, что отвергаются любые готовые решения и предлагается писать свой велосипед. А причины этого высасываются из пальца: ожидание того, что какой-то инструмент с этим не справиться (хотя если почитать документацию на инструмент, то такие впечатления сразу исчезнут); сложность для всех в изучении какого-то инструмента (хотя любой программист С++ должен спокойно работать с boost, не говоря уже про std); разговоры о поддержке проекта в дальнейшем вахтершей бабой Машей (поэтому код нужно писать, что бы она его понимала) и других наивных причин. Улыбающийся
« Последнее редактирование: Май 06, 2014, 13:00 от Old » Записан
k0p4
Гость
« Ответ #68 : Май 06, 2014, 13:09 »

Old, понял, извиняюсь : )
Цитировать
о том, что отвергаются любые готовые решения и предлагается писать свой велосипед.
Я вовсе не отвергаю готовые решения. Наоборот, для большинства задач так и надо делать. Но ведь есть и частные случаи, где, как мне кажется, лучше велосипеды (ну вот, кажется мы поехали по кругу :Р) : ) Для частных случаев, когда всё полностью известно (формат), не предвидятся изменения и можно сделать быстрее (и как по мне, так более лёгкое в поддержке), чем готовое решение : )
Я пытаюсь донести мысль о частных случаях, для которых общее решение избыточно. Например, как случай с задачей ТСа (с чего и начался спор).
Но и Вас я тоже понял, легче поддерживать (для хороших спецов, как правило), больше гибкость. Удобство готовых решений, за которое, как правило, приходится платить скоростью.
« Последнее редактирование: Май 06, 2014, 13:12 от k0p4 » Записан
Bepec
Гость
« Ответ #69 : Май 06, 2014, 13:20 »

Это несколько из http://ru.wikipedia.org/wiki/%D0%90%D0%BD%D1%82%D0%B8%D0%BF%D0%B0%D1%82%D1%82%D0%B5%D1%80%D0%BD.

Собственно тут нужна золотая середина.

К тому же изречение что решение в лоб - "спагетти код", в корне неверно. Спагетти код это запутанный код, а в приведённых кодах выполнение идёт последовательно и даже последний человек. еле умеющий читать может назвать порядок выполнения Веселый
Записан
_OLEGator_
Гость
« Ответ #70 : Май 06, 2014, 13:30 »

_OLEGator_, Вы наверняка работаете в команде до 5 человек, да? )

Не принимайте мои комментарии на свой счет.
Это было сказано в контексте, что регулярки это сложно, кто-то может их не знать.

В конечном счете выбор инструмента производится исходя из поставленной задачи.
Если нужна производительность и регулярки не подходят - то да, ищется другое решение.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #71 : Май 06, 2014, 13:38 »

to k0p4

Долго отвечать на все ваши пункты, отвечу на некоторые ключевые..

Цитировать
Как будут вести себя регекспы? Или вы сравниваете затраты на поддержку кода?
Регексп изменится минимально (одно движение), в отличии от решения в лоб..
Производительность от этого также не пострадает)

Цитировать
Но конкретно для поставленной задачи ТСа лучше решения в лоб - нет. Я это аргументировал, провёл замеры и тд. Очень похоже на то, что вы пытаетесь запихнуть регулярки туда, где они совсем и не нужны, аргументируя это расширяемостью.
Это глупости) Если для вас единственный критерий - это производительность, то замечу, что вариант на xpressive раза в два быстрее)

Цитировать
Скажите, а вы когда нибудь писали под embedded? А сколько стоит повышение производительности крупных проектов хотя-бы на 10%? А если будет стоять задача распарсить огромные куски данных?
Под embedded не писал, но приходится иногда писать числодробилки, где производительность - на первом месте)

Привожу маленький проектик с тремя реализациями парсера: xpressive, QRegExp и вариант ТС
Результаты трёх замеров такие:
Код
Bash
test Veres Manner, time (ms) :  1830
 
test QRegEx Manner, time (ms) :  4501
 
test XPressive Manner, time (ms) :  1246
 
 
------------------------------------------------------------------------
 
test Veres Manner, time (ms) :  1715
 
test QRegEx Manner, time (ms) :  4512
 
test XPressive Manner, time (ms) :  1263
 
 
------------------------------------------------------------------------
 
test Veres Manner, time (ms) :  1819
 
test QRegEx Manner, time (ms) :  4504
 
test XPressive Manner, time (ms) :  1298
 
 

Вод сами исходники:
Код
C++ (Qt)
#include <iostream>
#include <fstream>
#include <sstream>
#include <chrono>
#include <list>
 
 
#include <boost/xpressive/xpressive.hpp>
 
 
#include <QString>
#include <QDebug>
#include <QFile>
#include <QTextStream>
#include <QVector>
#include <QPoint>
#include <QRegExp>
#include <QList>
 
bool extractData(const QString & str, int & x, int & y)
{
   static const QString prefixX = "+X";
   static const QString prefixY = "-Y";
   static const QChar space = ' ';
 
 
   if (!str.startsWith(prefixY))
   {
       qDebug() << "1 ;(";
       return false;
   }
 
   int n = prefixY.size();
   if (str[n] != space)
   {
       qDebug() << "2 ;(";
       return false;
   }
 
   if (++n == str.size())
   {
       qDebug() << "3 ;(";
       return false;
   }
 
   int m = str.indexOf(space, n);
   if (m == -1)
   {
       qDebug() << "4 ;(";
       return false;
   }
 
   bool ok = false;
   y = str.mid(n, m-n).toInt(&ok);
   if (!ok)
   {
       qDebug() << "5 ;(";
       return false;
   }
 
   if (str[m] != space)
   {
       qDebug() << "6 ;(";
       return false;
   }
 
   n = str.indexOf(prefixX, ++m);
 
   if (n != m)
   {
       qDebug() << "7 ;(";
       return false;
   }
 
   n += prefixX.size();
 
   if (n == str.size())
   {
       qDebug() << "8 ;(";
       return false;
   }
 
   x = str.mid(++n, str.size()).toInt(&ok);
 
   if (!ok)
   {
       qDebug() << "9 ;(";
       return false;
   }
 
   return true;
 
}
 
template <class Container>
void readData_VeresManner(const QString & fileName, Container & v)
{
   QFile file(fileName);
   if (!file.open(QIODevice::ReadOnly))
   {
       qDebug() << "Error opening file";
       return;
   }
 
   QTextStream stream(&file);
 
   while (!stream.atEnd())
   {
       QString str = stream.readLine();
       int x, y;
       if (extractData(str, x, y))
       {
           v.append(QPoint(x, y));
       }
   }
}
 
template <class Container>
void readData_QRegExManner(const QString & fileName, Container & v)
{
   QFile file(fileName);
   if (!file.open(QIODevice::ReadOnly))
   {
       qDebug() << "Error opening file";
       return;
   }
 
   QTextStream stream(&file);
 
   QString str = stream.readAll();
 
   QRegExp regex("\\-Y (\\d+) \\+X (\\d+)");
   regex.setMinimal(true);
 
   int pos = 0;
   while ((pos = regex.indexIn(str, pos)) != -1)
   {
       int y = regex.cap(1).toInt();
       int x = regex.cap(2).toInt();
       v.append(QPoint(x, y));
       pos += regex.matchedLength();
   }
 
}
 
template <class Container>
void readData_XPressiveManner(const char * fileName, Container & v)
{
   using namespace boost::xpressive;
 
   std::ifstream in(fileName);
   if (!in.is_open())
   {
       qDebug() << "Error opening file";
       return;
   }
 
   std::ostringstream oss;
   oss << in.rdbuf();
 
   std::string buff = oss.str();
 
   sregex expr = as_xpr("-Y") >> +space >> (s1 = +_d) >> +space >> as_xpr("+X") >> +space >> (s2 = +_d);
 
   sregex_iterator it(buff.cbegin(), buff.cend(), expr);
   sregex_iterator end;
 
   for (; it != end; ++it)
   {
       int x = std::stoi((*it)[2]);
       int y = std::stoi((*it)[1]);
       v.push_back(std::pair<int, int>(x, y));
   }
}
 
 
void generateData(const QString & fileName, int size)
{
   QFile file(fileName);
   if (!file.open(QIODevice::WriteOnly))
   {
       qDebug() << "Error opening file";
       return;
   }
 
   QTextStream stream(&file);
 
   static const QString prefixX = "+X";
   static const QString prefixY = "-Y";
   static const QChar space = ' ';
   static const int max = 10000;
 
   for (int i = 0; i  < size; ++i)
   {
       int x = qrand() % max;
       int y = qrand() % max;
       stream << prefixY << space << y << space << prefixX << space << x << endl;
   }
}
 
 
 
int main()
{
   static const int dataSize = 1000000;
 
   QString fileName = "test_data.txt";
   generateData(fileName, dataSize);
 
   QList<QPoint> v1;
   QList<QPoint> v2;
 
   auto start = std::chrono::high_resolution_clock::now();
   readData_VeresManner(fileName, v1);
   auto stop = std::chrono::high_resolution_clock::now();
   auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(stop-start).count();
 
   qDebug() << "test Veres Manner, time (ms) : " << duration;
   qDebug() << v1.size();
 
 
   start = std::chrono::high_resolution_clock::now();
   readData_QRegExManner(fileName, v2);
   stop = std::chrono::high_resolution_clock::now();
   duration = std::chrono::duration_cast<std::chrono::milliseconds>(stop-start).count();
 
   qDebug() << "test QRegEx Manner, time (ms) : " << duration;
   qDebug() << v2.size();
 
   std::list<std::pair<int, int>> v3;
   start = std::chrono::high_resolution_clock::now();
   readData_XPressiveManner(fileName.toStdString().c_str(), v3);
   stop = std::chrono::high_resolution_clock::now();
   duration = std::chrono::duration_cast<std::chrono::milliseconds>(stop-start).count();
 
   qDebug() << "test XPressive Manner, time (ms) : " << duration;
   qDebug() << v3.size();
 
 
 
   return 0;
}
 
 

И того, по удобству, скорости, гибкости xpressive здесь весьма хорош) Если в дальнейшим формат слегка измениться (а хорошие архитектурные решения должны быть устойчивы к возможным начальным малым изменениям) с регекспом мы потратим минимум усилий..
В коде ТС придётся разбираться, а возможно и переписывать( (давайте представим, что код попал к другому программисту) чтобы среагировать на эти малые изменения.. И не надо говорить, что формат жёстко задан и т.д. и т.п..



  
  

  
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
k0p4
Гость
« Ответ #72 : Май 06, 2014, 13:51 »

m_ax,
Експрессив идеально зашёл. Как по мне - вне конкуренции. : )
По остальным пунктам можно спорить бесконечно.
А так же стоит вспомнить первый пост:
Цитировать
Вопрос: как это сделать средствами Qt не прибегая к sscanf и желательно без регулярных выражений?

_OLEGator_, Извините : )
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #73 : Май 07, 2014, 09:50 »

Сейчас не идет речь о "Ваших" инструментах, идет разговор о том, что отвергаются любые готовые решения и предлагается писать свой велосипед. А причины этого высасываются из пальца: ожидание того, что какой-то инструмент с этим не справиться (хотя если почитать документацию на инструмент, то такие впечатления сразу исчезнут); сложность для всех в изучении какого-то инструмента (хотя любой программист С++ должен спокойно работать с boost, не говоря уже про std); разговоры о поддержке проекта в дальнейшем вахтершей бабой Машей (поэтому код нужно писать, что бы она его понимала) и других наивных причин. Улыбающийся
Вернемся к первоначальному решению ТС. Чем оно плохо? Да ничем. Какое время требуется для его реализации? Ну минут 10-15 (с расписыванием всех ошибок). Допустим (всего лишь допустим) не устраивает скорость - и это можно легко решить. Т.е. "цена вопроса" копеечная.

И тут знатоки впадают в справедливый гнев Улыбающийся Низкоквалифицированный непрофессионал! (знатоки редко умеют вести себя прилично). Оказывается надо было как-то так
bool super_parser( int &x, int &y, string &phone, string &email );
sregex expr = as_xpr("-Y") >> +space >> (s1 = +_d) >> +space >> as_xpr("+X") >> +space >> (s2 = +_d);
Так вот, на мой взгляд, это совершенно непрофессионально. Если вопрос решается за 15 мин - его надо просто решать, а не тратить день на чтение/изучение. Да, может быть что изучив/почитав можно сделать за минуту  (и даже меньше), но с точки зрения текущей конкретной задачи это не оправдывает себя. Разница в десяток-другой строк не является каким-то "показателем класса", здесь любое решение приемлемо если оно реализовано грамотно и аккуратно. Да-да, часто любитель знает гораздо больше профессионала  Улыбающийся

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

Записан
_OLEGator_
Гость
« Ответ #74 : Май 07, 2014, 10:34 »

Если вопрос решается за 15 мин - его надо просто решать, а не тратить день на чтение/изучение. Да, может быть что изучив/почитав можно сделать за минуту  (и даже меньше), но с точки зрения текущей конкретной задачи это не оправдывает себя.

Да-да, часто любитель знает гораздо больше профессионала

"оправдать выученное"

Толсто троллишь. Не профессионально.
Записан
Страниц: 1 ... 3 4 [5] 6 7 8   Вверх
  Печать  
 
Перейти в:  


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