Основной вопрос разработки ОО - Должны ли мы инстанцировать DAO на другом DAO? (Зенд) - PullRequest
0 голосов
/ 07 декабря 2010

При условии, что у меня есть следующее:

TeamGamesDao Класс:

    public function listOfTeams() {
        $select = $this->select()
          ->from(array('t'=>'teams'), array('cod_team','name','score'));
        $rows = $this->fetchAll($select);
        foreach($rows as &$row) {
          $total = ????????????????????????????????
          $done = $this->_getTeamsGamesDone($row['teamid']);
            $row['percentage_of_games_done'] = $total > 0 ? ($done*100)/$total : 0);
        }

        return $rows;
    } 

private function _getTeamsGamesDone($teamid) {
   /* ... */
} 

И что, ???????? это значение, которое будет получено из класса GamesDao публичным методом, определенным как: getTotalGames();

Как мы должны вызвать его в listOfTeams ()?
Должны ли мы создать его экземпляр или назвать его статически, или какая-то третья возможность?

Заранее спасибо,
MEM

Ответы [ 2 ]

1 голос
/ 07 декабря 2010

Здесь следует помнить, что вызов getTotalGames() в классе GameDao происходит в цикле foreach($rows as &$row). Предполагая, что метод getTotalGames() выполняет свой собственный запрос БД, вы будете нажимать на БД один раз в каждой итерации цикла, что обычно не одобряется.

Альтернативой может быть переписать метод выполнения объединения таблиц игр и команд, который включает COUNT() и GROUP BY, чтобы получить количество игр на команду.

Тогда вы все равно сможете перебирать свои команды, но это только ударит по БД один раз.

1 голос
/ 07 декабря 2010

Короче говоря, использование статических методов делает полиморфизм невозможным.В результате это затрудняет тестирование кода (изолирует зависимости) и делает его менее расширяемым в целом.С другой стороны, если экземпляр DAO был передан классу в качестве зависимости, то это упростит тестирование и позволит менять различные реализации DAO во время выполнения.

...