Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / читаю букварь... есть вопрос / 19 сообщений из 19, страница 1 из 1
04.01.2006, 11:51
    #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
04.01.2006, 12:11
    #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
04.01.2006, 12:44
    #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
04.01.2006, 13:15
    #33468004
DocAl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
читаю букварь... есть вопрос
Да нет, усложнить код пытаетесь вы.
Длинные и сложные условия -- так выпишите вы их в несколько строк, какие проблемы? Но городить заборы операторных скобок...
...
Рейтинг: 0 / 0
04.01.2006, 13:38
    #33468039
Sarin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
читаю букварь... есть вопрос
Для особо упёртых можно сначала расчитать условия в нескольких строчках, а потом как Сапортер предложил.
...
Рейтинг: 0 / 0
04.01.2006, 13:43
    #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
04.01.2006, 14:31
    #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
04.01.2006, 14:50
    #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
04.01.2006, 15:14
    #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
04.01.2006, 15:21
    #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
04.01.2006, 15:46
    #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
04.01.2006, 16:34
    #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
04.01.2006, 19:08
    #33468400
дурачок
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
читаю букварь... есть вопрос
2 всем
для тех, кто еще не в танке - это VB|VBA код.
в VBA нет "как класса" сокращенного выполнения логических операций.
это вопрос про то, какой вариант "ручной" оптимизации "лучше"

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

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

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

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

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

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


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

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

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

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

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

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

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

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


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