Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оптимизация кода 
:(
    Опции темы
diam
Дата 8.7.2006, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 348
Регистрация: 23.1.2005
Где: Екатеринбург

Репутация: нет
Всего: 16



Здравствуйте.

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

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

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

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

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

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

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

    // и т.д.
}

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


Предложите другие решения. 
PM MAIL   Вверх
beroal
Дата 8.7.2006, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 212
Регистрация: 18.1.2003
Где: Украина

Репутация: нет
Всего: 3



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

Это сообщение отредактировал(а) beroal - 9.7.2006, 09:07
PM WWW   Вверх
ZlojEzh
Дата 8.7.2006, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.10.2005
Где: Киев, Украина

Репутация: 1
Всего: 15



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

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

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

if (action1()) {...}

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

if (action1()) {
  if (action2()) {
    action3());
  }
}
 
PM MAIL ICQ   Вверх
DemoCode
Дата 8.7.2006, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 890
Регистрация: 20.10.2005
Где: Россия

Репутация: нет
Всего: 41



А если так:

Код

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


--------------------
Жить стало лучше, жить стало веселей
© И.В. Сталин 
PM MAIL ICQ   Вверх
diam
Дата 8.7.2006, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 348
Регистрация: 23.1.2005
Где: Екатеринбург

Репутация: нет
Всего: 16



Цитата(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.

Ещё будут варианты? 
PM MAIL   Вверх
beroal
Дата 9.7.2006, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 212
Регистрация: 18.1.2003
Где: Украина

Репутация: нет
Всего: 3



Цитата(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)
Ещё будут варианты?

А зачем они нужны? 
PM WWW   Вверх
Sardar
Дата 9.7.2006, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 2
Всего: 317



diam, приём пришёл из C, конструкция:

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


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


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
diam
Дата 9.7.2006, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 348
Регистрация: 23.1.2005
Где: Екатеринбург

Репутация: нет
Всего: 16



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

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

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

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

Это сообщение отредактировал(а) diam - 10.7.2006, 07:47
PM MAIL   Вверх
Aliance
Дата 15.7.2006, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: нет
Всего: 137



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

пока нет, но говорят что будут smile да и код finally можно разместить после блока catch, он же будет выполнен все равно smile 
PM MAIL WWW ICQ Skype   Вверх
jzZ
Дата 17.7.2006, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 17.7.2006

Репутация: 1
Всего: 2



 
Цитата

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

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

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

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

Это сообщение отредактировал(а) jzZ - 17.7.2006, 22:43
PM MAIL   Вверх
RobbieV
Дата 26.7.2006, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 25.7.2006

Репутация: нет
Всего: нет



Код

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

doSomeActionsAtEnd();
   

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

Это сообщение отредактировал(а) RobbieV - 26.7.2006, 17:48
PM MAIL   Вверх
S.A.P.
Дата 26.7.2006, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: нет
Всего: 71



Код

doSomeActionsAtBegin();
$success = action1() && action2() && action3();
doSomeActionsAtEnd();
 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.0583 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.