Я бы сказал, что у нового кода есть какой-то запах ...
Все зависит от того, сколько состояний вы управляете в текущем коде, и может ли количество состояний измениться в будущем.Остерегайтесь как и когда вы устанавливаете состояние , и остерегайтесь как и когда вы проверяете состояние .
В двух фрагментах кода, которые вы показываете, есть небольшая разница:
В первом исходном коде текущее состояние сохраняется в течение итерации, а новое состояние ошибки устанавливается в начало итерации, и оно всегда проверено.
Во втором рефакторированном коде состояние изменяется в середине итерации и изменяется только в том случае, еслисостояние stReadDeviceID
.
Теперь, если последняя строка в этой итерации while True do
равна if State = stError then Break;
, тогда ваш первый код выполнит итерацию еще раз, изменив состояние на stError
в начале, если итерация.Ваш второй код завершится в конце текущей итерации, и код в stError
-разведении case
-отверждения никогда не будет выполнен ...
Если вы хотите пройти всеи изучите шаблон проектирования состояния GoF, а затем посмотрите на следующие страницы: