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

Свой pastebin

  • Абырвалг

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

    Spritz 8 июня 2010 г. 9:56, спустя 1 час 41 минуту 29 секунд

    artoodetoo, ты и не ложился спать шоле?
  • artoodetoo

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

    Spritz 8 июня 2010 г. 9:58, спустя 2 минуты 15 секунд

    чуток поспал. сейчас сижу накофеиненный. веки спичками расклинил
    ιιlllιlllι унц-унц
  • kostyl

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

    Spritz 8 июня 2010 г. 13:05, спустя 3 часа 6 минут 54 секунды

    ну мне кажется надо решить, что должна знать о парсере(ах) твоя модель
    Вот насчет бэкенда хранилища ты сразу решил, что она ничего кроме интрефрейса на должны знать.
    А парсер ты берешь из статического обращения - это означает, что твоя модель знаешь о классе парсеров и
    даже если ты определил интерфейс парсера, всё равно обращение к статике ты всё вывалил наружу.
    Это моё лично ИМХО, то есть я за Push approach именно.
    А вообще и так пойдёт )
  • artoodetoo

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

    Spritz 8 июня 2010 г. 13:36, спустя 30 минут 29 секунд


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

    чушь. я знаю только класс-локатор. помоему ты слишком зациклен на одном способе разруливания зависимости.
    я бы придушил того, кто писал русскую страничку wiki про Dependency injection. какбы и не ложь, но иные способы проскакивают без подробностей и ссылок. лучше всего расписано на agiledev, ссылку я приводил выше.

    open your mind!
    ιιlllιlllι унц-унц
  • kostyl

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

    Spritz 8 июня 2010 г. 13:30, спустя 23 часа 54 минуты 23 секунды

    artoodetoo, ну я ж говорю ИМХО ;)
  • artoodetoo

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

    Spritz 8 июня 2010 г. 13:55, спустя 24 минуты 27 секунд

    Как-то ты рано сдаешся. Обосновывай своё ХО.
    Я знаю слабое место в моей реализации - интерфейс в локаторе никак не проверяется :) А наверное надо и сделать это нетрудно.
    Спустя 295 сек.
    Я передаю в пастебин не готовый объект, а текстовый id парсера потому что мне хочется сохранить его в базе. Я вижу в существующих пастебинах, что инфа о языке сохраняется.
    Я передаю в пастебин готовый бекэнд, потому что мне незачем сохранять в базе инфу о базе.
    ιιlllιlllι унц-унц
  • kostyl

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

    Spritz 8 июня 2010 г. 14:08, спустя 12 минут 57 секунд

    artoodetoo, та я не сдаюсь, просто я же тебя не сильно знаю, начнёшь еще психовать ;) а я не хочу ссориться ))
    Я считаю, что если у тебя есть модель, то она просто должна быть не зависимой от внешней среды. Статика убивает эту независимость. А если ты проинжектишь контрейнер парсеров, дав знать модели об интерфейсе объекта (при инжекте тип и проверишь), то тут всё что мне не нравиться ляжет в свои пазы, как ложиться сейчас бекенд сохранения.
  • artoodetoo

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

    Spritz 8 июня 2010 г. 14:13, спустя 5 минут 27 секунд

    хорошая у меня ава, правда?

    я соглашусь что надо передавать готовый парсер через конструктор, если ты мне объяснишь:
    1. как я смогу сохранить в базе ссылку на тип распарсенного текста
    2. как ты видишь создание объекта парсера без локатора. вот из формы поступили текстовые поля тип текста и сам текст, что дальше…
    ιιlllιlllι унц-унц
  • kostyl

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

    Spritz 8 июня 2010 г. 14:35, спустя 21 минуту 56 секунд

    щас накидаю
  • artoodetoo

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

    Spritz 8 июня 2010 г. 14:38, спустя 3 минуты 17 секунд

    я уже приготовил плюсомёт…
    ιιlllιlllι унц-унц
  • kostyl

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

    Spritz 8 июня 2010 г. 15:06, спустя 27 минут 59 секунд

    короче по шурику писал, може где то что то нет, но думаю понятно будет что я хотел:
    <?php
    class PastrbinModel {
    private $_backend;
    private $_parsers;

    public function __construct(Backend $backend, Parsers $parsers)
    {
    private $this->_backend = $backend;
    private $this->_parsers = $parsers;
    }

    public function parse($parserId, $text, $userId)
    {
    $result = $this->_backend->load($userId, $parserId, $text);

    if (!$result) {

    $parser = $this->_parsers->find($parserId);
    if (!$parser) {
    return false;
    }

    $result = $parser->parse($text);
    $this->_backend->save($userId, $parserId, $text, $result);
    }

    return $result;
    }

    public function getParsersIds()
    {
    return $this->_parsers->getIds();
    }

    }

    class Parsers {

    private static $_instances = array();


    private static $_allowedIds = array(
    'html',
    'php'
    )

    public function find($parserId)
    {
    if (!in_array(self::$_allowedIds)) {
    return false;
    }

    if (!isset(self::$_instances[$parserId])) {
    $className = 'Parser' . $parserId;
    self::$_instances[$parserId] = new $className();
    }

    return self::$_instances[$parserId];
    }

    public function getIds()
    {
    return self::$_allowedIds();
    }
    }


    class Backend {

    public function save($userId, $parserId, $text, $html)
    {
    //как нить сохраняешь
    //что трудно сохранить чтоли $parserId в виде стобца в таблице
    //или просто файл с именем 'data_' . $parserId . '_' . $userId . '_' . md5($text);
    //да масса вариатнов
    }

    public function load($userId, $parserId, $text)
    {
    }

    }

    //Пользователь отправил форму
    //ты выделил $bb = 'js' $text = "alert('aaa');"

    $pastebinBackend = Toolkit::getBackend('file')
    $pastebinParsers = new Parsers();
    $pastebin = new PastrbinModel($pastebinBackend, $pastebinParsers);

    $html = $pastebin->parse($bb, $text, $user->id);
    if ($html === false) {
    $view->bbenabled = $pastebin->getParsersIds();
    }
    else {
    $view->text = $html;
    }

  • Абырвалг

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

    Spritz 8 июня 2010 г. 15:07, спустя 50 секунд

    Урааа, Костян пишет имена методов и переменных с маленькой буквы!
  • kostyl

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

    Spritz 8 июня 2010 г. 15:09, спустя 1 минуту 51 секунду

    Абырвалг, ага ))
  • kostyl

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

    Spritz 8 июня 2010 г. 17:35, спустя 2 часа 25 минут 54 секунды

    artoodetoo, ну чё, пли! или даже плюй! ))
  • artoodetoo

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

    Spritz 8 июня 2010 г. 19:07, спустя 1 час 32 минуты 11 секунд

    Вцелом понятно. Лишние private в теле конструктора, in_array() с одним аргументом спишем на невнимательность.

    По существу: тайпхинтинг в конструкторе надо делать через интерфейсы, а не конкретные классы. У тебя фактически связи не ослабли. Ты ссылаешся на конкретный класс Parsers в котором к тому же перечислены конкретные языки (т.е. косвенно указаны классы-парсеры). Очень жестко всё повязано. То есть цель не достигнута.


    ιιlllιlllι унц-унц

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