一个基本的OO设计问题 - 我们是否应该在另一个DAO上实例化一个DAO? (Zend的)

时间:2010-12-07 00:23:36

标签: oop zend-framework

假设我有以下内容:

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 Class 的公共方法,其定义如下:getTotalGames();

我们应该如何在listOfTeams()上调用它?
我们应该实例化它还是静态地称它,或者第三种可能性?

提前致谢,
MEM

2 个答案:

答案 0 :(得分:1)

简而言之,使用静态方法使多态无法实现。结果,它使代码更难以测试(隔离依赖性)并且通常不易扩展。另一方面,如果DAO实例作为依赖项传递给类,那么它将使测试更容易,并允许在运行时交换DAO的不同实现。

答案 1 :(得分:1)

这里要注意的一件事是GameDao类对getTotalGames()的调用发生在foreach($rows as &$row)循环中。假设getTotalGames()方法执行自己的db查询,那么在循环的每次迭代中你都会遇到db一次,这通常是不受欢迎的。

另一种方法可能是重写方法以对包含COUNT()GROUP BY的游戏和团队表执行连接,以获得每个团队的游戏数量。

然后你仍然可以遍历你的团队,但它只会一次点击数据库。