Здравствуйте, eao197, Вы писали:
E>struct ExpressionCheckerAndSetter { E> SomeSettings & m_setting; E> ExpressionChecker( SomeSettings & setting ) : m_setting( setting ) {}
E>Кстати, если не ошибаюсь, ExpressionCheckerAndSetter можно объявить и внутри самой функции.
Классический шаблон эмуляции замыканий в С++? Я не спорю, что есть 33 разных способа избавиться от goto. Меня интересует способы, которые не хуже — не больше кода, или чуть больше, но понятней.
Здравствуйте, Кодёнок, Вы писали:
Кё>Классический шаблон эмуляции замыканий в С++?
Очень похоже на очередную попытку сказать "Нет! Это я ненавижу C++ больше всех!!!"
Ке> Я не спорю, что есть 33 разных способа избавиться от goto. Меня интересует способы, которые не хуже — не больше кода, или чуть больше, но понятней.
Может объяснишь, чем мой код хуже, особенно с учетом вот этого:
А так приходится на уровень выше, туда, где эта вспомогательная функция вообще никому не нужна Первая проблема, это то, что ей придётся дать конкретное осмысленное имя — в контексте функции редактирования "check" идеально подходит, в контексте интерфейса класса — конфликтует с уже имеющейся или непонятно что означает. Вторая проблема в том, что унести её в private — значит, сильно удалить от основной, в public она не нужна, а сделать private только её (как в C# — private bool check(){}) в С++ нельзя.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Может объяснишь, чем мой код хуже, особенно с учетом вот этого: Кё>А так приходится на уровень выше, туда, где эта вспомогательная функция вообще никому не нужна Первая проблема, это то, что ей придётся дать конкретное осмысленное имя — в контексте функции редактирования "check" идеально подходит, в контексте интерфейса класса — конфликтует с уже имеющейся или непонятно что означает. Вторая проблема в том, что унести её в private — значит, сильно удалить от основной, в public она не нужна, а сделать private только её (как в C# — private bool check(){}) в С++ нельзя.
E>
Не хуже... В оригинале, всё что нужно сделать, делается именно в том месте, где оно необходимо. У тебя тоже, но длиннее, зато goto нет. Что лучше — вопрос споров я выбираю то, что короче.
Здравствуйте, Кодёнок, Вы писали:
Кё>Не хуже... В оригинале, всё что нужно сделать, делается именно в том месте, где оно необходимо. У тебя тоже, но длиннее, зато 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++.
Здравствуйте, Нахлобуч, Вы писали:
СГ>>А Вы, пожалуйста, приведите какой-нибудь (канонический) пример в котором устранение goto с неизбежностью повлечёт введение лишнего булевского флага(ов).
Н>Выйти из двух циклов разом?
Не надо опять начинать, в прошлый раз всё закончилось вот этим.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, 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 несколько уменьшается.
Здравствуйте, Kemsky, Вы писали:
K>ИМХО в данном примере понятность по сравнению с break несколько уменьшается.
Ну, во-первых, я в таких местах всегда пишу комментарий типа "exit the loop", а во-вторых — как я писал это чисто иррациональное, а не мотивированное большей читабельностью кода. Ну вот заскок у меня такой. Просто иногда бывает "не в тему" заводить очередную булеву переменную, значение которой проверяется наряду с "основным" условием цикла.
P.S.
Посто мой был собственно в поддержку "некоторых", на которых ссылался Cyberax.
[ posted via RSDN@Home 1.1.4 stable SR1 r568, accompanied by silence ]
Здравствуйте, zzzale, Вы писали:
Z>Я имею в виду случаи когда ДЕЙСТВИТЕЛЬНО была необходимость применять этот оператор (желательно с примером и описанием ПО). Z>Интересуют прежде всего языки С++,С#.
Мне нет, а вот в примерах поставляемых с SDK DirectX 7.0 во многих местатх встречал использование goto
SchweinDeBurg wrote:
> Ну, насчет break'а вполне можно согласиться. Я его тоже слегка > недолюбливаю (чисто иррационально) и частенько пользуюсь конструкцией а-ля: > > for (int i = 0; i < 10; ++i) > { > ... > if (/some_rare_contition/) > { > i = 10; // неявный break > } > else { > ... > } > }
Ну это довольно редко встречается, когда по числам итерируется. А в таком случае как? Или для разных случаев по-разному
из цикла выходить?? Нет уж, увольте.
Кодёнок 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
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, Kemsky, Вы писали:
K>Один из аргументов против goto — то, что код с goto менее понятен, чем без. ИМХО в данном примере понятность по сравнению с break несколько уменьшается.
Я бы сказал, что использование goto в стиле Фортрана-4 — это маразм. Однако, полный запрет goto — это тоже маразм. Народу не нужен нездоровый фанатизм. Народу нужен здоровый фанатизм.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Как раз хотел написать, что плохой код и плохое юзабилити часто ходят рядом.
В предыдущем примере налицо неважное юзабилити: диалог гаснет, вываливается
синтакс еррор, потом тут же как черт из табакерки вываливается пустой новый диалог "попробуй-ка еще раз, дружок". Даже не глядя на код становится понятно, что проверку надо делать не закрывая диалог ввода. Отличное решение, легко дополняется диагностикой проблемы, но даже без нее введенная строка видна и можно самому локализовать ее.
Здравствуйте, zzzale, Вы писали:
Z>Я имею в виду случаи когда ДЕЙСТВИТЕЛЬНО была необходимость применять этот оператор (желательно с примером и описанием ПО). Z>Интересуют прежде всего языки С++,С#.
А болкк интеллектуальных вопросов не нашлось?
Или новое поколени РСДН-еров не умеет пользоваться поиском?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.