Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 А как вы форматируете логические выражения?  [new]
Artem.1st
Member

Откуда:
Сообщений: 109
Приветствую уважаемых Delphi гуру.

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

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

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

Спасибо.
31 мар 19, 22:22    [21848467]     Ответить | Цитировать Сообщить модератору
 Re: А как вы форматируете логические выражения?  [new]
Maxim.K
Member

Откуда:
Сообщений: 15
Artem.1st,

методику ... не знаю.
Я стараюсь не писать длинные IF. Разбиваю их не несколько последовательных вычислений. Получается нагляднее и промежуточные результаты легче контролировать.
Кстати, вопрос лучше направить в раздел C++ , для их языка более актуальнее, чем для Delphi :)
31 мар 19, 22:33    [21848476]     Ответить | Цитировать Сообщить модератору
 Re: А как вы форматируете логические выражения?  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3339
Artem.1st,

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

if IsNotPrintPlace and AssignedMakView and AssignedViewSeries and CurrSeriesExists and InverseRedSelect(RedSelect)


Раньше каждая из функций была частью условия, и читаемость всего этого была никакая.
31 мар 19, 22:34    [21848477]     Ответить | Цитировать Сообщить модератору
 Re: А как вы форматируете логические выражения?  [new]
bk0010
Member

Откуда:
Сообщений: 4841
Заведите булевы переменные с читаемыми именами, присваивайте им сгруппированные условия, комментируйте, что сравнивали. Потом заводите еще переменные и присваивайте им сочетания полученных результатов, комментируйте, а в if - только сочетания верхнего уровня. И отлаживаться легче будет (просмотр значений промежуточных переменных покажет где or с and перепутали).
31 мар 19, 22:35    [21848479]     Ответить | Цитировать Сообщить модератору
 Re: А как вы форматируете логические выражения?  [new]
Vlad F
Member

Откуда:
Сообщений: 924
Artem.1st,

Делай так, чтобы тебе самому было максимально комфортнее их разбирать.
И о методиках не парься.))
31 мар 19, 22:36    [21848480]     Ответить | Цитировать Сообщить модератору
 Re: А как вы форматируете логические выражения?  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3339
Vlad F,

возможно, что он пока не знает возможные варианты :)
31 мар 19, 22:39    [21848482]     Ответить | Цитировать Сообщить модератору
 Re: А как вы форматируете логические выражения?  [new]
Vlad F
Member

Откуда:
Сообщений: 924
makhaon,

Ты палец свой назидательный при этом поднимал?))
31 мар 19, 23:19    [21848515]     Ответить | Цитировать Сообщить модератору
 Re: А как вы форматируете логические выражения?  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3339
Vlad F,

я всего лишь показал, как делаю сам. впрочем, как и всегда. а уж внимать или нет - дело каждого.
1 апр 19, 00:35    [21848573]     Ответить | Цитировать Сообщить модератору
 Re: А как вы форматируете логические выражения?  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 58902
Блог
bk0010
Заведите булевы переменные с читаемыми именами, присваивайте им сгруппированные условия, комментируйте, что сравнивали. Потом заводите еще переменные и присваивайте им сочетания полученных результатов, комментируйте, а в if - только сочетания верхнего уровня. И отлаживаться легче будет (просмотр значений промежуточных переменных покажет где or с and перепутали).

+1

Помимо удобства отладки это ещё резко облегчает жизнь, когда заказчик впоследствии начинает уточнять или менять требования.
1 апр 19, 03:05    [21848610]     Ответить | Цитировать Сообщить модератору
 Re: А как вы форматируете логические выражения?  [new]
Artem.1st
Member

Откуда:
Сообщений: 109
Всем большое спасибо за ответы и полезную информацию.
Как бороться с длинными логическими выражениями специалисты из раздела C++ советуют "не разбивать на части, а форматировать в несколько строк с иерархическими отступами и явными скобками"
...
я окончательно не решил, но практика покажет, что удобней
1 апр 19, 11:17    [21848755]     Ответить | Цитировать Сообщить модератору
 Re: А как вы форматируете логические выражения?  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 890
Как бороться с длинными логическими выражениями специалисты из раздела C++ советуют "не разбивать на части, а форматировать в несколько строк с иерархическими отступами и явными скобками"


У С++ и у большей части других ЯП другой приоритет булевых операций, нежели в Delphi. В Delphi приходится указывать больше скобок, нежели в С++, зато, на мой взгляд, читабельность кода от этого становится лучше.
1 апр 19, 13:04    [21848873]     Ответить | Цитировать Сообщить модератору
 Re: А как вы форматируете логические выражения?  [new]
Arioch
Member

Откуда:
Сообщений: 11038
Скорее дело не в приоритете, а в обозначении битовых и логических операторов, одинаково или по-разному

Но лучше 10 раз поставить лишние скобки, чем один раз при модифицировании старого условия не угадать и получить баг, срабатывающий один раз из 128
1 апр 19, 13:16    [21848893]     Ответить | Цитировать Сообщить модератору
 Re: А как вы форматируете логические выражения?  [new]
High.Programer
Member [заблокирован]

Откуда:
Сообщений: 22
Artem.1st
форматировать в несколько строк с иерархическими отступами и явными скобками

IF с длинными выражениями - это тоже delphi код. Так почему бы его не форматировать для удобства чтения, разбить на строки c отступами.

if  ( <условие часть-1>) OR
    (
       (<условие часть-2.a>) AND (<условие часть-2.b>)
    ) OR
    ( <условие часть-3>) AND NOT
    (
       (<условие часть-4.a>) OR 
       (
          (<условие часть-4.b1>) AND (<условие часть-4.b2>)
       ) 
    ) OR ...
then
  // ...

Разбить условие на части и вынести в отдельные функции - идея сомнительная, т.к. получишь лишь "псевдонаглядность" , и чтоб просмотреть "условие" надо облазить все эти функции, а тут вся логика в одном месте.
1 апр 19, 14:09    [21848964]     Ответить | Цитировать Сообщить модератору
 Re: А как вы форматируете логические выражения?  [new]
Foxpc
Member

Откуда:
Сообщений: 162
if не причём(Это условие, выполнения блоков). Вы в переменные тоже самое можете запихнуть Картинка с другого сайта.
1 апр 19, 14:21    [21848976]     Ответить | Цитировать Сообщить модератору
 Re: А как вы форматируете логические выражения?  [new]
High.Programer
Member [заблокирован]

Откуда:
Сообщений: 22
Foxpc
в переменные тоже самое можете запихнуть

Но сами переменные нужно объявлять. Разбиваем условие на 10 частей, и получаем 10 новых переменных, а их еще объявить надо. А если в функции 5 таких IF-ов, то получаем (5*10=) 50 переменных.
Так переменные упрощают задачу?
1 апр 19, 14:26    [21848979]     Ответить | Цитировать Сообщить модератору
 Re: А как вы форматируете логические выражения?  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11192
bk0010
Заведите булевы переменные с читаемыми именами,
И забудьте про ленивое вычисление булевых выражений
1 апр 19, 14:40    [21848994]     Ответить | Цитировать Сообщить модератору
 Re: А как вы форматируете логические выражения?  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 58902
Блог
_Vasilisk_
И забудьте про ленивое вычисление булевых выражений

Не вижу, зачем про него забывать. Но обычно переменные экономят вычисления за счёт того, что одно и то же условие вычисляется один раз, а не поочерёдно в четырёх последовательных if-ах.
1 апр 19, 14:44    [21849001]     Ответить | Цитировать Сообщить модератору
 Re: А как вы форматируете логические выражения?  [new]
Valery_B
Member

Откуда: Москва
Сообщений: 1969
Artem.1st
Подскажите, как вы оформляете длинные-сложные IF-ы?
Спасибо.

Их выносят в отдельный метод.
Что бы в if..then стоял всегда один оператор.
function TMyFile.AllowedToWrite:Boolean;
begin
 Result:=FileExists and FileOnLocalDisk and (FileIsBusy = False); //Если так ещё 2 десятка, то разбить на методы.
end;
...
if AllowedToWrite then 
 WriteFile;

Это значительно повышает читабельность.
1 апр 19, 14:55    [21849019]     Ответить | Цитировать Сообщить модератору
 Re: А как вы форматируете логические выражения?  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1001
_Vasilisk_
bk0010
Заведите булевы переменные с читаемыми именами,
И забудьте про ленивое вычисление булевых выражений
Ленивое это short-circuit? Или наоборот? Short-circuit, когда вычисление булевского выражение заканчивается, как только становится ясен результат, полезная вещь.
1 апр 19, 15:07    [21849038]     Ответить | Цитировать Сообщить модератору
 Re: А как вы форматируете логические выражения?  [new]
Foxpc
Member

Откуда:
Сообщений: 162
High.Programer,

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

Ой кто тут унас не знает горячие клавиши? Давно редактор сам умеет типы определять
1 апр 19, 15:09    [21849040]     Ответить | Цитировать Сообщить модератору
 Re: А как вы форматируете логические выражения?  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3339
High.Programer,
первое же автоформатирование вернет всё как было :)
1 апр 19, 15:25    [21849054]     Ответить | Цитировать Сообщить модератору
 Re: А как вы форматируете логические выражения?  [new]
Квейд
Member

Откуда: Kyiv, Ukraine
Сообщений: 5252
DmSer
В Delphi приходится указывать больше скобок, нежели в С++
Можно пример?
1 апр 19, 15:57    [21849084]     Ответить | Цитировать Сообщить модератору
 Re: А как вы форматируете логические выражения?  [new]
Foxpc
Member

Откуда:
Сообщений: 162
Квейд,

if a = b and b = v then
компилятор будет ругаться.
1 апр 19, 17:10    [21849179]     Ответить | Цитировать Сообщить модератору
 Re: А как вы форматируете логические выражения?  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3339
Foxpc,

it tepend:

var
 a, b, v: boolean;
begin
 if a = b and b = v then


всё ок.

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

var
 a, b: integer;
 v: boolean;
begin
 if a = b and b = v then


и опять всё ок. си же afaiu умудряются сравнивать булин с интом, что есть однозначный фейл.
2 апр 19, 00:44    [21849582]     Ответить | Цитировать Сообщить модератору
 Re: А как вы форматируете логические выражения?  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1001
makhaon,

у оператора "=" приоритет ниже, чем у оператора and. http://docwiki.embarcadero.com/RADStudio/XE3/en/Expressions_(Delphi)#Operator_Precedence
И как компилятор оценит это выражение?
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'

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';

Я предполагаю, что первое выражение, без скобок, оценивается компилятором так:
if (a = (b and b)) = v
2 апр 19, 02:38    [21849604]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить