powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / читаю букварь... есть вопрос
19 сообщений из 19, страница 1 из 1
читаю букварь... есть вопрос
    #33467929
что грамотнее?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
function Foo()

if condition1 then
   if condition2 then
      if condition3 then
         if condition4 then

            ...functional code here...

         end if
      end if
   end if
end if

end function


или

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function Foo()

if not condition1 then exit
if not condition2 then exit
if not condition3 then exit
if not condition4 then exit

...functional code here...
    
end function


...
Рейтинг: 0 / 0
читаю букварь... есть вопрос
    #33467950
Саппортер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А чем так не устраивает:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
function Foo()

  if condition1 and condition2 and condition3 and condition4 then 

    ...functional code here...

  end if
    
end function
...
Рейтинг: 0 / 0
читаю букварь... есть вопрос
    #33467969
СаппортерА чем так не устраивает:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
function Foo()

  if condition1 and condition2 and condition3 and condition4 then 

    ...functional code here...

  end if
    
end function



не устраивает.

Речь в вопросе идет об упрощении и читабельности кода, а вы его пытаетесь усложнить.

condition1,2,3,4 могут состоять из нескольких подусловий связанных "and" "or" "not" и групированных по смысловому признаку.
...
Рейтинг: 0 / 0
читаю букварь... есть вопрос
    #33468004
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да нет, усложнить код пытаетесь вы.
Длинные и сложные условия -- так выпишите вы их в несколько строк, какие проблемы? Но городить заборы операторных скобок...
...
Рейтинг: 0 / 0
читаю букварь... есть вопрос
    #33468039
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для особо упёртых можно сначала расчитать условия в нескольких строчках, а потом как Сапортер предложил.
...
Рейтинг: 0 / 0
читаю букварь... есть вопрос
    #33468044
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sarin wrote:
> Для особо упёртых можно сначала расчитать условия в нескольких строчках,
> а потом как Сапортер предложил.
угу... и потерять всю прелесть сокращенных булевских выражений?
a and b and c
где a - 10 секунд, b - 10 секунд, c - 30 секунд
в худшем случае при сокращенном расчет будет 50 секунд, в лучшем - 10
секунд.
при Вашем подходе всегда будет 50 секунд.

--
-------------------------
There's no silver bullet!
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
читаю букварь... есть вопрос
    #33468094
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
locky
Sarin wrote:
> Для особо упёртых можно сначала расчитать условия в нескольких строчках,
> а потом как Сапортер предложил.
угу... и потерять всю прелесть сокращенных булевских выражений?
a and b and c
где a - 10 секунд, b - 10 секунд, c - 30 секунд
в худшем случае при сокращенном расчет будет 50 секунд, в лучшем - 10
секунд.
при Вашем подходе всегда будет 50 секунд.

--
-------------------------
There's no silver bullet!
Posted via ActualForum NNTP Server 1.3
Э-э-э...
А эт как?
Я вообще с трудом представляю применение операторов AND , OR и NOT к небулевским типам.
...
Рейтинг: 0 / 0
читаю букварь... есть вопрос
    #33468113
BlackStar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
int test1(); // время выполнения  10  сек
bool test2( int p, int p2 ); // время выполнения  10  сек
bool megaTest( куча параметров ); // время выполнения  30  сек

...
// вариант  1 
if( test1() && test2( somevar1, somevar  2 ) && megaTest( ... ) ) {
   // делаем нечто полезное
}
// вариант  2 
int a = test1();
bool b = test2( somevar1, somevar  2 );
bool c = megaTest( ... );
if( a && b && c ) {
   // делаем нечто полезное
}


вариант 1 будет проскакивать за время от 10 до 50,
вариант 2 ВСЕГДА будет проходить за 50
так понятнее?

--
There Ain't No Such Thing As A Free Lunch
...
Рейтинг: 0 / 0
читаю букварь... есть вопрос
    #33468149
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кроме того, не всегда можно заменить сокращенное вычисление на полное
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
begin
  if not assigned(Value) then exit;
  if Value.Tag =  0  then exit;
  DoSomething;
end;

var a,b : boolean;
begin
  a := assigned(value);
  b := value.tag =  0 ;
  if a and not b then DoSomething;
end;

во 2-м варианте будут ошибки.

--
-------------------------
There's no silver bullet!
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
читаю букварь... есть вопрос
    #33468162
вариант с "and and and" не подходит. В этом случае или делаем лишние "движения" с промежуточными bool condition_result1 = condition1... или придется плодить четыре экстра-функции которые потом вставим в ваш and and and...

Ну ладно, чтоб не заострять внимание на "and and and", возму немного измененный случай (камнями не кидаца):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
function Foo()

Init1()
if condition1 then
   Init2()
   if condition2 then
      Init3()
      if condition3 then
         Init4()
         if condition4 then

            ...functional code here...

         end if
      end if
   end if
end if

end function



или


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
function Foo()

Init1()
if not condition1 then exit
Init2()
if not condition2 then exit
Init3()
if not condition3 then exit
Init4()
if not condition4 then exit

...functional code here...
    
end function

...
Рейтинг: 0 / 0
читаю букварь... есть вопрос
    #33468193
Саппортер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
химик теоретиквариант с "and and and" не подходит. В этом случае или делаем лишние "движения" с промежуточными bool condition_result1 = condition1... или придется плодить четыре экстра-функции которые потом вставим в ваш and and and...

Ну ладно, чтоб не заострять внимание на "and and and", возму немного измененный случай (камнями не кидаца):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
function Foo()

Init1()
if condition1 then
   Init2()
   if condition2 then

****



Если еще немного подумать, то вопрос "Что грамотнее?" не корректен. Особенно в данном случае.
Что Вас интересует, сокрость исполнения, количество занимаемой памяти, удобство чтения исходника? В разных улсовиях нужно писать по разному.

Например, зачем нам каждый раз выполнять несколько InitN, а потом ничего не делать так как conditionN+1 = false?
Возникает вопрос влияют ли InitN на conditionM?
...
Рейтинг: 0 / 0
читаю букварь... есть вопрос
    #33468252
Саппортер химик теоретиквариант с "and and and" не подходит. В этом случае или делаем лишние "движения" с промежуточными bool condition_result1 = condition1... или придется плодить четыре экстра-функции которые потом вставим в ваш and and and...

Ну ладно, чтоб не заострять внимание на "and and and", возму немного измененный случай (камнями не кидаца):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
function Foo()

Init1()
if condition1 then
   Init2()
   if condition2 then

****



Если еще немного подумать, то вопрос "Что грамотнее?" не корректен. Особенно в данном случае.
Что Вас интересует, сокрость исполнения, количество занимаемой памяти, удобство чтения исходника? В разных улсовиях нужно писать по разному.

Например, зачем нам каждый раз выполнять несколько InitN, а потом ничего не делать так как conditionN+1 = false?
Возникает вопрос влияют ли InitN на conditionM?


не переходя к частностям и скорость и читаемость - правила грамотного кода.

InitN подразумевает лишь промежуточные вычисления или инициализацию обьектов/параметров которые участвуют позднее в conditionN. Для общего случая, думаю, нет необходимости знать как влияют InitN на conditionM. Даже если зависят, порядок инициализации соблюден в обоих вариантах.

Может я неправ, я букварь еще пока до конца не осилил.
...
Рейтинг: 0 / 0
читаю букварь... есть вопрос
    #33468400
дурачок
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 всем
для тех, кто еще не в танке - это VB|VBA код.
в VBA нет "как класса" сокращенного выполнения логических операций.
это вопрос про то, какой вариант "ручной" оптимизации "лучше"

2 химик теоретик
внешне оба варианта выглядят абсолютно эквивалентно.
(с поправкой Exit на Exit Function)

может быть для первого варианта компилятор выдаст чуть более короткий код, чем для второго, а может быть и точно одинаковый - я не проверял.
(у меня проверялки нет.)

Фактический выбор произойдет тогда, когда в этой схеме появится обработка ошибок (если появится),
или когда логическое условие будет сложнее, чем конъюнкия операндов.

кстати, отсутствие короткого вычисления лог. операций иногда сознательно используется для получения побочных эффектов. Например, для установки глобальных переменных состояния приложения.
(это не призыв, а просто информация).

В исходном виде второй, на мой вкус, более читаемый.
А что окажется в "живой" процедуре читаемей и/или пригодней для внесения изменений - покажет живая процедура.
:)

вот такое мое дураковатое мнение.


2 Sarin
авторЯ вообще с трудом представляю применение операторов AND, OR и NOT к небулевским типам.
В VBA они могут применяться для выполнения битовых операций на целочисленных типах.
...
Рейтинг: 0 / 0
читаю букварь... есть вопрос
    #33468470
"В исходном виде второй, на мой вкус , более читаемый."

вот это первый ответ (8 предидущих больше как анекдот про Ватсона и Холмса с программистом на воздушном шаре)

Код примера к VBA отношения не имеет. Синтакс близок к басику только для визуальной простоты.
...
Рейтинг: 0 / 0
читаю букварь... есть вопрос
    #33468496
дурачок
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
химик теоретик"В исходном виде второй, на мой вкус , более читаемый."

вот это первый ответ (8 предидущих больше как анекдот про Ватсона и Холмса с программистом на воздушном шаре)

Код примера к VBA отношения не имеет. Синтакс близок к басику только для визуальной простоты.
тогда и данный мной ответ смысла не имеет.
слова складываются в предложения только как демонстация возможностей клавиатуры.
...
Рейтинг: 0 / 0
читаю букварь... есть вопрос
    #33468497
даже не буду говорить, как это на самом деле читается...
:)
...
Рейтинг: 0 / 0
читаю букварь... есть вопрос
    #33469645
Borya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Второй вариант лучше в плане "что грамотнее". Если exit понимать как выход из подпрограммы, то он и ещще быстрее чем ветвление имхо.
Просто классика.
...
Рейтинг: 0 / 0
читаю букварь... есть вопрос
    #33473260
Саппортер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
химик теоретик"В исходном виде второй, на мой вкус , более читаемый."

вот это первый ответ (8 предидущих больше как анекдот про Ватсона и Холмса с программистом на воздушном шаре)

Код примера к VBA отношения не имеет. Синтакс близок к басику только для визуальной простоты.

В таком случае, на мой вкус, все варианты одинаково "грамотны".
Вопрос применения одного из них определяется внешним контекстом решаемой задачи.
...
Рейтинг: 0 / 0
читаю букварь... есть вопрос
    #33474567
AL_KIR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
применительно к первому вопросу о двух кусках кода - скорость исполнения во многом будет зависеть от выбора компилятора или транслятора.
Если попытаться самостотельно перевести этот код в машинный, то количество переходов во втором куске будет меньшим и, следовательно скорость выполнения выше... но здесь не ясна природа условий (состояний - condition)... скорее всего такие компиляторы языка java приведут оба этих куска кода к схожему виду и оба они будут выполняться одиноково, если писать на бейсике то можно использовать критерий количества строк, в первом случае сторок больше - а значит код будет выполняться медленнее
что косается читабельности - то второй кусок кода привычнее для пишущего программиста
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / читаю букварь... есть вопрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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