dvuugl писал(а):
А что, стуктурность, она для понятности или для теоретической крутизны?
Такие ли уж на самом деле ЯВУ наши ЯВУ? Большей частью в них только укрупнены команды, остальное как а asm почти. Существенный шаг к реально ЯВУ делает ДРАКОН и не "стыдится" меток с гото, а наоборот именно их использует как ОСНОВУ структурирования.
Что такое понятность программного кода?
1. Минимум программного кода. Меньше коде - меньше в нем ошибок и меньше надо воспринимать.
2. Минимум локальных переменных. Меньше переменных - нет необходимости помнить о их назначении, значения получаем из функций.
3. Минимум вложености в структурные конструкции языка: циклы, проверки условий.
4. Минимум меток и Goto. Используются Continue, Break, Return (Exit).
5. Минимальное пребывание в процедуре, функции, методе. При получении отрицательного условия, при получении результата - выполнить Return. При этом локальнее становится получение результата, упрощается дальнейший программный код: нет необходимости добираться до конца процедуры, упрощается дальнейший программный код - нет локальных переменных для сохранения состояния, уменьшается вложенность конструкций.
6. Множественный выход, в отличии от единого, создает декомпозицию (разделенность) множества принимаемых значений результата.
7. Декомпозиция программы - разделение ее на функциональные процедуры, с минимальными функциональными целями. При этом создается функциональная среда проблемных решений и программирование идет в направлений их использования.
8. Отказ от универсальных, настраиваемых процедур. Они излишне сложны, имеют сложную логику, сложно тестировать, оторваны от проблемной области, требуют изучения при использовании, область применения определена не в полном обьеме.
9. Код писать максимально без пробелов в операторах (в отличии от табличного стиля), Можно при поиске найти не только переменную, но и присвоение ей значения (
F:=2; , но не F := 2; ), можно найти фрагменты выражений.
10. Завершающие end писать на уровне отступа вложенного содержания.
Разрешите привести пример, без пояснения о назначении.
Код:
procedure GrPoisk;
var N,NGr,Prohod:Integer; El:tEl; Dr:tDr; LDr:TList;
begin
Form1.MemoExit(Nil);
Lt.SEl.Sort(@SortEl);
LDr:=TList.Create;
for N:=0 to Lt.SDr.Count-1 do LDr.Add(Lt.SDr.Items[N]);
LDr.Sort(@SortLDr);
try
for Prohod:=1 to 2 do begin // 1-До конца,2-от начала
NGr:=0;
if Form1.M32.Checked then begin
if GrTestPoisk(Lt.UPrim,mUPrim,redLt,Lt,NGr) then Exit;
if GrTestPoisk(Lt.APrim,mAPrim,redLt,Lt,NGr) then Exit;
if GrTestPoisk(Lt.PPrim,mPPrim,redLt,Lt,NGr) then Exit;
for N:=0 to LDr.Count-1 do begin
Dr:=LDr.Items[N];
if GrTestPoisk(Dr.UPrim,mUPrim,redDr,Dr,NGr) then Exit;
if GrTestPoisk(Dr.APrim,mAPrim,redDr,Dr,NGr) then Exit;
if GrTestPoisk(Dr.PPrim,mPPrim,redDr,Dr,NGr) then Exit;
if GrTestPoisk(Dr.Id,mId,redDr,Dr,NGr) then Exit;
end;
end;
for N:=0 to Lt.SEl.Count-1 do begin
El:=Lt.SEl.Items[N];
if El.Tip=elUzl then Continue;
if GrTestPoisk(El.Id,mId,redEl,El,NGr) then Exit;
if GrTestPoisk(El.TxT,mTxT,redEl,El,NGr) then Exit;
if (El.Tip in [elVvd,elVyv,elPlk,elPPr])and
GrTestPoisk(El.TxB,mTxB,redEl,El,NGr) then Exit;
if Form1.M32.Checked then begin
if GrTestPoisk(El.UPrim,mUPrim,redEl,El,NGr) then Exit;
if GrTestPoisk(El.APrim,mAPrim,redEl,El,NGr) then Exit;
if GrTestPoisk(El.PPrim,mPPrim,redEl,El,NGr) then Exit;
end;
end;
PozGr:=1;
if (Prohod=1) and (Application.MessageBox(
'Достигнут конец документа. Продолжить поиск с начала?',
'Найти в поле графики',
mb_YesNo+mb_IconQuestion)<>idYes) then Exit;
end;
ShowMessage('В поле графики не найден: "'+Obraz+'"');
finally
LDr.Clear; LDr.Free;
end;
end;
Примечание. В примере использована техника организации единого выхода через
секцию finally при нескольких Exit, предложенная
ain здесь, спасибо.