Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, srggal, Вы писали:
S>> S>>Сколько return должно быть в функции? Один или несколько ? S>>
СГ>А что здесь есть кто-то утверждающий полезность единственности точки выхода из процедуры?
Ну кто-то утверждающий бесполезность exception-ов же нашелся
А вообще-то множественные точки выхода — это оверхед + мешает некоторым приемам нормально работать.
Здравствуйте, Сергей Губанов, Вы писали:
S>> S>>Сколько return должно быть в функции? Один или несколько ? S>>
СГ>А что здесь есть кто-то утверждающий полезность единственности точки выхода из процедуры?
Речь идет о том, что
полезность единственности точки выхода из процедуры
Впрос еще более философский чем принятие/непринятие исключений
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Необычно то, что: СГ>1) Zero-overhead;
это маркетинг булшит. Никаким зеро там и не пахнет. Во-первых, для работы используются метаданные, которые конечно зеро по сравнению с "обычным обероном", т.к. встроены намертво, но вовсе не зеро по сравнению с полным отсутствием метаданных. Во-вторых, приведенные цифры по скорости раскрутки стека мягко говоря, далеки от зеро. Интуитивно мне кажется, что легендарно медленная раскрутка в плюсах порвет этот код как тузик грелку — потому что reflection да еще и с анализом стека на халяву не дается. СГ>2) не требуется вносить изменения в синтаксис языка Оберон.
Это да. Удачное совпадение.
Кстати, нельзя ли поподробнее рассказать о том, каким именно способом эта библиотека подправляет stack pointer? Это основная фича данной техники, которая, к слову, никакого отношения к метапрограммированию не имеет — скорее к хакерству, а стало быть, под большим вопросом в средах, ориентированных на надежность.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sergey J. A., Вы писали:
SJA>Не совсем понял, system это что ? Операционная стистема ? Значит ли это, что операционная система должна знать о каждой библиотечной схеме исключений, что-бы вызвать соответствующий Rise ?
Имеется в виду run-time system. Скажем, run-time system-а языка Java или run-time system-а .Net или run-time system-а Oberon... Run-time system может работать как поверх операционной системы так и наоборот.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, srggal, Вы писали:
S>> S>>Сколько return должно быть в функции? Один или несколько ? S>>
СГ>А что здесь есть кто-то утверждающий полезность единственности точки выхода из процедуры?
Ничего не хочу сказать ни про кого плохого, но я возьмусь утверждать, что несколько точек выхода — это хуже, чем один.
Во всех случаях, когда этого можно избежать.
Здравствуйте, Сергей Губанов, Вы писали:
P>>Тогда вопрос: сколько процентов головного мозга приходится напрягать физику-теоретику в повседневной деятельности? В каком угодно смысле. Просто для сравнения.
СГ> кандидату: 100% от нормы обычного человека, доктору: 500% — 1000% от нормы обычного человека академику, ну скажем, 20'000% от нормы....
Отлично. А сколько программисту от нормы обычного человека? А, кстати, обычному человеку?
Здравствуйте, Сергей Губанов, Вы писали:
SJA>>Не совсем понял, system это что ? Операционная стистема ? Значит ли это, что операционная система должна знать о каждой библиотечной схеме исключений, что-бы вызвать соответствующий Rise ?
СГ>Имеется в виду run-time system. Скажем, run-time system-а языка Java или run-time system-а .Net или run-time system-а Oberon... Run-time system может работать как поверх операционной системы так и наоборот.
Ну значит обработка исключений должна быть встроена в рантайм (чтоб он знал как транслировать системные исключения), не в отдельную библиотеку ? Я так понял ?
S>Дык и зачем сразу использовать исключения ???? S>Все гараздо проще
[поскипано]
S>И тогда все свалится в каком-то другом месте, неважно в каком потому как информация о месте и характере ошибки не важна Автору топика.
S>Кстати, подобный подход, исходя из предпосылок ГОРАЗДО эффективней исключений, функция без них будет работать быстрей и что немаловажно, в 98% случаев — правильно.
S>
Это тоже мысля. Просто у меня метод execute должон был возвращать код ошибки (кстати, в приведенном коде у меня ошибка — возвращается не код, а true/false ) если что не так — требование общего интерфейса iqCommand.
Здравствуйте, Sergey J. A., Вы писали:
SJA>Ну значит обработка исключений должна быть встроена в рантайм (чтоб он знал как транслировать системные исключения), не в отдельную библиотеку ? Я так понял ?
Предлагаемая в статье библиотека ловли исключений расширяет среду времени исполнения. Так что, новая (расширенная) среда исполнения теперь умеет вызывать пользовательские обработчики исключений. Вообще, среда времени исполнения по любому умеет ловить системные (на машинном уровне) исключения не зависимо от того предоставляет ли она эту услугу тем программам которые поверх неё работают. То есть раньше она поймав исключение обрабатывала его сама, а теперь, благодаря библиотеке, вызывает пользовательские обработчики.
Здравствуйте, Privalov, Вы писали:
СГ>> кандидату: 100% от нормы обычного человека, доктору: 500% — 1000% от нормы обычного человека академику, ну скажем, 20'000% от нормы....
P>Отлично. А сколько программисту от нормы обычного человека? А, кстати, обычному человеку?
Вы такие вопросы сложные задаёте, едва ли моих личных процентов от нормы хватит чтобы сообразить как ответить.
Хотя попробую. Дело в том что есть количественные (приблизительные) соотношения: на каждого 1 доктора приходится по 10 кандидатов, а на 1 академика приходится 10-20 докторов. Поскольку любой кандидат хочет стать доктором, и любой доктор хочет стать академиком, то отсюда заключаем, что докторами становятся люди которые в 10 раз умнее чем усреднённый кандидат; а академиками становятся люди которые в 10-20 раз умнее чем усреднённый доктор. Соотношения сильности умов между кандидатами и программистами на основании только лишь их количественных соотношений получить нельзя так не все программисты всенепременно хотят стать кандидатами.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, Privalov, Вы писали:
СГ>>> кандидату: 100% от нормы обычного человека, доктору: 500% — 1000% от нормы обычного человека академику, ну скажем, 20'000% от нормы....
P>>Отлично. А сколько программисту от нормы обычного человека? А, кстати, обычному человеку?
СГ>Вы такие вопросы сложные задаёте, едва ли моих личных процентов от нормы хватит чтобы сообразить как ответить. СГ>Хотя попробую. Дело в том что есть количественные (приблизительные) соотношения: на каждого 1 доктора приходится по 10 кандидатов, а на 1 академика приходится 10-20 докторов. Поскольку любой кандидат хочет стать доктором, и любой доктор хочет стать академиком, то отсюда заключаем, что докторами становятся люди которые в 10 раз умнее чем усреднённый кандидат; а академиками становятся люди которые в 10-20 раз умнее чем усреднённый доктор. Соотношения сильности умов между кандидатами и программистами на основании только лишь их количественных соотношений получить нельзя так не все программисты всенепременно хотят стать кандидатами.
Так и не все кандидаты могут стать программистами, ничего личного
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Предлагаемая в статье библиотека ловли исключений расширяет среду времени исполнения. Так что, новая (расширенная) среда исполнения теперь умеет вызывать пользовательские обработчики исключений. Вообще, среда времени исполнения по любому умеет ловить системные (на машинном уровне) исключения не зависимо от того предоставляет ли она эту услугу тем программам которые поверх неё работают. То есть раньше она поймав исключение обрабатывала его сама, а теперь, благодаря библиотеке, вызывает пользовательские обработчики.
Ну вот и отлично. В рантайме поддержка исключений, а в язык введём синтаксические конструкции для удобства и что бы не было (подумайте только !!!) синтаксического оверхеда.
По сути, чем различается использование ф-ий рантайма и синтаксических конструкция языка ?
Здравствуйте, Bigger, Вы писали:
B>Так и не все кандидаты могут стать программистами, ничего личного
Эт потому, что у мозгов кроме количественной характеристики есть ещё и тип. Тут приведение с трудом работает.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, akasoft, Вы писали:
СГ>>>А то ведь, можно и так:
СГ>>>PROCEDURE Move (VAR src, dst, sum: REAL): BOOLEAN;
СГ>>>BEGIN
СГ>>> IF src >= sum THEN
СГ>>> src := src - sum;
СГ>>> dst := dst + sum;
СГ>>>...
СГ>>>
A>>Ага! И полюбому зачисляем на счёт-приёмник сумму. Здорово. Все бы так уже богачами были.
СГ>Напоминаю синтаксис инструкции IF языков Modula/Oberon/Component Pascal:
СГ>IF ... THEN ... END СГ>IF ... THEN ... ELSE ... END СГ>IF ... THEN ... ELSIF ... THEN ... END СГ>IF ... THEN ... ELSIF ... THEN ... ELSIF ... THEN ... END СГ>...
СГ>т.е. в конце инструкции стоит END
А вот и нет в паскале только 1 оператор в модуле тоже
нужно писать BEGIN END
ві наверное на VB перепрограммировали.
Здравствуйте, akrysan, Вы писали:
A>А вот и нет в паскале только 1 оператор в модуле тоже A>нужно писать BEGIN END A>ві наверное на VB перепрограммировали.
Ты не прав, паскаль и компонент паскаль — вещи разные, у Вирта целый зоопарк зверушек, каждая с похожей, но чуть другой мордочкой
Здравствуйте, Mamut, Вы писали:
M>>>Исключения — это стандартный и универсальный механизм, с помощью которого код может делегировать принятие решений коду вызывающему данный. Неважно, о чем мы говорим — о модуле, функции или трех строчках кода — это все равно так.
E>>Причем не важно, сигнализирует ли исключение об ошибке, исключительной ситуации или же исключения используются для реализации логики (бывают и такие ситуации, когда исключения удобнее чем if/elseif/else или switch/case).
M>Яркий пример — разбор ХМЛя многими библиотеками. Обычно достаточно знать, что ХМЛ невалидный и сразу завершить работу M>В процессе эксплуатации оказалось, что ХМЛ в 99% случаев приходит валидный (так как я сам его и отсылаю ). Вопрос. Нафига мне там столько if-ов? Когда документ начинает расти, код читать становится неприятно.
Так то же можно, но я подразумевал другой вариант.
Вот попробую пофантазировать. Пусть, к примеру, есть функция для лексического анализа, которая возвращает токены CHAR, INTEGER, REAL, STRING и т.д. С некоторыми токенами должны быть связаны данные. Скажем, с CHAR -- символ, с INTEGER и REAL -- числовое значение, с STRING -- значение строки и т.д. Можно сделать это без исключений с помощью полиморфных классов:
А можно сделать так, чтобы get_token порождал исключения, где тип исключения был бы типом токена:
class Token : public std::exception { ... };
class Char_Token : public Token { ... };
class Integer_Token : public Token { ... };
...
void
get_token() { ... }
void
process()
{
while( true )
{
try { get_token(); }
catch( const Char_Token & t ) { process_char( t ); }
catch( const Integer_Token & t ) { process_integer( t ); }
...
}
}
Disclaimer. Сам именно таких приемов никогда не применял, но по жизни пару раз сталкивался с моментами, когда исключение выбрасывалось для изменения логики работы программы.
... << RSDN@Home 1.1.4 stable rev. 510>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
skip
E>Disclaimer. Сам именно таких приемов никогда не применял, но по жизни пару раз сталкивался с моментами, когда исключение выбрасывалось для изменения логики работы программы.
А вот это не есть хорошо, мухи от котлет должны быть отдельно, логика работы и логика обработки ошибок не одно и тоже.
Здравствуйте, Bigger, Вы писали:
E>>Disclaimer. Сам именно таких приемов никогда не применял, но по жизни пару раз сталкивался с моментами, когда исключение выбрасывалось для изменения логики работы программы.
B>А вот это не есть хорошо, мухи от котлет должны быть отдельно, логика работы и логика обработки ошибок не одно и тоже.
"Исключение == ошибка" -- это догма, иногда вредная. Исключение -- это факт того, что что-то в программе идет не так, как ожидалось, но не обязательно из-за ошибки. Например, есть обработка транзакций от клиента. Одновременно может обрабатываться не более N транзакций, причем N довольно большое число и поросто так его не достичь (это возможно, например, в "часы пик" или когда транзакции начинают валиться после восстановления разрыва связи). Поэтому N+1 транзакции нужно корректно отказать со специфическим кодом возврата. Так же возможна ситуация, когда клиент повторяет транзакцию, не дождавшись от нас результата (не выдержал тайм-аут на своей стороне). Это так же не ошибка и повторый запрос нужно просто проигнорировать. И делается это приблизительно так:
try
{
// Нормальная обработка транзакции, расчитанная на обычные условия.
...
}
catch( const too_much_trx_t & x )
{
// Обработка N+1 транзакции.
...
}
catch( const repeated_trx_t & x )
{
// Обработка повторной транзакции.
...
}
catch( const std::exception & x )
{
// А вот это уже действительно плохо!
cleanup();
initiate_shutdown();
}
Ситуации, когда порождаются too_much_trx_t и repeated_trx_t -- это не ошибки, просто это исключительные ситуации для обычной обработки транзакций. Случаются они редко. А писать из-за них код в виде вложенных if-ов (как в первоначальном примере Mamut-а) -- получается плохочитабельно.
... << RSDN@Home 1.1.4 stable rev. 510>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
К Вашему сведению, забор из if только усложняет чтение программы, возникает мешанина кода обрабатывающего ошибки, и кода логики.
Уже наверное писали(тут писали много и правильно), что исключения кроме всего прочего, позволяют локализовать обработку ошибок в одном месте.
Здравствуйте, Nickolay Ch, Вы писали:
NC>К Вашему сведению, забор из if только усложняет чтение программы, возникает мешанина кода обрабатывающего ошибки, и кода логики. NC>Уже наверное писали(тут писали много и правильно), что исключения кроме всего прочего, позволяют локализовать обработку ошибок в одном месте.
Более того, за счет использования иерархий классов исключений можно делать обработку сразу большой группы исключений (просто указав в catch имя базового класса исключения).
... << RSDN@Home 1.1.4 stable rev. 510>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.