Хотя и пробуксовка не исключается из вариантов управления и даже разгона. Вот так вот. Но всёже не стоит увлекаться ^_^
А теперь о другом. Вот что я прочитала в одной книге про категории поворотов. Например, раллисты различают восемнадцать категорий поворотов, спортсмены помпроще различают двенадцать. Просто водители различают до семи. А вот цитата:
Чем ниже квалификация водителя, тем более упрощена и не всегда корректна оценка поворота. Многие вполне опытные водители считают, что категорий поворотов всего четыре: крутой, длинный, острый и обратный. А совсем неопытные распознают всего две категории: правый и левый.
А вообще, вождение - это как программирование. В нём нет совсем неправильных элементов. Просто их всегда нужно применять правильно и в своё время. Как в программировании, где сколько не ори про вред 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"...