Автор Тема: Обработка "ошибок".  (Прочитано 27846 раз)

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Обработка "ошибок".
« Ответ #30 : Апрель 18, 2012, 02:16:31 pm »
Уродский код, и потом,  я про то, что он нигде не используется... а насчет того, большие функции или маленькие пофигу - один черт каждая вызывается ровно один раз (либо не вызывается вообще)...
Или ты про какой код вообще? Те функции что у меня (f1, f2, f3 ...) используются много где, ибо библиотечны.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Romiras

  • Sr. Member
  • ****
  • Сообщений: 264
    • Просмотр профиля
    • Romiras Dev Lab
Re: Обработка "ошибок".
« Ответ #31 : Апрель 18, 2012, 02:37:06 pm »
В предложенных мною конструкциях (внутри булевой функции) можно использовать любые комбинации других возвращающих функций. Главное, вернуть статус: Успех или Неудача.
Тогда придется в эти булевы функции заворачивать каждые две-пять строчек интересующего кода. То есть этих вспомогательных функций будет примерно столько же сколько строк кода без обработки ошибок. По моему, это слишком большой оверхед.

Собственно это первое что я пытался сделать когда начал бороться за читабельность кода.

PS. Вот в такие вот моменты я жутко завидую тем кто пишет на хаскелле.
В приведённом мною код проверок выглядит "линейно". Его легче читать и воспринимать, чем древовидный, с отступами.
А что подразумевается под "оверхедом"?

P.S. Попробую подумать о других вариантах позже вечером.

DIzer

  • Гость
Re: Обработка "ошибок".
« Ответ #32 : Апрель 18, 2012, 02:37:48 pm »
А теперь понятно, (недоумевал почему не использовался  if (f0() !=nil ) напрямую.... но ладно, вы привели 2 неэквивалентных способа  -
Первый  ДОПУСКАЕТ выполнение  инструкций  внутри процедуры ПОСЛЕ блока if ов, второй НЕТ.
Имеет смысл выделить блок второго способа в Отдельную функцию возвращающую код

 ErrCode Check(){
}


А вашей основной функции будет нечто:   Log(Check())...

DIzer

  • Гость
Re: Обработка "ошибок".
« Ответ #33 : Апрель 18, 2012, 02:42:31 pm »
т.е. в этом случае вы получаете желаемое разделение (ценой небольшой работы ручками)

DIzer

  • Гость
Re: Обработка "ошибок".
« Ответ #34 : Апрель 18, 2012, 02:48:05 pm »
Почему уродский - НЕНАВИЖУ когда в качестве  значений по алгоритму осмысленных констант используются предопределенные константы  общего вида - nil, NULL уж лучше "магические" числа 

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Обработка "ошибок".
« Ответ #35 : Апрель 18, 2012, 02:53:05 pm »
А теперь понятно, (недоумевал почему не использовался  if (f0() !=nil ) напрямую.... но ладно, вы привели 2 неэквивалентных способа  -
Первый  ДОПУСКАЕТ выполнение  инструкций  внутри процедуры ПОСЛЕ блока if ов, второй НЕТ.
Это уже мелочи - один к другому приводится простым засовыванием блока в функцию. Это рраз. Два - даже в случае с return'ами во многих языках я смогу гарантировать исполнение определенного кода перед завершением работы данной функции где бы этот return не приключился.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

DIzer

  • Гость
Re: Обработка "ошибок".
« Ответ #36 : Апрель 18, 2012, 02:54:34 pm »
См. сообщение выше... что вам не нравится  в предложенном способе?

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Обработка "ошибок".
« Ответ #37 : Апрель 18, 2012, 02:54:46 pm »
Имеет смысл выделить блок второго способа в Отдельную функцию возвращающую код

 ErrCode Check(){
}


А вашей основной функции будет нечто:   Log(Check())...
От этого второй способ красивей (читабельней) не станет. Либо я что-то не понял в предложеном методе. Дай пожалуйста переделанный код второго способа.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

DIzer

  • Гость
Re: Обработка "ошибок".
« Ответ #38 : Апрель 18, 2012, 03:05:04 pm »
ErrCode Check(){
err = f1();
if (err!=nil) {
    return err;
}
err = f2();
if (err!=nil) {
    return err;
}
err = f3();
if (err!=nil) {
    return err;
}
}

.... в основной  процедуре
.....
.....
merr=Check();
......
Log(merr);
....
« Последнее редактирование: Апрель 18, 2012, 03:07:00 pm от DIzer »

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Обработка "ошибок".
« Ответ #39 : Апрель 18, 2012, 03:08:58 pm »
ErrCode Check(){
err = f1();
if (err!=nil) {
    return err;
}
err = f2();
if (err!=nil) {
    return err;
}
err = f3();
if (err!=nil) {
    return err;
}
}

.... в основной  процедуре
.....
.....
merr=Check();
......
Log(merr);
....
Это не решает проблему нечитабельности тела функции Check.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

DIzer

  • Гость
Re: Обработка "ошибок".
« Ответ #40 : Апрель 18, 2012, 03:11:43 pm »
Зато решает проблему - вашу проблему разделения логики минимальными средствами
 :D Ваше желание конфетку съесть и на ...  сесть похвально...  но надо быть реалистом.   :(

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Обработка "ошибок".
« Ответ #41 : Апрель 18, 2012, 03:18:48 pm »
Зато решает проблему - вашу проблему разделения логики минимальными средствами
 :D Ваше желание конфетку съесть и на ...  сесть похвально...  но надо быть реалистом.   :(
Нет не решает. Вся логика радостно оказывается в функции Check. Логика в коде, если выкинуть обработку ошибок, ровно вот такая:
f1()
f2()
f3()
(аргументы в функции подставить по вкусу)

Вместо этого мне предлагается писать такое:
err = f1();
if (err!=nil) {
    return err;
}
err = f2();
if (err!=nil) {
    return err;
}
err = f3();
if (err!=nil) {
    return err;
}
Где логика радостно перемешана с обработкой ошибок.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

DIzer

  • Гость
Re: Обработка "ошибок".
« Ответ #42 : Апрель 18, 2012, 03:21:58 pm »
Вот это
f1()
f2()
f3()

и то что у вас в шапке топика - СОВЕРШЕННО РАЗЛИЧНЫЕ ВЕЩИ (вы уж разберитесь с тем что вам нужно,..)

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Обработка "ошибок".
« Ответ #43 : Апрель 18, 2012, 03:37:48 pm »
Где логика радостно перемешана с обработкой ошибок.

В поставленных условиях (исключений нет, макросов нет, вообще ничего нет) трудно изобрести что-то новое. Чисто вкусовые вариации... Если бы можно было компилятор покрутить, то можно было бы пофантазировать... хотя кончилось бы все скорее всего поддержкой исключений.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Обработка "ошибок".
« Ответ #44 : Апрель 18, 2012, 03:44:08 pm »
Вот это
f1()
f2()
f3()

и то что у вас в шапке топика - СОВЕРШЕННО РАЗЛИЧНЫЕ ВЕЩИ (вы уж разберитесь с тем что вам нужно,..)
Одно и то же. Мне нужно что бы f2 выполнялось когда f1 успешен. и так далее. Но эта связка (условность выполнение f2) это не логика приложения. То есть это не то, что должно выпирать.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"