Re[7]: Приходилось ли вам использовать goto?
От: Кодёнок  
Дата: 31.03.06 12:38
Оценка:
Здравствуйте, eao197, Вы писали:

E>struct ExpressionCheckerAndSetter {

E> SomeSettings & m_setting;
E> ExpressionChecker( SomeSettings & setting ) : m_setting( setting ) {}

E>Кстати, если не ошибаюсь, ExpressionCheckerAndSetter можно объявить и внутри самой функции.


Классический шаблон эмуляции замыканий в С++? Я не спорю, что есть 33 разных способа избавиться от goto. Меня интересует способы, которые не хуже — не больше кода, или чуть больше, но понятней.

Вот Сергею Губанову удалось сделать код короче...
Re[8]: Приходилось ли вам использовать goto?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 31.03.06 12:49
Оценка:
Здравствуйте, Кодёнок, Вы писали:

Кё>Классический шаблон эмуляции замыканий в С++?


Очень похоже на очередную попытку сказать "Нет! Это я ненавижу C++ больше всех!!!"

Ке> Я не спорю, что есть 33 разных способа избавиться от goto. Меня интересует способы, которые не хуже — не больше кода, или чуть больше, но понятней.


Может объяснишь, чем мой код хуже, особенно с учетом вот этого:

А так приходится на уровень выше, туда, где эта вспомогательная функция вообще никому не нужна Первая проблема, это то, что ей придётся дать конкретное осмысленное имя — в контексте функции редактирования "check" идеально подходит, в контексте интерфейса класса — конфликтует с уже имеющейся или непонятно что означает. Вторая проблема в том, что унести её в private — значит, сильно удалить от основной, в public она не нужна, а сделать private только её (как в C# — private bool check(){}) в С++ нельзя.




SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[9]: Приходилось ли вам использовать goto?
От: Кодёнок  
Дата: 31.03.06 12:56
Оценка:
Здравствуйте, eao197, Вы писали:

E>Может объяснишь, чем мой код хуже, особенно с учетом вот этого:

Кё>А так приходится на уровень выше, туда, где эта вспомогательная функция вообще никому не нужна Первая проблема, это то, что ей придётся дать конкретное осмысленное имя — в контексте функции редактирования "check" идеально подходит, в контексте интерфейса класса — конфликтует с уже имеющейся или непонятно что означает. Вторая проблема в том, что унести её в private — значит, сильно удалить от основной, в public она не нужна, а сделать private только её (как в C# — private bool check(){}) в С++ нельзя.

E>


Не хуже... В оригинале, всё что нужно сделать, делается именно в том месте, где оно необходимо. У тебя тоже, но длиннее, зато goto нет. Что лучше — вопрос споров я выбираю то, что короче.
Re[6]: Приходилось ли вам использовать goto?
От: Kluev  
Дата: 31.03.06 13:10
Оценка:
Здравствуйте, Кодёнок, Вы писали:


Кё>Предлагаю поупражняться:


    CString expr = m_settings.expr;
    if (IDOK != DataEditorDialog(expr).DoModal()) return 0;
    
    for (int i = 0; i < m_settings.rules.size(); ++i)
    {
        if (!m_settings.rules[i].active || m_settings.rules[i].Check(expr))
            continue;
        MessageBox("Syntax error", 0, 0);
        i = -1; // reset loop
        if (IDOK != DataEditorDialog(expr).DoModal()) return 0;
    }
    m_settings.expr = expr;
Re[10]: Приходилось ли вам использовать goto?
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 31.03.06 13:20
Оценка:
Здравствуйте, Кодёнок, Вы писали:

Кё>Не хуже... В оригинале, всё что нужно сделать, делается именно в том месте, где оно необходимо. У тебя тоже, но длиннее, зато goto нет. Что лучше — вопрос споров я выбираю то, что короче.


Ну уж раз мосье такой любитель смешивать разную функциональность в одном месте , то:
CString expr = m_settings.expr;
        size_t i, i_max = m_settings.rules.size();
        do
        {
            if (IDOK != DataEditorDialog(expr).DoModal()) return 0;
            
            for ( i = 0; i != i_max ; ++i)
            {
                if (m_settings.rules[i].active && !m_settings.rules[i].Check(expr))
                {
                    MessageBox("Syntax error", 0, 0);
                    break;
                }
            }
        } while( i != i_max );
        m_settings.expr = expr;


Практически твой вариант.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[6]: Приходилось ли вам использовать goto?
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 31.03.06 13:28
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Некоторые (не будем показывать пальцами) тут вообще считают, что

C>break/continue не нужны

Ну, насчет break'а вполне можно согласиться. Я его тоже слегка недолюбливаю (чисто иррационально) и частенько пользуюсь конструкцией а-ля:

for (int i = 0; i < 10; ++i)
{
...
    if (some_rare_contition)
    {
        i = 10;        // неявный break :)
    }
    else {
        ...
    }
}
[ posted via RSDN@Home 1.1.4 stable SR1 r568, accompanied by silence ]
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Re[7]: Приходилось ли вам использовать goto?
От: Кодёнок  
Дата: 31.03.06 13:29
Оценка: :)
Здравствуйте, Kluev, Вы писали:

А интересная мысль

    CString expr = m_settings.expr;
    for (int i = -1; i < m_settings.rules.size(); ++i)
    {
        if (i < 0)
        {
           if (IDOK != DataEditorDialog(expr).DoModal()) return 0;
        }
        else
        {
          if (m_settings.rules[i].active && !m_settings.rules[i].Check(expr))
          {
            MessageBox("Syntax error", 0, 0);
            i = -1; // reset loop
          }
        }
    }
    m_settings.expr = expr;
Re[8]: Приходилось ли вам использовать goto?
От: Kluev  
Дата: 31.03.06 13:32
Оценка: 1 (1)
Здравствуйте, Кодёнок, Вы писали:

Кё>Здравствуйте, Kluev, Вы писали:


Кё>А интересная мысль


Кё>
Кё>    CString expr = m_settings.expr;
Кё>    for (int i = -1; i < m_settings.rules.size(); ++i)
Кё>    {
Кё>        if (i < 0)
Кё>        {
Кё>           if (IDOK != DataEditorDialog(expr).DoModal()) return 0;
Кё>        }
Кё>        else
Кё>        {
Кё>          if (m_settings.rules[i].active && !m_settings.rules[i].Check(expr))
Кё>          {
Кё>            MessageBox("Syntax error", 0, 0);
Кё>            i = -2; // reset loop to -1
Кё>          }
Кё>        }
Кё>    }
Кё>    m_settings.expr = expr;
Кё>
Re[4]: Приходилось ли вам использовать goto?
От: IT Россия linq2db.com
Дата: 31.03.06 13:36
Оценка: +1
Здравствуйте, Нахлобуч, Вы писали:

СГ>>А Вы, пожалуйста, приведите какой-нибудь (канонический) пример в котором устранение goto с неизбежностью повлечёт введение лишнего булевского флага(ов).


Н>Выйти из двух циклов разом?


Не надо опять начинать, в прошлый раз всё закончилось вот этим.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[7]: Приходилось ли вам использовать goto?
От: Kemsky  
Дата: 31.03.06 13:39
Оценка: +3
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Ну, насчет break'а вполне можно согласиться. Я его тоже слегка недолюбливаю (чисто иррационально) и частенько пользуюсь конструкцией а-ля:


SDB>
SDB>for (int i = 0; i < 10; ++i)
SDB>{
SDB>...
SDB>    if (some_rare_contition)
SDB>    {
SDB>        i = 10;        // неявный break :)
SDB>    }
SDB>    else {
SDB>        ...
SDB>    }
SDB>}
SDB>


Один из аргументов против goto — то, что код с goto менее понятен, чем без. ИМХО в данном примере понятность по сравнению с break несколько уменьшается.
Re[9]: Приходилось ли вам использовать goto?
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 31.03.06 13:41
Оценка: :)
> i = -2; // reset loop to -1

Извращенцы
Re[8]: Приходилось ли вам использовать goto?
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 31.03.06 13:46
Оценка:
Здравствуйте, Kemsky, Вы писали:

K>ИМХО в данном примере понятность по сравнению с break несколько уменьшается.


Ну, во-первых, я в таких местах всегда пишу комментарий типа "exit the loop", а во-вторых — как я писал это чисто иррациональное, а не мотивированное большей читабельностью кода. Ну вот заскок у меня такой. Просто иногда бывает "не в тему" заводить очередную булеву переменную, значение которой проверяется наряду с "основным" условием цикла.

P.S.
Посто мой был собственно в поддержку "некоторых", на которых ссылался Cyberax.
[ posted via RSDN@Home 1.1.4 stable SR1 r568, accompanied by silence ]
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Re[10]: Приходилось ли вам использовать goto?
От: Kluev  
Дата: 31.03.06 13:55
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

>> i = -2; // reset loop to -1


СГ>Извращенцы


Спокойствие, брат
Спешал фо Ю:
    CString expr = m_settings.expr;
    if (IDOK != DataEditorDialog(expr).DoModal()) return 0;
    
    for (int i = 0; i < m_settings.rules.size(); )
    {
        if (!m_settings.rules[i].active || m_settings.rules[i].Check(expr))
        {
            ++i;
            continue;
        }
        MessageBox("Syntax error", 0, 0);
      i = 0; // reset loop to zero
        if (IDOK != DataEditorDialog(expr).DoModal()) return 0;
    }
    m_settings.expr = expr;
Re: Приходилось ли вам использовать goto?
От: yurafitt  
Дата: 31.03.06 16:48
Оценка:
Здравствуйте, zzzale, Вы писали:

Z>Я имею в виду случаи когда ДЕЙСТВИТЕЛЬНО была необходимость применять этот оператор (желательно с примером и описанием ПО).

Z>Интересуют прежде всего языки С++,С#.
Мне нет, а вот в примерах поставляемых с SDK DirectX 7.0 во многих местатх встречал использование goto
Re[7]: Приходилось ли вам использовать goto?
От: kan_izh Великобритания  
Дата: 31.03.06 17:46
Оценка:
SchweinDeBurg wrote:

> Ну, насчет break'а вполне можно согласиться. Я его тоже слегка

> недолюбливаю (чисто иррационально) и частенько пользуюсь конструкцией а-ля:
>
> for (int i = 0; i < 10; ++i)
> {
> ...
> if (/some_rare_contition/)
> {
> i = 10; // неявный break
> }
> else {
> ...
> }
> }
Ну это довольно редко встречается, когда по числам итерируется. А в таком случае как? Или для разных случаев по-разному
из цикла выходить?? Нет уж, увольте.
for(map<???>::const_iterator i=m.begin(); i!=m.end(); ++i)
{
    if(needskip1(*i)) continue;
    if(needskip2(*i)) continue;
    if(needskip3(*i)) continue;
    makesomething(*i);
    if(blah(*i)) break;
    makeotherthing(*i);
}

или

for(xmlNodePtr c = parent->children; c; c = c->nextSibling)
{
    if(c->type == NODE_TEXT) continue;
    if(c->namespace != myNamespace) continue;
...
}

В таком коде такой неявный брэйк нельзя сделать. А замена несколько continue будет порождать глубокую вложенность if.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[6]: Приходилось ли вам использовать goto?
От: kan_izh Великобритания  
Дата: 31.03.06 18:09
Оценка:
Кодёнок wrote:

> Смысл — отредактировать строку с помощью диалога-редактора, но оно

> должно пройти все правила. Если введено неправильная строка, диалог
> редактирования должен остаться. Вариантов можно придумать много, вот и
> давайте выберем наилучший
Я подобные вещи обычно так пишу.
И сразу отсюда становится видно, что hasErrors легко выносится в функцию. И я обычно выношу, особенно если подобный код
встречается более одного раза.
while(1)
{
    if (IDOK != DataEditorDialog(expr).DoModal()) return 0;

    bool hasErrors = false;
    for (size_t i = 0; i < m_settings.rules.size(); ++i)
    {
        if (m_settings.rules[i].active && !m_settings.rules[i].Check(expr))
        {
            hasErrors = true;
            break;
        }
    }

    if(hasErrors)
        MessageBox("Syntax error", 0, 0);
    else
        break;
}



А ещё можно написать предикат проверки правила воспользоватья find из stl, но это уже неинтересно.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[8]: Приходилось ли вам использовать goto?
От: McSeem2 США http://www.antigrain.com
Дата: 31.03.06 18:14
Оценка: +3 :)))
Здравствуйте, Kemsky, Вы писали:

K>Один из аргументов против goto — то, что код с goto менее понятен, чем без. ИМХО в данном примере понятность по сравнению с break несколько уменьшается.


Я бы сказал, что использование goto в стиле Фортрана-4 — это маразм. Однако, полный запрет goto — это тоже маразм. Народу не нужен нездоровый фанатизм. Народу нужен здоровый фанатизм.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[6]: Приходилось ли вам использовать goto?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 31.03.06 21:17
Оценка:
Здравствуйте, Кодёнок, Вы писали:

Кё>Предлагаю поупражняться:


string expr = _settings.Expr;
using (DataEditorDialog ded = new DataEditorDialog())
{
    ded.Closing += (sender, e) =>
    {
        if (DialogResult == DialogResult.OK)
        {
            foreach (Rule r in _settings.Rules)
                if (r.Active && !r.Check(expr))
                {
                    e.Cancel = true;
                    return;
                }
            _settings.Expr = ded.Expr;
        }
    }
    ded.ShowDialog();    
}


Пойдет?
... << RSDN@Home 1.2.0 alpha rev. 646 on Windows XP 5.1.2600.131072>>
AVK Blog
Re[7]: Приходилось ли вам использовать goto?
От: Ziaw Россия  
Дата: 01.04.06 05:26
Оценка: +1
AVK>
AVK>string expr = _settings.Expr;
AVK>using (DataEditorDialog ded = new DataEditorDialog())
AVK>{
AVK>    ded.Closing += (sender, e) =>
AVK>    {
AVK>        if (DialogResult == DialogResult.OK)
AVK>        {
AVK>            foreach (Rule r in _settings.Rules)
AVK>                if (r.Active && !r.Check(expr))
AVK>                {
AVK>                    e.Cancel = true;
AVK>                    return;
AVK>                }
AVK>            _settings.Expr = ded.Expr;
AVK>        }
AVK>    }
AVK>    ded.ShowDialog();    
AVK>}
AVK>


Как раз хотел написать, что плохой код и плохое юзабилити часто ходят рядом.
В предыдущем примере налицо неважное юзабилити: диалог гаснет, вываливается
синтакс еррор, потом тут же как черт из табакерки вываливается пустой новый диалог "попробуй-ка еще раз, дружок". Даже не глядя на код становится понятно, что проверку надо делать не закрывая диалог ввода. Отличное решение, легко дополняется диагностикой проблемы, но даже без нее введенная строка видна и можно самому локализовать ее.
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Re: Приходилось ли вам использовать goto?
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.04.06 00:45
Оценка: +1
Здравствуйте, zzzale, Вы писали:

Z>Я имею в виду случаи когда ДЕЙСТВИТЕЛЬНО была необходимость применять этот оператор (желательно с примером и описанием ПО).

Z>Интересуют прежде всего языки С++,С#.

А болкк интеллектуальных вопросов не нашлось?

Или новое поколени РСДН-еров не умеет пользоваться поиском?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.