Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

организация структуры выбора [PHP]

312
05 мая 2009 года
dead_star
392 / / 26.11.2006
вопрос больше по проэктированию
у меня есть массив в котором задается набор ключей которые характеризуют дальнейшие действия

 
Код:
$element1 = array("get", "set", "add", "del");
$element2 = array("set", "add");

по суте своей напоминает загруску и выполнение модулей
(пример: http://forum.codenet.ru/newthread.php?do=newthread&f=19 где do=newthread определяет модуль)
но в случае с модулями выполяется один модуль а не несколько

мне в голову пришло три способа организации выбора
первый базовый
Код:
if (isset($element1['get'])){
 // действия для элимента get
}
if (isset($element1['set'])){
 // действия для элимента set
}
if (isset($element1['add'])){
 // действия для элимента add
}
if (isset($element1['del'])){
 // действия для элимента del
}


второй, который мне кажется более удобным
Код:
foreach ($element1 as $do){
 switch($do){
  case 'get':
   // действия для элимента get
   break;
  case 'set':
   // действия для элимента set
   break;
  case 'add':
   // действия для элимента add
   break;
  case 'del':
   // действия для элимента del
   break;
 }
}


третий вариант который может быть более удобным при реализации ООП
Код:
foreach ($element1 as $do){
 $fname = "mod_".$do;
 if (function_exists($fname)){
  $fname();
 }
}
function mod_get(){
 // действия для элимента get
}
function mod_set(){
 // действия для элимента set
}
function mod_add(){
 // действия для элимента add
}
function mod_del(){
 // действия для элимента del
}


собственно вопрос какой из методов вы считаете
наиболее удобным
мение ресурсо емким
акураттным с точки зрения организации кода

может у вас есть какието предлажения на этот счет

в моем случае действия элимента занимают от 3 до 10 строчек
количество действий может со временем измениться
мне кажется что если действия элимента предстовляют из себя что-то действительно серьезное и честно заслуживают название "модуль"
то лучше использовать третий вариант и ООП, но какой использовать в моем случае не знаю
276
05 мая 2009 года
Rebbit
1.1K / / 01.08.2005
У первого варианта есть серезное преимущество - явно заданая последовательность обработки (не зависимая от масива с набором ключей).
Мое виденье следуючее. Делаем обработчик для каждого действия, которому передаем весь масив ключей, а он сам решает выполнятся или нет. Визиваем обработчики в нужной нам последовательности.
312
05 мая 2009 года
dead_star
392 / / 26.11.2006
Цитата: Rebbit
У первого варианта есть серезное преимущество - явно заданая последовательность обработки (не зависимая от масива с набором ключей).
Мое виденье следуючее. Делаем обработчик для каждого действия, которому передаем весь масив ключей, а он сам решает выполнятся или нет. Визиваем обработчики в нужной нам последовательности.



тоесть чтото типа?

Код:
$alldo = array("get", "set", "add", "del");
foreach ($alldo as $do){
 $fname = "mod_".$do
 $fname($element1);
}
function mod_get($elem){
 if (isset($elem['get'])){
  // действия для элимента get
 }
}
function mod_set($elem){
 if (isset($elem['set'])){
  // действия для элимента set
 }
}
function mod_add($elem){
 if (isset($elem['add'])){
  // действия для элимента add
 }
}
function mod_del($elem){
 if (isset($elem['del'])){
  // действия для элимента del
 }
}

и порядок выполнения действий опредиляет $alldo а не $element1
276
05 мая 2009 года
Rebbit
1.1K / / 01.08.2005
Не совсем. Я не знаю нужно ли вам такое, но допустим что обработка add всегда должна предшествовать обработке get. При вашей реализацыи вы зависите от порядка ключей в масиве [COLOR=#0000bb]alldo [/COLOR]происходжение которого мне неизвесно, но предполагаю что он извне.
Я предлагаю держать в отдельном масиве последовательность обработчиков (в том порядке в каком вам нужно) и foreach делать по ним.
312
05 мая 2009 года
dead_star
392 / / 26.11.2006
Цитата: Rebbit
Не совсем. Я не знаю нужно ли вам такое, но допустим что обработка add всегда должна предшествовать обработке get. При вашей реализацыи вы зависите от порядка ключей в масиве [COLOR=#0000bb]alldo [/COLOR]происходжение которого мне неизвесно, но предполагаю что он извне.
Я предлагаю держать в отдельном масиве последовательность обработчиков (в том порядке в каком вам нужно) и foreach делать по ним.



ну я собственно это и делаю
в элименте [COLOR="Blue"]$element1[/COLOR] приходят данные извне
а в элименте [COLOR="Blue"]$alldo[/COLOR] установлены все доступные обработчики в нужной мне последовательности
просто неочень коректно описал

276
05 мая 2009 года
Rebbit
1.1K / / 01.08.2005
Цитата: dead_star
ну я собственно это и делаю
в элименте [COLOR=Blue]$element1[/COLOR] приходят данные извне
а в элименте [COLOR=Blue]$alldo[/COLOR] установлены все доступные обработчики в нужной мне последовательности
просто неочень коректно описал


Ну тогда да. Я просто чуток недопонял.

304
06 мая 2009 года
Fenyx
707 / / 26.01.2005
Я не большой поклонник switch case, поэтому мне больше нравится конструкция If, только добавить else if и else.
Использовать foreach в для этой задачи считаю не самым удачным рещением, да и с точки удобочитаемости if или case выглядит наглядней + foreach все равно потом дергается ифом - смысл?
276
06 мая 2009 года
Rebbit
1.1K / / 01.08.2005
Цитата: Fenyx
только добавить else if и else.


Кажысь вы читали не внимательно :). else там никаким боком не пойдет

304
07 мая 2009 года
Fenyx
707 / / 26.01.2005
Цитата: Rebbit
Кажысь вы читали не внимательно :). else там никаким боком не пойдет


Возможно ) но все равно останусь при совем мнении foreach тут не нужен

4.9K
07 мая 2009 года
efferson
57 / / 08.12.2005
На мой взгляд идейно правильным является третий вариант. По сути ваша задача сводится к реализации классического контроллера. Я бы организовал это так:
Код:
/**
 * Контроллер
 */

class CSomeController
{
        /**
     * Обработчик запроса
     *
     * @param array $aRequest Данные HTTP-запроса
     * @return int Код успеха
     */

    public function handle( array $aRequest )
    {
            // Инициализация переменных
            $mResult = 0;

            try{

        // Проверка входных данных
        if( !isset( $aRequest['sType']  ) )
            throw new Exception( "Не задан тип действия" );

                // Обработка полученных данных
        $sType = $aRequest['sType'];

                // Определение запрашиваемого действия
        $sMethodName = "_Action" . strtoupper( $sType[0] ) . substr( $sType, 1 );
        if( !method_exists( $this, $sMethodName ) )
            throw new Exception( "Действие " . $sMethodName . " не определено" );
               
        // Вызов запрашиваемого действия
        $mResult = $this->{$sMethodName}( $aData );

        }

            // Обработка ошибок
        catch( Exception $e )
        {
            $mResult = -1;
        }

            return $mResult;

    }    // end function handle


    /**
     * Действие: Create
     */

    private function _ActionCreate( array $aData )
    {
            /**/
    }

    /**
     * Действие: Delete
     */

    private function _ActionDelete( array $aData )
    {
            /**/
    }

}    // end class CSomeController


// Обработка запроса
$oController = new CSomeController();
$iResult = $oController->handle( $_POST );


Аналогичные (почти) решения используются в таких фреймворках как ZF, Symfony и т.д.
312
07 мая 2009 года
dead_star
392 / / 26.11.2006
Цитата: efferson
На мой взгляд идейно правильным является третий вариант. По сути ваша задача сводится к реализации классического контроллера.



благодарю за код, он мне очень понравился
но боюсь вас огорчить
вы как Fenyx не совсем правильно поняли поставленный мною вопрос

вы предлагаете вариант решения для случая выбора 1 из n
один ключ действия и n элементов действия
выполняется 1 действие

меня же интересует решение для случая m из n
m ключей действия и n элементов действия (m<=n)
выполняется m действий

схемы очень похожи, но все же они различны

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог