LINUX.ORG.RU

помогите написать красивый код


0

0

всем ДД!

вопрос по украшательству кода.
<<<
res1 = f1();
res2 = f2();
res3 = f3();
...
return res;
>>>

f1, f2, f3 могу возвращать только PASS/FAIL. как бы все это красаво обернуть, чтобы из функции возвращался PASS, только если все функции вернули PASS и FAIL в остальных случаях?

спасибо


>f1, f2, f3 могу возвращать только PASS/FAIL

PASS/FAIL это какого типа? строки? константы? enum? и какой язык вообще? =)

если результаты булевы, то все тривиально:

return f1() && f2() && f3();

nu11 ★★★★★
()

язык С. хотелось бы решение, в котором нет никаких предположений о значении PASS/FAIL (тип int).

mrrr
() автор топика
Ответ на: комментарий от mrrr

res = PASS;
res = ( f1() == FAIL ) ? FAIL : res;
res = ( f2() == FAIL ) ? FAIL : res;
res = ( f3() == FAIL ) ? FAIL : res;
return res;

это если надо, чтоб f1, f2, f3 обязательно выполнились

lester ★★★★
()
Ответ на: комментарий от lester

ну тогда уже:

enum { NOERR, ERR1, ERR2, ERR3 };

int errno = NOERR;

if (f1() != NOERR)
         errno = ERR1;

if (f2() != NOERR)
         errno = ERR2;

if (f3() != NOERR)
         errno = ERR3;

return errno;

а то потом не разберёшся, где лагануло

beastie ★★★★★
()
Ответ на: комментарий от lester

кстати можно короче записать

res = f1();
res = ( f2() == FAIL ) ? FAIL : res;
res = ( f3() == FAIL ) ? FAIL : res;
return res;

lester ★★★★
()
Ответ на: комментарий от lester

>тогда не обязательно вызовутся f2() и f3()

зависит от компилятора и степени оптимизации. Но грабли таки возможны, это да. "Счастливой отладки, суки" (с)

nu11 ★★★★★
()
Ответ на: комментарий от nu11

> зависит от компилятора и степени оптимизации.

Не зависит.

smh ★★★
()
Ответ на: комментарий от smh

>> тогда не обязательно вызовутся f2() и f3()
> Только в том случае, если f1() будет false.


или у меня парсер сломался, или вы утверждали обратное :)

lester ★★★★
()
Ответ на: комментарий от lester

> или у меня парсер сломался, или вы утверждали обратное :)

Ты сказал, что f2() и f3() не обязательно будут вызваны... а я и добавил, что они не будут вызваны в том случае, если f1() будет false. Или я что-то не так понял? :-)

smh ★★★
()
Ответ на: комментарий от smh

> не обязательно вызовутся f2() и f3(), только в том случае, если f1() будет false.

так читается вместе, вообщем все понятно - хватит нам тут умничать :)

lester ★★★★
()
Ответ на: комментарий от lester

> очевидно намек на детсад, что мы тут устроили

Ну почему ж детсад. Нормально все, выяснили проблему. :-)

smh ★★★
()
Ответ на: комментарий от smh

>>return f1() && f2() && f3();
>тогда не обязательно вызовутся f2() и f3()


Если результат - bool, и f не возвращают больших чисел, то можно f1() * f2() * f3().

ratatosk
()

res1 = f1();
res2 = f2();
res3 = f3();
...
return res1 && res2 && res3;


> хотелось бы решение, в котором нет никаких предположений о значении PASS/FAIL (тип int).


Добавить три переменных наиболее прближенного к булеву типа и установить в соответствии со значением res1-3 в том месте, где троеточие. Возвращать их коньюкцию.

LamerOk ★★★★★
()

А почему нельзя f1() & f2() & f3() ? И аналог с переменной: res = f1(); res &= f2(); ...

Как разновидность (если не нравится битовая арифметика): fail = !f1(); fail |= !f2();

alexsaa
()

int rv = PASS;
res1 = f1();
if (res1 != PASS) {
  rv = FAIL;
}
res2 = f2();
if (res2 != PASS) {
  rv = FAIL;
}
res3 = f3();
if (res3 != PASS) {
  rv = FAIL;
}
return rv;

Legioner ★★★★★
()
Ответ на: комментарий от LamerOk

>> А почему нельзя f1() & f2() & f3() ?

> man operator &

К сожалению, такой скупой ответ приемлем только при чётко поставленной задаче. Здесь же из постановки задачи не следует даже неприемлемость оператора && (это уже потом поясняется в треде отдельно). В общем, вопрос остаётся в силе.

alexsaa
()

int conj (int ... values)
{
   for value in values
   {
       if (value==FAIL)
          return FAIL;
   }
   return PASS;
}


someFunc()
{
...
  int test_result = conj (test1(), test2(), test3(), test4());
...
}

savnn
()
Ответ на: комментарий от lester

>res = true;
>res &= f1();

побитовые операции над логической константой? мрак...

ЗЫ: нафиг вообще красивый код? заказчик на него будет пялиться? красивый не всегда просто отлаживать.
имхо, красивый код - тот, который проще отлаживать.

xydo ★★
()
Ответ на: комментарий от dr_dizel

return ( PASS==f1() && PASS==f2() && PASS==f3() )? PASS: FAIL;

логика очевидна.

Lucky ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.