powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Флейм про оформление и begin-end
25 сообщений из 261, страница 5 из 11
Флейм про оформление и begin-end
    #40063315
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fraks
Я уже стар мозгами.
Если я как-то обошелся без лишних неведомых мне свистоперделок - значит оно мне и не нужно.

Не, надо пробовать.
Я вот CNPack терпеть не могу: попробовал. Долго не пользовался GExperts, тоже пробовал ибо. Сейчас я Gexperts использую, т.к. в нем есть годный автоформаттер. Но всё остальное смело бы выкинул... хи, идея, вычистить Gexperts. :)
...
Рейтинг: 0 / 0
Флейм про оформление и begin-end
    #40063316
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам

fraks> Тут наверное было что-то умное, но я не понял. Если не лень - распиши.

Это форум без тега SRC скушал пробелы.
Я имел в виду привычку выравнивать пробелами
простыню присвоения переменных, полей и т.п. -
так читать удобнее. :)


А, это да, это обязательно.
Все что можно выровнять - обязательно выровняю. Во многих случаях это сразу показывает где ошибка.
К сожалению, некоторые языки не позволяют такого. При написании bat-файлов очень не хватает такой возможности, выровнять при присвоении переменным по знаку =.
...
Рейтинг: 0 / 0
Флейм про оформление и begin-end
    #40063317
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
fraks
Я конечно тоже использую такой метод "испуганного программирования", но исключительно когда эта строка - первая и единственная такого рода в процедуре.

Это попытка остаться немножко беременной. Если такая строка хороша как первая в процедуре, отсюда по индукции следует, что она хороша и в других случаях.


Категорически не согласен.

Характерный пример у меня - обработчик события из контекстного меню грида.
Если нет выделенной строки (фокус не выставлен или нет ни одной записи) то убегаем.
Сразу видно что процедура далее не будет выполняться.

Если убегание где-то в середине, да еще и не одно то это фигово т.к. нет места где производится "по окончании процедуры", ибо этих окончаний образуется целая куча. И при попытке дописать в процедуру еще одну обработку можем пролететь, ибо из нее вышли раньше.


softwarer
fraks
Если такие убегания встречаются внутри, да еще неоднократно - это не есть хорошо.

Это есть хорошо. И точно всяко лучше, чем попытки обойтись без них.


Не всегда попытки обойтись заканчиваются красиво, но множественные выходы - исключительная, крайняя мера, а не обычное решение.

softwarer
Кстати, задай себе простой вопрос: используешь ли ты raise в середине процедур? Если да - значит кривишь душой, ибо это точно такое же убегание, только более масштабное. Если нет.... ну да, ну да, настоящие мастера исключений не используют. Только коды ошибок, только хардкор.


Хм... для меня raise это примерно как транзакция. Где оно нужно - там оно нужно и это не вопрос красоты.
...
Рейтинг: 0 / 0
Флейм про оформление и begin-end
    #40063318
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fraks
При написании bat-файлов очень не хватает такой возможности, выровнять при присвоении переменным по знаку =.

Используй PowerShell.
...
Рейтинг: 0 / 0
Флейм про оформление и begin-end
    #40063322
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
fraks
Я уже стар мозгами.
Если я как-то обошелся без лишних неведомых мне свистоперделок - значит оно мне и не нужно.

Не, надо пробовать.
Я вот CNPack терпеть не могу: попробовал. Долго не пользовался GExperts, тоже пробовал ибо. Сейчас я Gexperts использую, т.к. в нем есть годный автоформаттер. Но всё остальное смело бы выкинул... хи, идея, вычистить Gexperts. :)

У меня установлен GExperts, с незапамятных времен.
С тех когда было не лень изучать что-то новое :)
Сейчас даже не могу сказать что именно оттуда использую, ибо все через шорткаты.

- Комментирование/расскоментирование блока строк.
- TODO List
- Procedure List

Форматтер не использую.
...
Рейтинг: 0 / 0
Флейм про оформление и begin-end
    #40063323
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
fraks
При написании bat-файлов очень не хватает такой возможности, выровнять при присвоении переменным по знаку =.

Используй PowerShell.

PowerShell прикольная штука, но это нужно дополнительно изучать, и плюс там проблемка с запуском скрипта.
Если все по феншую то скрипт должен иметь подпись чтобы запускаться.
Или нужно полностью отключить защиту от запуска.
Отключить что-то меня стремает, а подписывать - какая-то очень непростая песня, решил что пока обойдусь.
...
Рейтинг: 0 / 0
Флейм про оформление и begin-end
    #40063326
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fraks
ъъъъъ
пропущено...

Используй PowerShell.

PowerShell прикольная штука, но это нужно дополнительно изучать, и плюс там проблемка с запуском скрипта.
Если все по феншую то скрипт должен иметь подпись чтобы запускаться.
Или нужно полностью отключить защиту от запуска.
Отключить что-то меня стремает, а подписывать - какая-то очень непростая песня, решил что пока обойдусь.

Ага, а bat - файлы неподписанные не стремает...
...
Рейтинг: 0 / 0
Флейм про оформление и begin-end
    #40063327
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraks
Категорически не согласен.

Да наздоровье. Просто это несогласие чисто эмоциональной природы, без опоры на факты.

fraks
Характерный пример у меня - обработчик события из контекстного меню грида.
Если нет выделенной строки (фокус не выставлен или нет ни одной записи) то убегаем.
Сразу видно что процедура далее не будет выполняться.

Теперь с позиций этого рассуждения раскритикуй вот этот код и расскажи, чем ужасен выход из второй строки:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  function ProcessMultiRowSelect(ColIndex: integer): variant;
  var Cnt, i: integer;
  begin
    Cnt := GridView.Controller.SelectedRecordCount;
    if Cnt <= 0 then exit(Unassigned);
    Result := VarArrayCreate([0, Cnt - 1], varVariant);
    for i := 0 to Cnt - 1 do
      Result[i] := GridView.Controller.SelectedRecords[i].Values[ColIndex];
    Form.ModalResult := mrOK;
  end;


fraks
И при попытке дописать в процедуру еще одну обработку можем пролететь

При любом дописывании в процедуру можно пролететь. Поэтому нужно думать, что и куда дописываешь, проверять корректность. Множественные точки выхода здесь ничего не меняют, тем более, как мы уже выяснили, они у тебя по факту всё равно есть - через raise.

"Единая точка выхода" - это рудимент теории структурного программирования, смысл которого с тех пор потерялся. Когда об этом писал Дейкстра, под этим имелось в виду следующее: в середине структурного блока не должно быть GOTO куда-то в другие части программы. То есть не должно быть так, что из блока ты можешь уйти в A, в Б, в В и в Г, точка выхода должна быть одна. exit - это всего лишь goto на последний end процедуры. То есть конструкции

Первая
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure X;
begin
  ....
  if условие then
  begin
    ...
  end;
end;

вторая
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure X;
label exit:
begin
  ....
  if not условие then goto exit;
  ...
  exit:
end;

и третья
Код: pascal
1.
2.
3.
4.
5.
6.
procedure X;
begin
  ....
  if not условие then exit;
  ...
end;



полностью эквиваленты и соответствуют подходу структурного программирования. Просто третья из них наиболее читаемая и удобная для восприятия.

fraks
Хм... для меня raise это примерно как транзакция. Где оно нужно - там оно нужно и это не вопрос красоты.

Это же верно и для других конструкций, в том числе exit.
...
Рейтинг: 0 / 0
Флейм про оформление и begin-end
    #40063328
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
fraks
softwarer
пропущено...

Код: pascal
1.
2.
3.
4.
begin
  if not () then exit;
  ...
end;



Я конечно тоже использую такой метод "испуганного программирования", но исключительно когда эта строка - первая и единственная такого рода в процедуре


а я очень сильно люблю именно этот метод.
позволяет избавиться от излишней вложенности условий

Сразу отсёк на входе в подпрограмму то, что не соответствует условиям,
и пишешь только функциональный код
...
Рейтинг: 0 / 0
Флейм про оформление и begin-end
    #40063330
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bk0010
YuRock
Это обычный говнокод. Первые 3 ифа выкидываются на с помощью Exit.
Чем вам лесенка плоха? Логику видно, отлаживаться удобно...
Никакого видно и удобно там нет, есть именно лишняя лесенка.
...
Рейтинг: 0 / 0
Флейм про оформление и begin-end
    #40063331
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator
а я очень сильно люблю именно этот метод. позволяет избавиться от излишней вложенности условий. Сразу отсёк на входе в подпрограмму то, что не соответствует условиям, и пишешь только функциональный код

Любовь к этому методу появляется у тех, кто достаточно повозился со сложными и запутанными условиями, задолбался править вызванные ими баги и начал ценить упрощение и даваемые им блага.
...
Рейтинг: 0 / 0
Флейм про оформление и begin-end
    #40063332
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
YuRock
Это еще хуже, нужен else if везде, кроме первой строки.

С чего бы там был нужен else if? Думаешь, два товара слететь не могут?
Если так - то да. Но это еще хуже, значит нужен массив и цикл.
...
Рейтинг: 0 / 0
Флейм про оформление и begin-end
    #40063333
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraks
YuRock
пропущено...
Это еще хуже, нужен else if везде, кроме первой строки.


Else тут не нужен нигде.
Каждая строка отвечает за свою настройку, независимо от других.
Я понял уже. Значит, нужен цикл по контролам, используя свойство Tag.
...
Рейтинг: 0 / 0
Флейм про оформление и begin-end
    #40063334
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraks
Приведенный мной код - это только часть процедуры
Это вторая проблема (если не первая)
...
Рейтинг: 0 / 0
Флейм про оформление и begin-end
    #40063335
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К сожалению весь код Delphi без использования Exit и с лишними begin/end
DelphiМогло бы быть
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TCustomForm.SetWindowMenu(Value: TMenuItem);
begin
  if FWindowMenu <> Value then
  begin
    FWindowMenu := Value;
    if Value <> nil then Value.FreeNotification(Self);
    RefreshMDIMenu;
  end;
end;

Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure TCustomForm.SetWindowMenu(Value: TMenuItem);
begin
  if FWindowMenu = Value then Exit;
  FWindowMenu := Value;
  if Value <> nil then Value.FreeNotification(Self);
  RefreshMDIMenu;
end;

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure TCustomForm.SetPosition(Value: TPosition);
begin
  if FPosition <> Value then
  begin
    FPosition := Value;
    if not (csDesigning in ComponentState) then RecreateWnd;
  end;
end;

Код: pascal
1.
2.
3.
4.
5.
6.
procedure TCustomForm.SetPosition(Value: TPosition);
begin
  if FPosition = Value then Exit;
  FPosition := Value;
  if not (csDesigning in ComponentState) then RecreateWnd;
end;

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TCustomForm.CMColorChanged(var Message: TMessage);
begin
  inherited;
  if FCanvas <> nil then
  begin
    FCanvas.Brush.Color := Color;
    Perform(CM_BORDERCHANGED, 0, 0);
  end;
end;

Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure TCustomForm.CMColorChanged(var Message: TMessage);
begin
  inherited;
  if FCanvas = nil then Exit;
  FCanvas.Brush.Color := Color;
  Perform(CM_BORDERCHANGED, 0, 0);
end;
...
Рейтинг: 0 / 0
Флейм про оформление и begin-end
    #40063336
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
Значит, нужен цикл по контролам, используя свойство Tag.

Так будет ещё хуже. А нужно там тривиальное

Код: pascal
1.
2.
3.
4.
5.
6.
CheckReset(Item_GoodMark1, CFG.LT_GoodsMark_ID_LTA1);
CheckReset(Item_GoodMark2, CFG.LT_GoodsMark_ID_LTA2);
CheckReset(Item_GoodMark3, CFG.LT_GoodsMark_ID_LTA3);
CheckReset(Item_GoodMark4, CFG.LT_GoodsMark_ID_LTA4);
CheckReset(Item_GoodMark5, CFG.LT_GoodsMark_ID_LTA5);
CheckReset(Item_GoodMark6, CFG.LT_GoodsMark_ID_LTA6);


Это если не задаваться вопросом о том, что для "шести одинаковых по сути фрагментов" следует использовать решения, поддерживающие множественность.
...
Рейтинг: 0 / 0
Флейм про оформление и begin-end
    #40063337
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr,

Ага, Exit, Break и Continue отлично сокращает лесенки.

Но надо быть аккуратным в использовании.
...
Рейтинг: 0 / 0
Флейм про оформление и begin-end
    #40063339
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
fraks
пропущено...
Else тут не нужен нигде.
Каждая строка отвечает за свою настройку, независимо от других.
Я понял уже. Значит, нужен цикл по контролам, используя свойство Tag.


Эээээ. я совсем перестал понимать что такое хорошо.
Зачем мне цикл по N контролам на форме, причем увидеть что конкретно в этот цикл попадет - весьма непросто,
вместо 6 одинаковых строк с прямыми ссылками на контролы, из которых все очевидно?

Если можно сделать просто кодом, без визуальщины - так и нужно сделать. Меньше потенциальных глюков.
...
Рейтинг: 0 / 0
Флейм про оформление и begin-end
    #40063340
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
YuRock
Значит, нужен цикл по контролам, используя свойство Tag.

Так будет ещё хуже. А нужно там тривиальное

Код: pascal
1.
2.
3.
4.
5.
6.
CheckReset(Item_GoodMark1, CFG.LT_GoodsMark_ID_LTA1);
CheckReset(Item_GoodMark2, CFG.LT_GoodsMark_ID_LTA2);
CheckReset(Item_GoodMark3, CFG.LT_GoodsMark_ID_LTA3);
CheckReset(Item_GoodMark4, CFG.LT_GoodsMark_ID_LTA4);
CheckReset(Item_GoodMark5, CFG.LT_GoodsMark_ID_LTA5);
CheckReset(Item_GoodMark6, CFG.LT_GoodsMark_ID_LTA6);



Это, конечно, улучшит ситуацию на 17% :)
...
Рейтинг: 0 / 0
Флейм про оформление и begin-end
    #40063341
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr
К сожалению весь код Delphi без использования Exit и с лишними begin/end

В 94-м году я тоже писал "без exit и с лишними begin/end". Мир развивается.

P.S. Впрочем, сейчас заглянул в исходники конца 80-х - в части случаев уместные exit я использовал и тогда.
...
Рейтинг: 0 / 0
Флейм про оформление и begin-end
    #40063342
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
defecator
а я очень сильно люблю именно этот метод. позволяет избавиться от излишней вложенности условий. Сразу отсёк на входе в подпрограмму то, что не соответствует условиям, и пишешь только функциональный код

Любовь к этому методу появляется у тех, кто достаточно повозился со сложными и запутанными условиями, задолбался править вызванные ими баги и начал ценить упрощение и даваемые им блага.

Именно.
Все эти простые варианты просты пока не наступит пора их переделать.
При переделке вся эта простота оборачивается необходимостью переписать всю логику по новой, но уже на нормальных условиях, без бегства.
...
Рейтинг: 0 / 0
Флейм про оформление и begin-end
    #40063345
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
fraks
пропущено...

PowerShell прикольная штука, но это нужно дополнительно изучать, и плюс там проблемка с запуском скрипта.
Если все по феншую то скрипт должен иметь подпись чтобы запускаться.
Или нужно полностью отключить защиту от запуска.
Отключить что-то меня стремает, а подписывать - какая-то очень непростая песня, решил что пока обойдусь.

Ага, а bat - файлы неподписанные не стремает...

Ну да, есть такое двоемыслие :)
У нас еще довольно много машинок под WnXP где этого PowerShell нету.
...
Рейтинг: 0 / 0
Флейм про оформление и begin-end
    #40063347
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraks,

сказочник
...
Рейтинг: 0 / 0
Флейм про оформление и begin-end
    #40063349
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
YuRock
Значит, нужен цикл по контролам, используя свойство Tag.

Так будет ещё хуже. А нужно там тривиальное

Код: pascal
1.
2.
3.
4.
5.
6.
CheckReset(Item_GoodMark1, CFG.LT_GoodsMark_ID_LTA1);
CheckReset(Item_GoodMark2, CFG.LT_GoodsMark_ID_LTA2);
CheckReset(Item_GoodMark3, CFG.LT_GoodsMark_ID_LTA3);
CheckReset(Item_GoodMark4, CFG.LT_GoodsMark_ID_LTA4);
CheckReset(Item_GoodMark5, CFG.LT_GoodsMark_ID_LTA5);
CheckReset(Item_GoodMark6, CFG.LT_GoodsMark_ID_LTA6);


Это если не задаваться вопросом о том, что для "шести одинаковых по сути фрагментов" следует использовать решения, поддерживающие множественность.


Это нормальный вариант. Если случиться переделать - буду в этом направлении двигаться.

Множественность вообще и множественность по сильно ограниченному множеству - не всегда есть смысл связываться с множеством.
Здесь одна только попытка перебрать контролы убъет весь смысл.
...
Рейтинг: 0 / 0
Флейм про оформление и begin-end
    #40063350
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
softwarer
пропущено...

Так будет ещё хуже. А нужно там тривиальное

Код: pascal
1.
2.
3.
4.
5.
6.
CheckReset(Item_GoodMark1, CFG.LT_GoodsMark_ID_LTA1);
CheckReset(Item_GoodMark2, CFG.LT_GoodsMark_ID_LTA2);
CheckReset(Item_GoodMark3, CFG.LT_GoodsMark_ID_LTA3);
CheckReset(Item_GoodMark4, CFG.LT_GoodsMark_ID_LTA4);
CheckReset(Item_GoodMark5, CFG.LT_GoodsMark_ID_LTA5);
CheckReset(Item_GoodMark6, CFG.LT_GoodsMark_ID_LTA6);



Это, конечно, улучшит ситуацию на 17% :)

А цикл по Tag несомненно улучшит и работу и читабельность на 100%.
...
Рейтинг: 0 / 0
25 сообщений из 261, страница 5 из 11
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Флейм про оформление и begin-end
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]