मैं अपनी प्रोग्रामिंग में DRY सिद्धांत का पालन करने की कोशिश कर रहा हूं जितना कि मैं कर सकता हूं। हाल ही में मैं ओओपी में डिजाइन पैटर्न सीख रहा हूं और मैंने खुद को काफी गुच्छा बना लिया है।
मैंने अपनी दृढ़ता को संभालने के लिए एक कारखाने और गेटवे पैटर्न के साथ एक रिपॉजिटरी पैटर्न बनाया है। मैं अपने एप्लिकेशन में एक डेटाबेस का उपयोग कर रहा हूं, लेकिन इससे कोई फर्क नहीं पड़ता क्योंकि मुझे गेटवे को स्वैप करने और किसी अन्य प्रकार की दृढ़ता पर स्विच करने में सक्षम होना चाहिए अगर मैं चाहता हूं।
मैंने अपने लिए जो समस्या बनाई है, वह यह है कि मेरे पास जितनी भी टेबल हैं, मैं उतने ही ऑब्जेक्ट बनाता हूं। उदाहरण के लिए ये वे वस्तुएं होंगी जिन्हें मुझे एक टेबल को संभालने की आवश्यकता है comments
।
class Comment extends Model {
protected $id;
protected $author;
protected $text;
protected $date;
}
class CommentFactory implements iFactory {
public function createFrom(array $data) {
return new Comment($data);
}
}
class CommentGateway implements iGateway {
protected $db;
public function __construct(\Database $db) {
$this->db = $db;
}
public function persist($data) {
if(isset($data['id'])) {
$sql = 'UPDATE comments SET author = ?, text = ?, date = ? WHERE id = ?';
$this->db->prepare($sql)->execute($data['author'], $data['text'], $data['date'], $data['id']);
} else {
$sql = 'INSERT INTO comments (author, text, date) VALUES (?, ?, ?)';
$this->db->prepare($sql)->execute($data['author'], $data['text'], $data['date']);
}
}
public function retrieve($id) {
$sql = 'SELECT * FROM comments WHERE id = ?';
return $this->db->prepare($sql)->execute($id)->fetch();
}
public function delete($id) {
$sql = 'DELETE FROM comments WHERE id = ?';
return $this->db->prepare($sql)->execute($id)->fetch();
}
}
class CommentRepository {
protected $gateway;
protected $factory;
public function __construct(iFactory $f, iGateway $g) {
$this->gateway = $g;
$this->factory = $f;
}
public function get($id) {
$data = $this->gateway->retrieve($id);
return $this->factory->createFrom($data);
}
public function add(Comment $comment) {
$data = $comment->toArray();
return $this->gateway->persist($data);
}
}
फिर मेरा कंट्रोलर कैसा दिखता है
class Comment {
public function view($id) {
$gateway = new CommentGateway(Database::connection());
$factory = new CommentFactory();
$repo = new CommentRepository($factory, $gateway);
return Response::view('comment/view', $repo->get($id));
}
}
इसलिए मैंने सोचा कि मैं सही तरीके से डिज़ाइन पैटर्न का उपयोग कर रहा हूं और अच्छी प्रथाओं को बनाए रख रहा हूं, लेकिन इस चीज के साथ समस्या यह है कि जब मैं एक नई तालिका जोड़ता हूं, तो मुझे अन्य नामों के साथ समान कक्षाएं बनानी होंगी। इससे मुझमें संदेह पैदा होता है कि मैं कुछ गलत कर रहा हूं।
मैंने एक समाधान के बारे में सोचा जहाँ इंटरफेस के बजाय मेरे पास अमूर्त वर्ग थे जो वर्ग नाम का उपयोग करके तालिका में हेरफेर करने की आवश्यकता होती है, लेकिन ऐसा करने के लिए सही चीज़ नहीं लगती है, क्या होगा यदि मैं एक फ़ाइल भंडारण पर स्विच करने का निर्णय लेता हूं या मेम्चे जहां कोई तालिकाओं नहीं हैं।
क्या मैं इसे सही तरीके से समझ रहा हूं, या क्या मुझे एक अलग नजरिया देखना चाहिए?