Хотя и пробуксовка не исключается из вариантов управления и даже разгона. Вот так вот. Но всёже не стоит увлекаться ^_^



А теперь о другом. Вот что я прочитала в одной книге про категории поворотов. Например, раллисты различают восемнадцать категорий поворотов, спортсмены помпроще различают двенадцать. Просто водители различают до семи. А вот цитата:



Чем ниже квалификация водителя, тем более упрощена и не всегда корректна оценка поворота. Многие вполне опытные водители считают, что категорий поворотов всего четыре: крутой, длинный, острый и обратный. А совсем неопытные распознают всего две категории: правый и левый.



А вообще, вождение - это как программирование. В нём нет совсем неправильных элементов. Просто их всегда нужно применять правильно и в своё время. Как в программировании, где сколько не ори про вред GOTO, но если его применить правильно и к месту, то можно выкинуть половину кода.



Да, Линда использует GOTO. Не смейтесь. Например, нам надо создать три манипулятора последовательно, потом выполнить работу и сделать отчистку. Вот вариант без GOTO:



//============================================

HANDLE hObject1 = 0;

HANDLE hObject2 = 0;

HANDLE hObject3 = 0;



// Возвращает 0, если объект не создан.

hObject1 = GetHandle1(SomeParam1);

if (!hObject1) return FALSE;



hObject2 = GetHandle2(SomeParam2);

if (!hObject2) {

CleanupResources(hObject1);

CloseHandle(hObject1);

return FALSE;

}



hObject3 = GetHandle3(SomeParam3);

if (!hObject3) {

CleanupResources(hObject2);

CloseHandle(hObject2);

CleanupResources(hObject1);

CloseHandle(hObject1);

return FALSE;

}



// Работаем!

DoTheWork(hObject1, hObject2, hObject3);



// Отчистка...

CleanupResources(hObject3);

CloseHandle(hObject3);

CleanupResources(hObject2);

CloseHandle(hObject2);

CleanupResources(hObject1);

CloseHandle(hObject1);



return TRUE;

//============================================



Пример взят от балды, так что не учитесь на нём ^_^' А вот с GOTO:



//============================================

HANDLE hObject1 = 0;

HANDLE hObject2 = 0;

HANDLE hObject3 = 0;

BOOL RetVal = FALSE;



// Возвращает 0, если объект не создан.

hObject1 = GetHandle1(SomeParam1);

if (!hObject1) goto hErrorHandler;



hObject2 = GetHandle2(SomeParam2);

if (!hObject2) goto hErrorHandler;



hObject3 = GetHandle3(SomeParam3);

if (!hObject3) goto hErrorHandler;



// Работаем!

DoTheWork(hObject1, hObject2, hObject3);

RetVal = TRUE;



// Отчистка... Меткам я такое иям даю из-за того

// что это у нас handler...

hErrorHandler:



if (hObject3) {

CleanupResources(hObject3);

CloseHandle(hObject3);

}



if (hObject2) {

CleanupResources(hObject2);

CloseHandle(hObject2);

}



if (hObject1) {

CleanupResources(hObject1);

CloseHandle(hObject1);

}



return RetVal;

//============================================



Мда... Пустых строк набралось... Зато функции отчистки ресурсов теперь не вызываются на каждом углу. Кроме того создание и отчистка могут быть сложнее, что усложнит модификацию программы, если вызову понапиханы во все углы.



Правда, коллеги будут смеяться, но это их дело.



Интересно, что хоть GOTO я использую только там, где оно действительно нужно, в программах на C++ (точнее в библиотеках) я использую его чаще, чем в VB. Хотя в VB обработка ошибок может включать использование GOTO. "On Error GoTo hErrorHandler"...