(это, вероятно, основано на мнении, но ...):
1) трудно читать: люди обычно читают последовательно, будь то проза, доказательства или код. Эксперименты с реорганизацией историй не привели к улучшению понимания прочитанного. В коде это:
while condition is not true
wait for event
perform condition handling
более читабельно, чем
on event do event_handler
....
event_handler:
if condition is true
perform condition handling
, несмотря на историю последнего идиома, включая сигналы FORTRAN, PL / 1, BASI C и UNIX. Я уверен, что есть множество теорий о познании, которые Google предоставил бы, если бы вы спросили ее.
2) Труднее рассуждать: здесь разум предполагает использование механических инструментов. В предыдущем примере, приведенном выше, обработка условия выполняется в контексте субъекта (потока, процесса, ...), который его ожидал. Этот субъект может нести важный контекст для обработки условия, такой как блокировки и обработчики исключений. Например, представьте, что код для обработки условия может вызвать исключение. Обязательно ли верно, что те же субъекты, которые устанавливают обработчик, являются теми, кто его обрабатывает? В такой системе, как libdispatch, это не так, но иногда это так. Охватывает ли ваше тестирование обе возможности?
Без глубокого самоанализа как механизма диспетчеризации событий, так и кода обработки событий трудно определить, какие зависимости проходят через эту границу диспетчеризации. Без доступа ко всем приложениям, фреймворку, операционной системе и даже исходным кодам компилятора это может оказаться невозможным. Возможно, это хорошая реклама для открытого исходного кода.
Но ... Они применимы к традиционным последовательным программам (тысячи строк в Фортране). Если вы построили свою программу в соответствии с формальной конструкцией, такой как конечный автомат или автоматы pu sh down, вы можете указать свою программу в формальном языке (например, ya cc). Это значительно облегчает понимание и рассуждение.
Я бы не стал буквально предлагать yacc; но любая формальная система будет настаивать на управлении конечным автоматом (машинами), поэтому ваша программа будет существовать полностью как набор выносок, вызываемых при реализации переходов.