Перепишите этот код более аккуратно, без всего прочего - PullRequest
0 голосов
/ 06 июня 2011

Я хочу переписать этот код без такого большого количества "чужих", но при этом сохранить его эффективным с точки зрения отсутствия проверки или выполнения запросов, если в этом нет необходимости.

Может кто-нибудь предложить лучший способ написать эту функцию?

public static function fetch($content) {

    products_library::init();
    self::$cache = $cache = url::assetsPath() . '../cache/soldout_cache';

    //check the cache
    if (file_exists($cache)) {
        $cache_date = filectime($cache);
        db::select('date_modified');
        db::orderBy('date_modified DESC');
        db::limit(1);
        $mod_date = db::get('sc_module_products')->fetch(PDO::FETCH_ASSOC);
        if ($mod_date) {
            $mod_date = strtotime('date_modified');
            if ($cache_date >= $mod_date) { //serve the cache
                try {
                    $soldout = filewriter::read($cache);
                    $soldout = unserialize($soldout);
                } catch (Exception $e) {
                    $soldout = self::query();
                }
            }
            else
                $soldout = self::query();
        }
        else
            $soldout = self::query();
    }
    else
        $soldout = self::query();

    $data['items'] = $soldout; // print_r($items); exit;

    $html = view::load('Product_Display', $data, true);
    return $html;
}

Спасибо

Ответы [ 5 ]

2 голосов
/ 06 июня 2011

Реорганизовал его в метод, который возвращает вместо операторов else

private static function getSoldout() {
    self::$cache = $cache = url::assetsPath() . '../cache/soldout_cache';

    //check the cache
    if (!file_exists($cache)) {
      return self::query();
    }

    $cache_date = filectime($cache);
    db::select('date_modified');
    db::orderBy('date_modified DESC');
    db::limit(1);
    $mod_date = db::get('sc_module_products')->fetch(PDO::FETCH_ASSOC);
    if (!$mod_date) {
      return self::query();
    }

    $mod_date = strtotime('date_modified');
    if ($cache_date < $mod_date) {
      return self::query();
    }

    try {
      //serve the cache
      $soldout = filewriter::read($cache);
      $soldout = unserialize($soldout);
      return $soldout;
    } catch (Exception $e) {
      return self::query();
    }
}

public static function fetch($content) {

    products_library::init();

    $soldout = self::getSoldout();

    $data['items'] = $soldout; // print_r($items); exit;

    $html = view::load('Product_Display', $data, true);
    return $html;
}

Я не понимаю эту строку, есть ли там ошибка?

$mod_date = strtotime('date_modified');
1 голос
/ 06 июня 2011

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

public static function fetch($content) {

    products_library::init();
    self::$cache = $cache = url::assetsPath() . '../cache/soldout_cache';

    $soldout = self::fetchCache($cache);
    if ($soldout === false)
    {
        $soldout = self::query();
    }

    $data['items'] = $soldout; // print_r($items); exit;

    $html = view::load('Product_Display', $data, true);
    return $html;
}

public static function fetchCache($cache) {
    if (file_exists($cache)) {
        $cache_date = filectime($cache);
        db::select('date_modified');
        db::orderBy('date_modified DESC');
        db::limit(1);
        $mod_date = db::get('sc_module_products')->fetch(PDO::FETCH_ASSOC);
        if ($mod_date) {
            $mod_date = strtotime('date_modified');
            if ($cache_date >= $mod_date) { //serve the cache
                try {
                    $result = filewriter::read($cache);
                    $result = unserialize($soldout);
                    return $result;
                } catch (Exception $e) {
                    return false;
                }
            }
        }
    }
    return false;
}
1 голос
/ 06 июня 2011

Установите $ soldout в NULL. Затем удалите оператор else $soldout = self::query().

После теста if тест $ soldout для NULL и значение true запустят запрос.

1 голос
/ 06 июня 2011

Блок распределительного шкафа будет творить чудеса здесь. У вас просто будет оператор break, который будет указывать на регистр по умолчанию. Тем не менее, если бы я был на вашем месте, я бы попытался провести рефакторинг всего этого, что заняло бы больше, чем быстрое исправление.

0 голосов
/ 06 июня 2011

Мне кажется, что вы могли бы по умолчанию $ soldout быть self :: query (), установив его перед первой проверкой if, затем удалить все остальные, поэтому, если условия не совпадают, все равно будет self :: запрос (). Может не работать в зависимости от того, что делает self :: query ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...