আমি আমার প্রোগ্রামিংয়ে DRY নীতিটি যথাসাধ্য অনুসরণ করার চেষ্টা করছি। সম্প্রতি আমি ওওপিতে নকশার ধরণগুলি শিখছি এবং আমি নিজেকে বেশ গুচ্ছ পুনরাবৃত্তি করে শেষ করেছি।
আমার অধ্যবসায়টি পরিচালনা করতে আমি কারখানা এবং গেটওয়ে নিদর্শনগুলির সাথে একটি সংগ্রহস্থল প্যাটার্ন তৈরি করেছি। আমি আমার অ্যাপ্লিকেশনটিতে একটি ডেটাবেস ব্যবহার করছি তবে গেটওয়েটি পরিবর্তন করতে এবং আমার ইচ্ছা হলে অন্য ধরণের দৃistence়তার সাথে স্যুইচ করতে সক্ষম হওয়া উচিত নয়।
আমি নিজের জন্য যে সমস্যাটি তৈরি করেছিলাম তা হ'ল আমি যে টেবিলগুলি পেয়েছি তার জন্য একই জিনিসগুলি তৈরি করি। উদাহরণস্বরূপ, এগুলি হ'ল আমার কোনও টেবিল হ্যান্ডেল করা প্রয়োজন 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));
}
}
সুতরাং আমি ভেবেছিলাম আমি সঠিকভাবে ডিজাইনের নিদর্শনগুলি ব্যবহার করছি এবং ভাল অনুশীলনগুলি রাখছি, তবে এই জিনিসটির সাথে সমস্যাটি হ'ল আমি যখন একটি নতুন টেবিল যুক্ত করি তখন আমাকে অন্য নামগুলি সহ একই ক্লাসগুলি তৈরি করতে হয়। এটি আমার মধ্যে সন্দেহ জাগিয়ে তোলে যে আমি হয়ত কিছু ভুল করছি।
আমি এমন একটি সমাধানের কথা চিন্তা করলাম যেখানে ইন্টারফেসের পরিবর্তে আমার বিমূর্ত ক্লাস ছিল যা ক্লাসের নামটি ব্যবহার করে তাদের যে টেবিলটি ম্যানিপুলেট করতে হবে তা বের করে তবে এটি করার মতো সঠিক জিনিসটি মনে হয় না, যদি আমি কোনও ফাইল স্টোরেজে যাওয়ার সিদ্ধান্ত নিয়ে থাকি বা মেমক্যাচে যেখানে কোনও টেবিল নেই।
আমি কি এটি সঠিকভাবে পৌঁছাচ্ছি, বা আমার অন্যদিকে দেখার মতো অন্য দৃষ্টিভঙ্গি রয়েছে?