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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> оптимизация кода с while(true), и громоздким деревом условий 
:(
    Опции темы
kanaris
Дата 18.7.2010, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



22:44 18.07.2010

Разрабатываю систему, получается примерно такая структура:


Код

while(true){
    if($block==1){
        // очень много кода
    }

    if($block==2){
        // очень много кода
    }

    // ...

    if($block==n){
        // очень много кода
    }
}



Цикл выполняется бесконечно, пока не выполнит свою работу. Надо как-то сфабриковать участки "очень много кода". Есть такие варианты:
1) заключить в функции. Но есть недостатки - очень громоздкая функция получится + должно быть видно много переменных извне.
2) поместить их в отдельные файлы, и инклудить их каждый раз. Но возникает вопрос - если цикл выполняется долго, и каждый раз будет инклудиться файл, это наверное сильно скажется на производительности?
3) весь код будет в этом же файле - этот вариант использовать не хочу, т.к. сильно понизится понимаемость кода, файл получится как "Война и мир".

Подскажите, что лучше выбрать, из первых двух либо предложите лучшее что нибудь smile
PM MAIL   Вверх
skyboy
Дата 18.7.2010, 23:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



зависит от того, что именно происходит в "очень много кода": только ли вывод, обработка данных.
также стоит задуматься: зачем бесконечный цикл и куча if вместо одного switch(переменная-флаг $block может меняться в одной ветви, что заставит выполниться следующую ветвь без новой итерации цикла?).
мне кажется очень вероятным, что проблема в используемом алгоритме, а не в include и "очень много кода"
PM MAIL   Вверх
ksnk
Дата 18.7.2010, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



Цитата(kanaris @  18.7.2010,  22:56 Найти цитируемый пост)
очень громоздкая функция получится + должно быть видно много переменных извне.

Можно упихать все это в объект и вызывать методы объектов. 
тогда глобальные переменные гармонично перетекут в свойства объекта...
Для пущего страха можно сформировать массив методов объекта и схлопнуть цикл в 2 строки...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
IgorIV
Дата 19.7.2010, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



kanaris, а ты покажи хотя бы 3 if полностью.
PM MAIL   Вверх
kanaris
Дата 19.7.2010, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата
зависит от того, что именно происходит в "очень много кода": только ли вывод, обработка данных.


обработка данных

Цитата
зачем бесконечный цикл и куча if вместо одного switch(переменная-флаг $block может меняться в одной ветви, что заставит выполниться следующую ветвь без новой итерации цикла?).


Уже думал над этим вариантом, лучше будет вайл и иф. Задача такая - блоки должны переключаться между собой в произвольном порядке (один блок выполнился, в зависимости от результата передает выполнение другому блоку, и так перепасовываются). Только что проверил, переменная-флаг $block в switch если и поменяется в каком-нибудь case...break, выполнение другому блоку, которому она будет соответствовать не передастся.

Цитата
Можно упихать все это в объект и вызывать методы объектов. 
тогда глобальные переменные гармонично перетекут в свойства объекта...
Для пущего страха можно сформировать массив методов объекта и схлопнуть цикл в 2 строки... 


Я уже пробовал сделать сугубо на ООП, получилось много кода, в котором очень сложно разобраться, сейчас проектирую третью версию, предварительно разбив код на части, с учетом уровней абстракции. Я понял, что объекты нужно использовать там, где код по выполнению подобен объекту, а в данном случае нужно описать процесс, а не объект.

Цитата
kanaris, а ты покажи хотя бы 3 if полностью.


Кода для каждого if примерно столько: http://s50.radikal.ru/i129/1007/e0/9919d1aff3ee.gif
PM MAIL   Вверх
Muerto
Дата 19.7.2010, 07:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1207
Регистрация: 23.9.2006

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



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

ну во первых ты не прав, есь такая функция как require_once/include_once, она инклюдит всего один раз, а далее проверяер ....
В php 5.3 есть новая функция которая напоминает batch файлы, а точнее
goto

Вот так её используют:

Код

echo 'Кто же я?<br/>';
goto b;
echo 'Я кролик';
 
a:
echo 'Я кот';
b:
echo 'Я собака';


Вывод будет такой

Код

Кто же я
Я собака


А терь схема работы для тебя- берешь и ставишь все что в ифах в goto, и инклюдишь 1 раз...
user posted image

Это сообщение отредактировал(а) Muerto - 19.7.2010, 07:30


--------------------
user posted image
PM MAIL   Вверх
skyboy
Дата 19.7.2010, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



Цитата(Muerto @  19.7.2010,  06:22 Найти цитируемый пост)
есь такая функция как require_once/include_once

ага. и выполняется тоже - только один раз.
смысл в бесконечном цикле, если каждая ветка сможет выполниться только единожды?
kanaris, я не представляю себе, какая должна быть специфика, чтоб каждая из веток условия была заполнена абсолютно независимым от других веток кодом(алгоритмически - чтоб нельзя было вынести действия в функции с разными параметрами и по коду - чтоб просто не было общего кода и не было смысла выносить код в функции).  
PM MAIL   Вверх
IgorIV
Дата 19.7.2010, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



kanaris, если это 1 иф, то надо срочно менять алгоритм. Я так думаю, что у тебя все ифы сделаны через копи-пасте, просто изменив некоторые части. Попробуй функции.
PM MAIL   Вверх
Muerto
Дата 19.7.2010, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1207
Регистрация: 23.9.2006

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



skyboy,
А что мешает вынести все что в инклюдном файле в функцию
допустим первый include_once("a.php"); 
файл выглядит так
function a()
{
весь файл
}
И просто вызываем... Можно глобальные переменные сделать что бы функции говорили друг с другом...

Таким образом все функции кстати вообще в один файл пихнуть можна...


--------------------
user posted image
PM MAIL   Вверх
ArNic
Дата 22.7.2010, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Согласен с 
Цитата(IgorIV @  19.7.2010,  00:13 Найти цитируемый пост)
kanaris, а ты покажи хотя бы 3 if полностью. 


Как самое лучшее решение выложить сюда пример трех ифов и показать что за огромный код спрятан. Иначе получается следующий диалог:
"Ребята у меня вот дома лежит та-а-а-акая вот штука ... ну большая в общем как бы мне её засунуть в машину. Ну в багажник в пихнуть или на кусочки поделить и в салон засунуть. "
И что тебе должны ответить? Я думаю - "делай как знаешь".
Другой разговор, если ты говоришь:
"Ребята у меня вот дома лежит 50 киллограм конины и 20 гук яиц, как бы мне её засунуть в машину ВАЗ 2107 . Ну в багажник в пихнуть или на кусочки поделить и в салон засунуть. При том, что на улице сейчас зима "
Тут тебе люди смогут ответить. "Засунь максимально в багажник - там холоднее будет чем в салоне, но снчала постели целлофан, чтобы мясо не потекло. В принципе должно поместиться, если пустой он, а вот яица положи полку за задним сидением или лучше под ноги задних пассажиров, т.к. там меньшая вероятность разбиться."

Если обратился - кажи код. Или получай неопределенные ответы.



Это сообщение отредактировал(а) ArNic - 22.7.2010, 14:08
PM MAIL ICQ   Вверх
IgorIV
Дата 22.7.2010, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ArNic, вот здесь - http://forum.vingrad.ru/index.php?showtopi...t&p=2185088  в конце сообщения есть замыленный скриншот и это только 1 иф

Это сообщение отредактировал(а) IgorIV - 22.7.2010, 15:37
PM MAIL   Вверх
ArNic
Дата 22.7.2010, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я знаю что там рисунок smile 
Но я посмотрев на "замыленый" рисунок - не могу прочесть что там есть.
Ты думаешь мне нужно количество строк в ифе? Имеется ввиду что там написано, какой код, какая логика. 
Может тебе помогут решить со структурой такого большого ифа и его вообще не будет, когда увидят сам код.

Как решение могу посоветовать ещё один вариант:
Код


if(in_array($act,array('a','b','c'))) include_once('/k/'.$act.'.php');
else include_once('else.php');


а ифы уже по файлам

Это сообщение отредактировал(а) ArNic - 22.7.2010, 15:51
PM MAIL ICQ   Вверх
bazzjr
Дата 22.7.2010, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Если обратился - кажи код. Или получай неопределенные ответы.


ArNic,  +500 !

Это сообщение отредактировал(а) bazzjr - 22.7.2010, 15:54
PM MAIL ICQ   Вверх
IgorIV
Дата 22.7.2010, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ArNic
Цитата(ArNic @  22.7.2010,  16:48 Найти цитируемый пост)
Я знаю что там рисунок 

ааа ну извини ... smile я не знал что ты видел smile
А код - это коммерческая тайна, вдруг ты увидишь гениальные алгоритмы и украдешь их. позаимствуешь их.
PM MAIL   Вверх
ArNic
Дата 22.7.2010, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(IgorIV @  22.7.2010,  16:34 Найти цитируемый пост)
ArNic, 
Цитата(ArNic @  22.7.2010,  16:48 Найти цитируемый пост)
Я знаю что там рисунок 

ааа ну извини ... smile я не знал что ты видел smile
А код - это коммерческая тайна, вдруг ты увидишь гениальные алгоритмы и украдешь их. позаимствуешь их. 


Ну тогда уж ты меня извини.  smile  Придется тебе либо платить деньги за идею, наняв человека и подписав с человеком договор о неразглашении  smile , либо придется самому догонять, потому что никому здесь не хочется красть заимствовать гениальные алгоритмы  smile .
И потом все гениальное просто - следовательно, ИМХО, алгоритм не гениальный.  smile

Добавлено через 5 минут и 31 секунду
Кстати, совсем не гениально повторять код, а судя по пикселам и совпадению их в нескольких местах (смотри где у тебя 4 переменных расчитываются) повторение абсолютное. Следовательно if`ы могут быть и поменьше, если код оптимизировать.

Это сообщение отредактировал(а) ArNic - 22.7.2010, 16:41
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

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


 




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


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

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