2012-09-18 17 views
5

मैं एक फ्लैश गेमिंग वेबसाइट पर काम कर रहा हूं। मेरे पास दो मॉडल हैं: खेल और उपयोगकर्ता और एक मध्यवर्ती तालिका जिसमें मैं उपयोगकर्ता के कार्यों को उदाहरण के लिए रखता हूं: "उपयोगकर्ता 1 पसंद गेम 3"।'पसंद' कार्यक्षमता के लिए सर्वोत्तम अभ्यास

  1. मेरे जैसे फ़ंक्शन के लिए सबसे अच्छी जगह कहां है?
  2. खेल मॉडल में वर्तमान उपयोगकर्ता आईडी को पकड़ने के लिए यह एक अच्छा अभ्यास है? या मुझे इसे पैरामीटर के रूप में पास करना चाहिए?

प्रदर्शन कारणों से, मैं खेल तालिका में भी क्षेत्र को पसंद करता हूं। मैंने यह जांचने के लिए छोड़ा है कि उपयोगकर्ता इसे सरल रखने के लिए गेम को पहले से ही पसंद करता है या नहीं।
यहाँ मेरी विकल्प हैं:

प्रथम संस्करण:

$user->like(12345); 

class User 
{ 
    public function like($game_id) 
    { 
    $like = new User_Game(); 
    $like->user_id = $this->id; 
    $like->game_id = $game_id; 
    $like->save(); 

    $obj = new Game($game_id); 
    $obj->likes++; 
    $obj->save(); 
    } 
} 

दूसरा संस्करण:

$game->like(); // by current user 

class Game 
{ 
    public function like() 
    { 

    $like = new User_Game();  
    $like->user_id = $_SESSION[‘user_id’];  
    $like->game_id = $this->id;  
    $like->save(); 

    $this->likes++;  
    $this->save();  
    }  
}  
+0

'क्या यह गेम मॉडल में मौजूदा उपयोगकर्ता आईडी को पकड़ने के लिए एक अच्छा अभ्यास है?' नहीं 'या क्या मुझे इसे पैरामीटर के रूप में पास करना चाहिए? इसके बारे में सोचें, अभी आप सत्र में अपने सक्रिय उपयोगकर्ता की आईडी स्टोर करते हैं, तो क्या होता है यदि बाद में आप इसे कहीं और स्टोर करते हैं? सबसे महत्वपूर्ण बात यह है कि आपका फ़ंक्शन केवल वर्तमान सक्रिय उपयोगकर्ता के लिए उपयोग योग्य है, आप किसी भी अन्य उपयोगकर्ता के लिए '() 'नहीं कर सकते हैं। उपयोगकर्ता आईडी बाहरी निर्भरता है, आपके गेम मॉडल को बांधने के लिए बिल्कुल कोई कारण नहीं है, [निर्भरता इंजेक्शन] (http://en.wikipedia.org/wiki/Dependency_injection) पर पढ़ें। – yannis

उत्तर

1

पूरी तरह से ईमानदारी से कहूं तो मुझे यकीन है कि नहीं कर रहा हूँ अगर यह एक प्रश्न के लिए सबसे अच्छी जगह है इसके जैसा। शायद codereview एक बेहतर फिट है। सभी चीजें एक तरफ, आईएमओ, आप दोनों में से कोई भी सुझाव नहीं देता है "सर्वोत्तम दृष्टिकोण"। लेकिन हमेशा के रूप में, यह एक निजी बात हो सकती है।
मेरे विचार में, ओओपी के बारे में जाने का सबसे अच्छा तरीका है, अपने सभी डेटा को ASAP ऑब्जेक्ट्स में धक्का देना, और एक सेवा परत को कार्यान्वित करना जो संचालन की देखभाल करता है जिसके लिए कई प्रश्नों की आवश्यकता होती है, या कई ऑब्जेक्ट्स।

यदि मुझे लगता है कि आप एक एमवीसी-आईएसएच पैटर्न का उपयोग कर रहे हैं, तो आपके नियंत्रक को डेटा प्राप्त होता है। वहां, आप Game ऑब्जेक्ट को तुरंत चालू करते हैं, और आईडी को 123456 पर सेट करते हैं। आप उस उदाहरण को fillGameModel(Game $gameInstance) नामक सेवा विधि में पास कर सकते हैं। यह विधि डीबी से जुड़ती है, और Game ऑब्जेक्ट के सभी अन्य गुण सेट करती है और इसे वापस कर देती है। User ऑब्जेक्ट के लिए ही चला जाता है। इन दोनों वस्तुओं को फिर किसी अन्य सेवा विधि में पास किया जा सकता है: likeGame(Game $game, User $user)। वह विधि बाकी की देखभाल कर सकती है।
व्यक्तिगत रूप से, मैं एक कदम आगे भी जाऊंगा और मेरे डीबी एक्सेस के लिए मैपर का उपयोग करूंगा, लेकिन अब मैं इसमें नहीं जा रहा हूं। यहाँ एक सेवा का उपयोग कर एक उदाहरण है, और एक अधिक OO दृष्टिकोण:

//controller: 
$user = new User(); 
$user->setId($_SESSION['user_id']); 
$game = new Game(); 
$game->setId(123456);//wherever you get this from 
$service = new MainService(); 
$service->userLikes($game,$user); 

//service: 
public function userLikes(Game $game, User $user) 
{ 
    $user = $this->_completeUser($user); 
    $game = $this->_completeGame($game); 
    //insert or update whatever data you need... 
} 

protected function _completeUser(User $user) 
{ 
    $db = $this->_getConnection();//asuming PDO, to keep things simple 
    $query = 'SELECT * FROM my_db.users WHERE id = ?'; 
    $stmt = $db->prepare($query); 
    $row = $stmt->fetch(PDO::FETCH_ASSOC); 
    foreach ($row as $field => $value) 
    {//this implies getters and setters in your model 
     $user->{'set'.ucfirst(strtolower($field))}($value); 
    } 
    return $user; 
} 

protected function _completeGame(Game $game) 
{ 
    $db = $this->_getConnection(); 
    $query = 'SELECT * FROM my_db.games WHERE id = ?'; 
    $stmt = $db->prepare($query); 
    $row = $stmt->fetch(PDO::FETCH_ASSOC); 
    foreach ($row as $field => $value) 
    {//field id becomes "setId" method, field name "setName" etc... 
     $game->{'set'.ucfirst(strtolower($field))}($value); 
    } 
    return $game; 
} 

//just for show: a pseudo-overloader method, if your models all share the same 
//abstract class. 
protected function _completeAny(Model_Abstract $model) 
{ 
    $modelName = get_class($model); 
    if (method_exists($this,'_complete'.$modelName)) 
    { 
     return $this->{'_complete'.$modelName}($model); 
    } 
    throw new Exception('No completion method for '.$modelName.' found'); 
} 

फिर, resultset के माध्यम से छोरों एक सार मॉडल वर्ग कि तर्क के रूप में एक सरणी लेता है, और करने के लिए fieldnames बदल देती है में एक विधि के साथ प्रतिस्थापित किया जा सकता उनके संबंधित सेटर्स। अमूर्तता के लिए बहुत सारे कमरे, मैं कहूंगा ;-)

संबंधित मुद्दे