PHP обратный вызов против шаблона - PullRequest
0 голосов
/ 24 июля 2011

Я создал класс рендеринга списка:

class ListRenderer
{
    /**
     * @param int $columns number of columns
     * @param string $element container element
     * @param string $styleClass container style
     */
    public function __construct($columns,$element='div',$styleClass=''){...}
    ...
    /**
     * @param mixed $callback function to render items - should take two
     *        parameters ($item,$index)
     * @param array $list items to render
     */
    public function renderArrayList($callback,$list){...}

    /**
     * @param mixed $callback function to render items - should take 3 parameters
     *        ($row,$i,$count) $i and $count are the position and total items
     * @param string $sql query string
     * @param string $errorMessage
     * @param int $blanks number of blank items to render. The callback will be
     *        invoked with a null $row parameter for the blank records.
     */
    public function renderQueryList($callback,$sql,$errorMessage,$blanks=0){...}
    ...
}

Функция обратного вызова отображает один элемент.

Это также может быть выполнено с использованием шаблонов:

class ListRenderer
{
    ...
    //$itemRenderer implements ListItemRenderer
    public function renderArrayList($itemRenderer,$list){...}
    //$itemRenderer implements ListItemRenderer
    public function renderQueryList($itemRenderer,$sql,$errorMessage,$blanks=0){...}
    ...
}

template ListItemRenderer
{
    public function renderArrayItem($item,$index);
    public function renderQueryItem($row,$index,$count);
}

class SomeClass implements ListItemRenderer
{
    ...
    public function renderArrayItem($item,$index){...}
    public function renderQueryItem($row,$index,$count){...}
    ...
}

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

Мне кажется, что:

  • Обратные вызовы более гибкие
    • Шаблоны будут ограничиватьнапример, от одного класса к одной функции renderArrayItem, где обратные вызовы позволят использовать для этой цели несколько функций на класс.
    • При использовании шаблонного подхода функция должна быть членом класса.
  • Обратные вызовы, как правило, приводят к меньшему количеству поддерживаемого кода.

Есть ли веские причины пойти тем или иным путем?

1 Ответ

0 голосов
/ 24 июля 2011

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

Поэтому я спрашиваю: почему одно против другого?Если вы все еще не знаете, каким путем идти, или не уверены, хотите ли вы одно или другое явно, почему бы вам не сделать вариант обратного вызова, который вы можете использовать при необходимости?Вы можете внедрить обратные вызовы при создании экземпляра класса:

class ListItemCallbackRenderer implements ListItemRenderer
{
    private $callbacks;
    public function __construct(array $callbacks)
    {
        $this->callbacks = $callbacks;
    }
    public function renderArrayItem($item,$index)
    {
        $callback = $this->callbacks[__FUNCTION__];
        // ...
    }
    public function renderQueryItem($row,$index,$count)
    {
        $callback = $this->callbacks[__FUNCTION__];
        // ...
    }
}

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

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