2016-12-03 59 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刪除方法,但至少你可以做一些約定來使用實體外觀。 您可以選擇的另一種方法是使用結構模式來生成實體。請閱讀更多關於模式的內容,但你也應該小心使用它們。

相關問題