ФорумПрограммированиеPHP для идиотовPHP и ООП → Свой pastebin

Свой pastebin

  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 7 июня 2010 г. 13:59, спустя 6 минут 48 секунд

    Обдумываю свою реализацию pastebin. Пока пробую спроектировать только Model.

    Класс PastebinModel должен из исходного текста выдать сформатированный html, по указанной схеме. То есть должен быть набор разных синтаксических парсеров. Очевидно, что этот HTML может быть затребован многократно и его стОит где-то держать готовый. Хотелось бы не привязывать класс к конкретному Backend. Может понадобиться файловое хранилище или MySQl или Redis. Сталобыть опишу интерфейсы.


    class PastebinModel
    {
     public function __construct(IPastebinBackend $backend) {}

     public function parseAndSave($text, $parserId, $userId) {} // returns id:integer
     public function getHtmlById($id) {} // returns html
     public function getSourceById($id) {} // returns array(text, parserId, userId, time)
    }

    interface IPastebinParser
    {
     public function parse($text); // returns html
    }

    interface IPastebinBackend
    {
     public function save($text, $html, $parserId, $userId, $time); // returns id:integer
     public function load($id); // returns array(text, html, parserId, userId, time)
    }

    class PastebinParserLocator
    {
     public static function getParserById($parserId); // returns parser:IPastebinParser
    }


    Есть у кого замечания?
    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 7 июня 2010 г. 10:50, спустя 20 часов 50 минут 47 секунд

    круто, пошел за попкорном, обожаю темы-диалоги в твоем и твоем лице :)
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 7 июня 2010 г. 11:33, спустя 42 минуты 52 секунды

    дуд, что я крут я и так знаю. мне надо увидеть какое-нибудь глупое замечание, чтобы утвердиться в своём мнении.
    ιιlllιlllι унц-унц
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 7 июня 2010 г. 13:38, спустя 2 часа 4 минуты 52 секунды

    дуд, что я крут я и так знаю. мне надо увидеть какое-нибудь глупое замечание, чтобы утвердиться в своём мнении.

    Зачем нужен public function parse($text, $parserId, $userId) в интерфейсе?
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 7 июня 2010 г. 13:50, спустя 12 минут 47 секунд

    Чтобы распарсить исходный текст и сохранить все данные. На выходе идентификатор записи.
    ιιlllιlllι унц-унц
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 7 июня 2010 г. 13:52, спустя 1 минуту 54 секунды

    artoodetoo, ладно, ты крут
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 7 июня 2010 г. 14:02, спустя 9 минут 58 секунд

    Ну вот. Это несерьезно.

    Переименовал в parseAndSave() — так будет лучше отражать суть.
    ιιlllιlllι унц-унц
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 7 июня 2010 г. 14:16, спустя 13 минут 46 секунд

    терпеть не могу методы с такими названиями… ИМХО должен быть и тот и тот отдельно, чтобы связность, или как её там, была меньше между этими логиками. Соответственно, тогда вырисовывается другая фишка - бэкенд для сохранения (который у тебя есть) и парсер (которого нет какбы). Ну, так как у тебя модель делегирует функции парсинга самому парсеру внутри, то наверно всё нормально, кроме как от куда пользователь parseAndSave($text, $parserId, $userId) будет знать какие доступны parserId парсеров?
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 7 июня 2010 г. 14:29, спустя 13 минут 17 секунд

    Я подумал, возможно стОит вычилять хеш от пары (text, parserId) и искать по нему. Пусть md5.

    Предположим мой pastebin будет использоваться в движке форума. Когда кто-то добавляет код, например, php — этот код обрабатывается один раз и сохраняется. Сохраняется и готовый html.
    Потом сообщение кто-то цитирует. Надо ли заводить новую запись в pastebin? Нет! Достаточно выдать тот же самый html, а вычислить его можно по хешу.
    Можно принять правило, что id - это и есть md5 от serialize(array(text, parserId))
    Спустя 205 сек.
    Пользователь знает parserId-ы из пользовательского инферфейса (вебстранички), которую мы здесь не рассматриваем. Будем считать, что пользователь просто выбирает варианты из выпадающего списка или типа того.

    Спустя 98 сек.
    Модель не знает какие парсеры доступны. Она обращается к сервис локатору

    $parser = PastebinParserLocator::getParserById($parserId);
    $html = $parser->parse($text);
    ιιlllιlllι унц-унц
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 7 июня 2010 г. 14:35, спустя 5 минут 30 секунд

    Она обращается к сервис локатору

    ну не знает, а переменную $parserId от куда берёт? Должен быть либо метод PastebinParserLocator::getAllowedParserIds() либо PastebinParserLocator должен инжектироваться в модель пасте бин
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 7 июня 2010 г. 15:37, спустя 1 час 2 минуты 1 секунду

    обожаю темы-диалоги в твоем и твоем лице :)

    и я
    Спустя 30 сек.
    давай, жги!
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 7 июня 2010 г. 22:03, спустя 6 часов 26 минут 22 секунды

    kostyl, parserId это сущая хуйня. Валидация пользовательских данных не наша тема.
    Ну предположим пользователь опечатался или в нашей форме что-то не так. Если parserId неверный, сервис локатор не сможет найти/создать соответствующий парсер и выкинет исключение, пользователь получит страницу с сообщением об ошибке. Не надо отдельных публичных методов для валидации id!

    ιιlllιlllι унц-унц
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 7 июня 2010 г. 22:21, спустя 17 минут 55 секунд

    я только не могу вкурить, че это будет. Фронтенд для Geshi?
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 7 июня 2010 г. 22:31, спустя 10 минут 23 секунды

    Давай разберёмся с методом parseAndSave(). Может быть название и правда не очень удачное. Пусть будет просто parse()! Пусть он возвращает не id записи, а сразу отпарсенный html. Всё остальное будет скрыто внутри.
    Для того, кто обращается к нашей модели неважно в какой момент происходит сохранение данных. Он породил объект пастебин, затем хочет получить html. Каким-то образом он получил от пользователя текст и признак к какому языку относится этот текст.

    $pastebin = new PastebinModel(MysqlPastebinBackend);
    $html = $pastebin->parse($text, $parserId, $userId);

    Всё. Возможно данные содержат ошибки и parserId неверный, тогда пастебин выдаст исключение и ничего не сохранит. Если всё ок, пастебин вернет html.

    Наш новый вариант пастебина

    class PastebinModel
    {
     private $backend;

     public function __construct(IPastebinBackend $backend)
     {
       $this->backend = $backend;
     }

     public function parse($text, $parserId, $userId)
     {
       $hash = md5(serialize(array($text, $parserId)));
       $html = $this->backend->getByHash($hash); // попытаемся найти уже отпарсенную версию
       // если не нашли
       if (!$html) {
         // надо отпарсить и сохранить на будущее
         $parser = PastebinParserLocator::getParserById($parserId); // если $parserId неверный, здесь возникнет исключение
         $html = $parser->parse($text, $parserId);
         $this->backend->save($hash, $text, $html, $parserId, $userId, time()); // $hash - наш будущий ключ для поиска
       }
     }
    // …
    }
    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 7 июня 2010 г. 22:33, спустя 1 минуту 52 секунды

    ты реализуешь "прокси" чтоли?
    Сапожник без сапог

Пожалуйста, авторизуйтесь, чтобы написать комментарий!