4px

Рабочие будни

Oct 26, 2012 22:13

Между делом на работе, когда позволяет время, пишем свой движок нереляционной базы данных, в которой связи построены непредопределенным образом, наподобие свободных человеческих ассоциаций. Т.е. ее поведение непредсказуемо и зависит в основном от накопленного опыта. Нам за это не платят, делаем только «ради науки», не ожидая никаких конкретных ( Read more... )

безобразничаем, работа, компьютеры

Leave a comment

4px October 27 2012, 11:33:22 UTC
mynine October 27 2012, 12:50:36 UTC
Это уж больно старая картинка :) Я ужу и не припомню когда в последний раз использовал goto, но иногда его использование, действительно, упрощает логику программы.

Reply

4px October 27 2012, 12:54:10 UTC
картинка старая. зато про тех динозаврусов, которых я имел ввиду.
я последний раз использовал goto году этак в 94-м. если не раньше. там еще тогда появилась в бейсике интересная разновидность GOSUB ))
а сейчас пока не нужен.

Reply

mynine October 27 2012, 13:18:19 UTC
Ну я имел в виду все-таки более структурные языки, чем бейсик :) Если пишешь на чистом Си, то часто приходится выполнять секцию выхода из функции (освобождать ресурсы, например), тут goto самое внятное решение. На плюсах и пр этой проблемы нет, потому что почти все можно реализовать через RAII и освобождение происходит автоматом в деструкторах.

Reply

4px October 27 2012, 15:22:58 UTC
мне нужны примеры. пока я не могу придумать случая, где нужен GOTO.

Reply

mynine October 27 2012, 17:07:08 UTC
Вот наскоро пример вынужденного перехода. Уписывать каждый раз освобождение памяти и закрытие файла (и еще тьму вещей можно придумать) гораздо худшее решение.

int some_foo(int some_arg)
{
int ret_val = 0;
char* text = (char*)malloc(SOME_SIZE);
FILE* fi = fopen("path/to/file", "r");
...
if (!condition1) {
/* return -1; */
ret_val = -1;
goto ret_label;
}
...
if (!condition2) {
/* return -2; */
ret_val = -2;
goto ret_label;
}
...
ret_label:
free(text);
fclose(fi);
return ret_val;
}

В принципе, иногда я в таких случаях эмулирую goto через обертывание тела функции (до ret_label) в фальшивый цикл do ... while(false) и вместо goto ставлю break :) Но это может запутать еще больше читателя исходников.

Reply

4px October 27 2012, 17:12:14 UTC
почему не

if(!condition1){
ret_val = -1;
}
else{
if(!condition2){
...
}
}
free(text);
fclose(fi);
return ret_val;

про break читал, что, мол запутывает. на мой взгляд в редких случаях выхода и невложенного цикла он вполне хорошо читаем. конечно, если конструкцию усложнять, то нужно сокращать безусловные переходы.

Reply

mynine October 27 2012, 17:18:17 UTC
Этот вариант часто не проходит, условий могут быть много и не такие линейные. Отступов получается много вдобавок.

Reply

4px October 27 2012, 17:23:23 UTC
у меня такие наборы условий и чудовищное количество вложений на каждом шагу )) вроде нормально читается. блоки все равно глазом видны. на днях вышла новая бета IDE, она еще и подсвечивает блоки активные. а вот goto тут будет наоборот мешать. ну разве что все они отправляют в конец метода. а если больше точек - то уже нехорошо.

Reply

mynine October 27 2012, 17:51:05 UTC
Но попадются такие варианты, когда структурирование не выходит никак. Впрочем, на плюсах так вообще делать практически никогда и не надо :)

string text; // или vector text(SOME_SIZE);
ifstream ifs("path/to/file");
...
if (!c1)
return -1;
...
if (!c2)
return -2;
...
return 0;

Reply

mynine October 27 2012, 17:53:32 UTC
Ну и да, лично я не люблю большое число вложений: они образуются, если поддерживать идеологию одного return из функции. А я не приверженец такого стиля.

Reply

4px October 27 2012, 17:58:13 UTC
я приверженец ))

Reply

mynine October 27 2012, 18:00:37 UTC
Каждому - своё :))

Reply

4px October 27 2012, 18:01:54 UTC
это да.

Reply

mynine October 27 2012, 18:34:15 UTC
Кстати, вот я еще вспомнил пакостный случай, который плохо структурируется.

if (a)
{
block_A

if (b)
{
block_B
}
else
{
block_C
}
}
else
{
block_C
}

Хорошо, если block_C можно выразить одной строчкой, или выделить в функцию, а если нет, то проще всего поставить в первом блоке goto на второй block_C.

Reply


Leave a comment

Up