Александр Ильин писал(а):
Не совсем про выход из середины цикла, но про выход из середины процедуры. Сегодня переписал вот такую процедурку.
Проблема этой процедурки не в ретурнах (кстати, по мне так ваш вариант еще менее читабельный), а в том, что она оперирует несвязанными между собой сущностями - pg.base.bmh, pg.Load^(), AllocNew(pg). Без знания, как работает AllocNew, как работает Load и как они связаны с pg.base.bmh понять, что тут на самом деле творится - невозможно. Как не переписывай ретурны и ифы
Сделаю предположение (хотя еще раз подчеркну, что из кода это совершенно неочевидно), что AllocNew грузит bmp'ку в pg.base.bmh используя "что-то", полученное после вызова pg.Load^ (). Тогда я бы переписал этот код так:
Код:
IF pg.base.bmh = NIL THEN
hz := pg.Load^ () (* что делает Load в оригинальном варианте и каким он боком к остальному коду - вообще непонятно *)
IF hz # NIL THEN
pg.base.bmh := AllocNew(hz); (*теперь AllocNew _явно_ зависит от предыдущего вызова Load, а первое условие (pg.base.bmh = NIL) обретает смысл - теперь видно, что эта функция делает (грузит bmp в pg.base.bmh, если она еще не была загружена). *)
END
END
RETURN pg.base.bmh # NIL
Александр Ильин писал(а):
PS: Проверка "... # NIL" имеет здесь смысл "уже загружено".
...и такого комментария уже не требуется
P.S. Я ж говорю - циклы с break и прочие ретурны из середины - это фигня. Даже если отбросить архитектурные аспекты и сосредоточится исключительно на кодировании "в малом" - есть намного более интересные и важные аспекты, влияющие на сопровождение кода, чем следование/неследование принципам Дейкстры.