Я создал класс рендеринга списка:
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, где обратные вызовы позволят использовать для этой цели несколько функций на класс.
- При использовании шаблонного подхода функция должна быть членом класса.
- Обратные вызовы, как правило, приводят к меньшему количеству поддерживаемого кода.
Есть ли веские причины пойти тем или иным путем?