История изменений
Исправление LongLiveUbuntu, (текущая версия) :
Дядя Боб с тобой не согласен.
В далеком прошлом многие языки программирования не поддерживали
механизма обработки исключений. В таких языках возможности обработки и получения информации об ошибках были ограничены. Программа либо устанавливала флаг ошибки, либо возвращала код, который проверялся вызывающей стороной. Оба способа продемонстрированы в листинге 7.1.
public class DeviceController {
public void sendShutDown() {
DeviceHandle handle = getHandle(DEVl);
// Проверить состояние устройства
if (handle != DeviceHandle.INVALID) {
// Сохранить состояние устройства в поле записи
retrieveDeviceRecord(handle);
// Если устройство не приостановлено, отключить его
if (record.getStatusO != DEVICE_SUSPENDED) {
pauseDevice(handle);
clearDeviceWorkQueue(handle);
closeDevice(handle);
} else {
logger.log("Device suspended. Unable to shut down");
}
} else {
logger.log("Invalid handle for: " + DEVl.toString());
}
}
}
У обоих решений имеется общий недостаток: они загромождают код на стороне вызова. Вызывающая сторона должна проверять ошибки немедленно после вызова.
К сожалению, об этом легко забыть.
По этой причине при обнаружении ошибки лучше инициировать исключение.
Код вызова становится более понятным, а его логика не скрывается за кодом обработки ошибок.
В листинге 7.2 представлен тот же код
с выдачей исключений в методах,
способных обнаруживать ошибки.
Обратите внимание, насколько чище стал код.
Причем дело даже не в эстетике.
Качество кода возросло, потому что два аспекта,
которые прежде были тесно переплетены — алгоритм отключения устройства и обработка ошибок, — теперь изолированы друг от друга. Вы можете рассмотреть их по отдельности и разобраться в каждом из них независимо.
Листинг 7.2. DeviceController.java (с исключениями)
public class DeviceControl1er {
public void sendShutDown() {
try {
tryToShutDown();
} catch (DeviceShutDownError e) {
logger.log(e);
}
}
private void tryToShutDown() throws DeviceShutDownError {
DeviceHandle handle = getHandle(DEVl);
DeviceRecord record = retrieveDeviceRecord(handle);
pauseDevice(handle);
clearDeviceworkQueue(handle);
closeDevice(handle);
}
private DeviceHandle getHandle(DeviceID id) {
throw new DeviceShutDownErrorCInvalid handle for: " + id.toString();
}
}
Исходная версия LongLiveUbuntu, :
Дядя Боб с тобой не согласен.
В далеком прошлом многие языки программирования не поддерживали
механизма обработки исключений. В таких языках возможности обработки и получения информации об ошибках были ограничены. Программа либо устанавливала флаг ошибки, либо возвращала код, который проверялся вызывающей стороной. Оба способа продемонстрированы в листинге 7.1.
public class DeviceController {
public void sendShutDown() {
DeviceHandle handle = getHandle(DEVl);
// Проверить состояние устройства
if (handle != DeviceHandle.INVALID) {
// Сохранить состояние устройства в поле записи
retrieveDeviceRecord(handle);
// Если устройство не приостановлено, отключить его
if (record.getStatusO != DEVICE_SUSPENDED) {
pauseDevice(handle);
clearDeviceWorkQueue(handle);
closeDevice(handle);
} else {
logger.log("Device suspended. Unable to shut down");
}
} else {
logger.log("Invalid handle for: " + DEVl.toString());
}
}
}
У обоих решений имеется общий недостаток: они загромождают код на стороне вызова. Вызывающая сторона должна проверять ошибки немедленно после вызова. К сожалению, об этом легко забыть. По этой причине при обнаружении ошибки лучше инициировать исключение. Код вызова становится более понятным, а его логика не скрывается за кодом обработки ошибок.
В листинге 7.2 представлен тот же код с выдачей исключений в методах,
способных обнаруживать ошибки.
Обратите внимание, насколько чище стал код.
Причем дело даже не в эстетике.
Качество кода возросло, потому что два аспекта, которые прежде были тесно переплетены — алгоритм отключения устройства и обработка ошибок, — теперь изолированы друг от друга. Вы можете рассмотреть их по отдельности и разобраться в каждом из них независимо.
Листинг 7.2. DeviceController.java (с исключениями)
public class DeviceControl1er {
public void sendShutDown() {
try {
tryToShutDown();
} catch (DeviceShutDownError e) {
logger.log(e);
}
}
private void tryToShutDown() throws DeviceShutDownError {
DeviceHandle handle = getHandle(DEVl);
DeviceRecord record = retrieveDeviceRecord(handle);
pauseDevice(handle);
clearDeviceworkQueue(handle);
closeDevice(handle);
}
private DeviceHandle getHandle(DeviceID id) {
throw new DeviceShutDownErrorCInvalid handle for: " + id.toString();
}
}