Нужен совет по оптимизации функции

855
.
# Delphinum (26.08.2016 / 21:56)
ДоХтор, ну это естественно, для того функции и нужны. Проблема только в том, что никто не знает, когда понадобится та или иная функция. Я считаю (перенося опыт из ООП), что у функции должна быть "одн
Я понял, благодарю
.
Delphinum, сделал разделение... На мой взгляд стало ещё хуже -- кода больше, и читабельность снизилась. Да и где-то у меня в логике ошибка, потому что теперь не работают вызовы более одного. Но мне нужен ответ на вопрос, правильно ли я сделал разделение? Что-то мне подсказывает, что нет
Набор функций (+/-)
Использование (+/-)
.
Delphinum
ДоХтор, Я бы подкорректировал семантику функций:
getNameFile -> getFilePath
setData($id) -> setData($id, $data)
outData - не понял что эта функция должна делать

Опиши мне задачу подробнее, я напишу как бы сделал я.
.
Delphinum
outData - не понял что эта функция должна делать
Проверять время и число кликов, и в зависимости от их значений, возвращать ссылку с числом оставшихся кликов, или пустую строку
Опиши мне задачу подробнее
Отобразить ссылку и число допустимых кликов по этой ссылке, а так же - задать отрезок времени, по истечению которого число кликов будет обнуляться.
.
ДоХтор, ну если ты работал через файлы, я так и продолжу:
<?php
// Model
/**
 * Создает ссылку.
 *
 * @param string $href Адрес ссылки.
 * @param string $label Текст ссылки.
 * @param int $clickLimit Число допустимых кликов по ссылке.
 *
 * @return array Структура ссылки.
 */
function createLink($href, $label, $clickLimit = 10){
  return [
    'href' => $href,
    'label' => $label,
    'currentClicks' => 0,
    'clickLimit' => 10,
    'added' => time(),
  ];
}

/**
 * Загружает конфигурацию ссылки из файла.
 *
 * @param string $file Адрес файла, хранящего конфигурацию ссылки.
 *
 * @return array|null Конфигурация ссылки.
 */
function loadLink($file){
  if(!file_exists($file)){
    return null;
  }
  return unserialize(file_get_contents($file));
}

/**
 * Сохраняет конфигурацию ссылки в файл.
 *
 * @param string $file Целевой файл.
 */
function saveLink($file){
  file_put_contents(serialize($file));
}

// View
function renderLink(array $link){
  return '<a href="' . $link['href'] . '">' . $link['label'] . '</a>';
}

// Controller
function route($regex, callable $handler){
  $match = [];
  if(preg_match($regex, $_SERVER['REQUEST_URI'], $match) === false){
    return $handler($match);
  }
  return false;
}
?>


Использование:
<?php
// Заход на главную страницу
route('/', function(array $match){
  // Получаем ссылку или создаем новую
  $link = loadLink('test.link');
  if(is_null($link)){
    $link = createLink('http://site.com?link=test', 'текст', 15);
  }

  echo renderLink($link);
});

// Заход на страницу со ссылкой
route('?link=test', function(array $match){
  $link = loadLink('test.link');
  // Если такой ссылки еще нет, просто создаем новую
  if(is_null($link)){
    $link = createLink('http://site.com?link=test', 'текст', 15);
  }
  // Если ссылка была создана более дня назад, обновляем ее
  elseif(($link['added'] - (new DateTime('+1 day'))->getTimestamp()) < time()){
    $link = createLink('http://site.com?link=test', 'текст', 15);
  }

  // Сохраняем и отображаем ссылку
  $link['currentClicks']++;
  saveLink($link);
  echo renderLink($link);
});
?>


Не знаю, рабочий ли это код, но надеюсь смысл будет понятен.
.
elseif(($link['added'] - (new DateTime('+1 day'))->getTimestamp()) < time()){

тут должен быть не минус, а плюс
.
Delphinum, спасибо за код ) На мой взгляд, такой подход ближе к ооп. А для процедурного, наверное, всё-таки будет ближе мой вариант (с множеством global внутри функции). Я не настаиваю на этом, это моё мнение, и оно может быть ошибочным.
Всего: 47