2016-12-03 30 views
0

它的一个游戏网站,和我们店里的分数:Php,如果只允许从另一种方法调用某个方法,这是不是一个坏的标志?

class Game 
{ 
    public function addScore($player, $score) 
    { 
     INSERT INTO game ......... 
    } 
} 

管理员可以删除的分数所以让我们来添加一个清除方法太:

public function delete($id) 
{ 
    DELETE FROM game ......... 
} 

现在的问题是,删除记录,所以我们必须包装这个代码:

控制器:

$log->addLog('user deletetion'); 
$game->delete($id); 

所以当我们在控制器中删除这个游戏时,日志也发生了。现在问题来了:在代码中,没有什么可以阻止只调用$game->delete();方法!这是不好的,因为如果有任何菜鸟开始使用这段代码,他不知道删除必须伴随着日志记录。这是什么东西的标志,或?

+4

在Delete方法 – RiggsFolly

+1

放于用户角色和测试用户访问,以便把记录删除 – WEBjuju

+0

之前没有,那么“游戏“班级会做”太多“(SRP) –

回答

2

如果您总是希望在删除之前编写日志,那么只需将日志记录添加到delete()方法中就行了,因为RiggsFolly建议这是“原子”操作。

你会违反SRP,例如,除了记录+删除之外,你会用同样的方法弹出一个对话框。正如你将混合数据处理和UI在同一个方法。这是两个单独的责任。

1

这可以使用Facade模式解决。你需要像这样

class GameFacade{ 
    public function __constructor(Game $game, Logger $logger){ 
     $this-game = $game; 
     $this-logger = $logger; 
    } 

    public function delete($id) { 
     $this->game->delete($id); 
     $this->logger->log("Game deleted"); 
    } 
} 

所以,现在我们只使用这个门面Game实体工作。显然,你不能直接阻止新手使用Game删除方法,但至少你可以做一些约定来使用实体外观。 您可以选择的另一种方法是使用结构模式来生成实体。请阅读更多关于模式的内容,但你也应该小心使用它们。

相关问题