powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / А как вы форматируете логические выражения?
25 сообщений из 30, страница 1 из 2
А как вы форматируете логические выражения?
    #39794340
Artem.1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую уважаемых Delphi гуру.

Мне по работе приходится сопровождать Delphi-проект со сложными логическими выражениями. Речь идет об операторах IF () THEN , внутри которых длинные многострочные трудночитаемые "условия" : (A + B(C*D-E) > X) OR (L < K+1) AND (....))

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

Подскажите, как вы оформляете длинные-сложные IF-ы?

Спасибо.
...
Рейтинг: 0 / 0
А как вы форматируете логические выражения?
    #39794345
Maxim.K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Artem.1st,

методику ... не знаю.
Я стараюсь не писать длинные IF. Разбиваю их не несколько последовательных вычислений. Получается нагляднее и промежуточные результаты легче контролировать.
Кстати, вопрос лучше направить в раздел C++ , для их языка более актуальнее, чем для Delphi :)
...
Рейтинг: 0 / 0
А как вы форматируете логические выражения?
    #39794346
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem.1st,

1. форматирование
2. разбивай if'ы на внутренние функции:

Код: pascal
1.
if IsNotPrintPlace and AssignedMakView and AssignedViewSeries and CurrSeriesExists and InverseRedSelect(RedSelect)



Раньше каждая из функций была частью условия, и читаемость всего этого была никакая.
...
Рейтинг: 0 / 0
А как вы форматируете логические выражения?
    #39794347
bk0010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заведите булевы переменные с читаемыми именами, присваивайте им сгруппированные условия, комментируйте, что сравнивали. Потом заводите еще переменные и присваивайте им сочетания полученных результатов, комментируйте, а в if - только сочетания верхнего уровня. И отлаживаться легче будет (просмотр значений промежуточных переменных покажет где or с and перепутали).
...
Рейтинг: 0 / 0
А как вы форматируете логические выражения?
    #39794348
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem.1st,

Делай так, чтобы тебе самому было максимально комфортнее их разбирать.
И о методиках не парься.))
...
Рейтинг: 0 / 0
А как вы форматируете логические выражения?
    #39794349
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad F,

возможно, что он пока не знает возможные варианты :)
...
Рейтинг: 0 / 0
А как вы форматируете логические выражения?
    #39794359
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

Ты палец свой назидательный при этом поднимал?))
...
Рейтинг: 0 / 0
А как вы форматируете логические выражения?
    #39794375
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad F,

я всего лишь показал, как делаю сам. впрочем, как и всегда. а уж внимать или нет - дело каждого.
...
Рейтинг: 0 / 0
А как вы форматируете логические выражения?
    #39794389
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bk0010Заведите булевы переменные с читаемыми именами, присваивайте им сгруппированные условия, комментируйте, что сравнивали. Потом заводите еще переменные и присваивайте им сочетания полученных результатов, комментируйте, а в if - только сочетания верхнего уровня. И отлаживаться легче будет (просмотр значений промежуточных переменных покажет где or с and перепутали).
+1

Помимо удобства отладки это ещё резко облегчает жизнь, когда заказчик впоследствии начинает уточнять или менять требования.
...
Рейтинг: 0 / 0
А как вы форматируете логические выражения?
    #39794479
Artem.1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем большое спасибо за ответы и полезную информацию.
Как бороться с длинными логическими выражениями специалисты из раздела C++ советуют "не разбивать на части, а форматировать в несколько строк с иерархическими отступами и явными скобками"
...
я окончательно не решил, но практика покажет, что удобней
...
Рейтинг: 0 / 0
А как вы форматируете логические выражения?
    #39794555
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как бороться с длинными логическими выражениями специалисты из раздела C++ советуют "не разбивать на части, а форматировать в несколько строк с иерархическими отступами и явными скобками"

У С++ и у большей части других ЯП другой приоритет булевых операций, нежели в Delphi. В Delphi приходится указывать больше скобок, нежели в С++, зато, на мой взгляд, читабельность кода от этого становится лучше.
...
Рейтинг: 0 / 0
А как вы форматируете логические выражения?
    #39794562
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее дело не в приоритете, а в обозначении битовых и логических операторов, одинаково или по-разному

Но лучше 10 раз поставить лишние скобки, чем один раз при модифицировании старого условия не угадать и получить баг, срабатывающий один раз из 128
...
Рейтинг: 0 / 0
А как вы форматируете логические выражения?
    #39794596
High.Programer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Artem.1stформатировать в несколько строк с иерархическими отступами и явными скобками
IF с длинными выражениями - это тоже delphi код. Так почему бы его не форматировать для удобства чтения, разбить на строки c отступами.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
if  ( <условие часть-1>) OR
    (
       (<условие часть-2.a>) AND (<условие часть-2.b>)
    ) OR
    ( <условие часть-3>) AND NOT
    (
       (<условие часть-4.a>) OR 
       (
          (<условие часть-4.b1>) AND (<условие часть-4.b2>)
       ) 
    ) OR ...
then
  // ...


Разбить условие на части и вынести в отдельные функции - идея сомнительная, т.к. получишь лишь "псевдонаглядность" , и чтоб просмотреть "условие" надо облазить все эти функции, а тут вся логика в одном месте.
...
Рейтинг: 0 / 0
А как вы форматируете логические выражения?
    #39794606
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
if не причём(Это условие, выполнения блоков). Вы в переменные тоже самое можете запихнуть
...
Рейтинг: 0 / 0
А как вы форматируете логические выражения?
    #39794608
High.Programer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Foxpcв переменные тоже самое можете запихнуть
Но сами переменные нужно объявлять. Разбиваем условие на 10 частей, и получаем 10 новых переменных, а их еще объявить надо. А если в функции 5 таких IF-ов, то получаем (5*10=) 50 переменных.
Так переменные упрощают задачу?
...
Рейтинг: 0 / 0
А как вы форматируете логические выражения?
    #39794618
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bk0010Заведите булевы переменные с читаемыми именами,И забудьте про ленивое вычисление булевых выражений
...
Рейтинг: 0 / 0
А как вы форматируете логические выражения?
    #39794621
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_И забудьте про ленивое вычисление булевых выражений
Не вижу, зачем про него забывать. Но обычно переменные экономят вычисления за счёт того, что одно и то же условие вычисляется один раз, а не поочерёдно в четырёх последовательных if-ах.
...
Рейтинг: 0 / 0
А как вы форматируете логические выражения?
    #39794634
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem.1stПодскажите, как вы оформляете длинные-сложные IF-ы?
Спасибо.
Их выносят в отдельный метод.
Что бы в if..then стоял всегда один оператор.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
function TMyFile.AllowedToWrite:Boolean;
begin
 Result:=FileExists and FileOnLocalDisk and (FileIsBusy = False); //Если так ещё 2 десятка, то разбить на методы.
end;
...
if AllowedToWrite then 
 WriteFile;


Это значительно повышает читабельность.
...
Рейтинг: 0 / 0
А как вы форматируете логические выражения?
    #39794640
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_bk0010Заведите булевы переменные с читаемыми именами,И забудьте про ленивое вычисление булевых выраженийЛенивое это short-circuit? Или наоборот? Short-circuit, когда вычисление булевского выражение заканчивается, как только становится ясен результат, полезная вещь.
...
Рейтинг: 0 / 0
А как вы форматируете логические выражения?
    #39794642
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
High.Programer,

у каждого if есть логика. Разделяй её по переменным если надо.

Ой кто тут унас не знает горячие клавиши? Давно редактор сам умеет типы определять
...
Рейтинг: 0 / 0
А как вы форматируете логические выражения?
    #39794647
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
High.Programer,
первое же автоформатирование вернет всё как было :)
...
Рейтинг: 0 / 0
А как вы форматируете логические выражения?
    #39794664
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSerВ Delphi приходится указывать больше скобок, нежели в С++Можно пример?
...
Рейтинг: 0 / 0
А как вы форматируете логические выражения?
    #39794720
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Квейд,

Код: pascal
1.
if a = b and b = v then

компилятор будет ругаться.
...
Рейтинг: 0 / 0
А как вы форматируете логические выражения?
    #39794898
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Foxpc,

it tepend:

Код: pascal
1.
2.
3.
4.
var
 a, b, v: boolean;
begin
 if a = b and b = v then



всё ок.

а с Integer ругается потому, что ты пытаешься разные типы сравнивать - boolean с integer, они в делфи не сравнимы.
напиши так:

Код: pascal
1.
2.
3.
4.
5.
var
 a, b: integer;
 v: boolean;
begin
 if a = b and b = v then



и опять всё ок. си же afaiu умудряются сравнивать булин с интом, что есть однозначный фейл.
...
Рейтинг: 0 / 0
А как вы форматируете логические выражения?
    #39794904
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

у оператора "=" приоритет ниже, чем у оператора and . http://docwiki.embarcadero.com/RADStudio/XE3/en/Expressions_(Delphi)#Operator_Precedence
И как компилятор оценит это выражение?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure TForm1.Button3Click(Sender: TObject);
var
 a, b, v: boolean;
begin
 a := True;
 b := False;
 v := False;
 if a = b and b = v
 then Caption := 'fff'
 else Caption := 'kkk';
end;


выводит 'fff'

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure TForm1.Button3Click(Sender: TObject);
var
 a, b, v: boolean;
begin
 a := True;
 b := False;
 v := False;
 if (a = b) and (b = v)
 then Caption := 'fff'
 else Caption := 'kkk';
end;


выводит 'kkk';

Я предполагаю, что первое выражение, без скобок, оценивается компилятором так:
Код: pascal
1.
if (a = (b and b)) = v
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / А как вы форматируете логические выражения?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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