Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > Оптимизация кода


Автор: diam 8.7.2006, 10:35
Здравствуйте.

Хочу предложить взгляд задачу по оптимизации кода php.

Задача.
Рассматриваем некий кусок кода в программе.
В этом коде есть два действия, которые нужно выполнить обязательно. Одно действие в начале рассматриваемого куска кода, другое действие - в конце этого же кода. Между описанными двумя действиями располагаются несколько других действий, которые выполняются последовательно. При этом если одно из действий выполняется с ошибками, то остальные действия даже не выполняются.
Задача: написать код, который будет работать по описанной схеме.

Предлагаемое решение.
Код

// выполняем какие-то действия в начале
doSomeActionsAtBegin();

// переходим к последовательному выполнению нескольких действий,
// причём, при возникновении ошибки на одном из этих действий небходимо
// прекратить выполнение оставшихся действий и "прыгнуть" в код, который
// идёт после этих действий
foreach (array('Выполнится только один раз') as $value) {
    $errors = action1();
    if ($errors) {
        break; // continue,  кому как нравится :)
    }

    $errors = action2();
    if ($errors) {
        break;
    }

    $errors = action3();
    if ($errors) {
        break;
    }

    // и т.д.
}

// выполняем какие-то действия в конце
doSomeActionsAtEnd();


Предложите другие решения. 

Автор: beroal 8.7.2006, 12:23
Например, вместо break использовать return. Ещё PHP5/Exceptions.  

Автор: ZlojEzh 8.7.2006, 13:10
Цитата(beroal @  8.7.2006,  12:23 Найти цитируемый пост)
Например, вместо break использовать return. Ещё PHP5/Exceptions. 

return прервет выполнение не только цикла, но и всего скрипта (либо инклудящегося файла)

а вообще особой необходимости в оптимизации не вижу
можно убрать временные переменные и писать сразу
Код

if (action1()) {...}

если действий всегда одинаковое количество (притом небольшое), можно использовать вложенные if'ы
Код

if (action1()) {
  if (action2()) {
    action3());
  }
}
 

Автор: DemoCode 8.7.2006, 13:18
А если так:

Код

for ($i = 1; $i < 4; $i++) {
   $func = 'action'.$i.'()';
   if ($func) break;
}
 

Автор: diam 8.7.2006, 19:24
Цитата(DemoCode @  8.7.2006,  16:18 Найти цитируемый пост)
А если так:
Код

for ($i = 1; $i < 4; $i++) {
   $func = 'action'.$i.'()';
   if ($func) break;
}


Цитата(ZlojEzh @  8.7.2006,  16:10 Найти цитируемый пост)
можно убрать временные переменные и писать сразу

Действия не всегда одинаковы. Код утрирован smile

Цитата(ZlojEzh @  8.7.2006,  16:10 Найти цитируемый пост)
если действий всегда одинаковое количество (притом небольшое), можно использовать вложенные if'ы

Действительно, можно.

Цитата(beroal @  8.7.2006,  15:23 Найти цитируемый пост)
Ещё PHP5/Exceptions.  

В Python я Exceptions и использовал. Как вариант smile.

Ещё будут варианты? 

Автор: beroal 9.7.2006, 09:09
Цитата(ZlojEzh @ 8.7.2006,  10:10)
Цитата(beroal @  8.7.2006,  12:23 Найти цитируемый пост)
Например, вместо break использовать return. Ещё PHP5/Exceptions. 

return прервет выполнение не только цикла, но и всего скрипта (либо инклудящегося файла).

А вы подумайте немного. Надо действия записать в тело функции, тогда всё будет в порядке. smile

Добавлено @ 09:10 
Цитата(diam @ 8.7.2006,  16:24)
Ещё будут варианты?

А зачем они нужны? 

Автор: Sardar 9.7.2006, 15:42
diam, приём пришёл из C, конструкция:

Код
do {
  if(!action1()) break;
  if(!action2()) break;
  if(!actionN()) break;
  .....
} while(false);


Хотя, ИМХО, исключения лучше т.к. имеют finally, черезвычайно необходимая вещь если точек вылета много.  В PHP finally нет...  smile  

Автор: diam 9.7.2006, 20:55
Цитата(beroal @  9.7.2006,  12:09 Найти цитируемый пост)
А вы подумайте немного. Надо действия записать в тело функции, тогда всё будет в порядке. smile

Тогда давайте тереотезировать дальше: когда нужно применять функции?

Цитата(Sardar @  9.7.2006,  18:42 Найти цитируемый пост)
Хотя, ИМХО, исключения лучше т.к. имеют finally, черезвычайно необходимая вещь если точек вылета много.  В PHP finally нет...  smile   

Sardar, согласен. Исключения вообще удобная штука smile. Но, мы говорим про php...  

Автор: Aliance 15.7.2006, 12:40
Цитата(Sardar @  9.7.2006,  16:42 Найти цитируемый пост)
В PHP finally нет... 

пока нет, но говорят что будут smile да и код finally можно разместить после блока catch, он же будет выполнен все равно smile 

Автор: jzZ 17.7.2006, 22:41
 
Цитата

При этом если одно из действий выполняется с ошибками, то остальные действия даже не выполняются.

Можно просто короче сделать сам синтаксис:
Код

foreach (array('Выполнится только один раз') as $value) {
    if (!action1() || !action2() || !action3() ) {
        break;
    }

а оптимизация это нечто другое, вот если бы задача была конкретная...
хотя хз может я не понял объяснений ':D' 

Автор: RobbieV 26.7.2006, 09:33
Код

doSomeActionsAtBegin();
    if ($errors = action1()) {
         //...
    }
    elseif ($errors = action2()) {
         //...
    }
    elseif ($errors = action3()) {
         //...
    }
    // и т.д.

doSomeActionsAtEnd();
   

Это стандартная конструкция. Во всех блоках условий, до момента true в одном из них, будет вызываться функция actionx(). Если наступает true, то выполняется код для обработки этой ошибки (если нужно), далее переходит сразу к doSomeActionsAtEnd(). Задача не имеет отношения к оптимизации, Вы выбрали конструкцию, которая изначально предназначена для другого.  

Автор: S.A.P. 26.7.2006, 09:54
Код

doSomeActionsAtBegin();
$success = action1() && action2() && action3();
doSomeActionsAtEnd();
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)