Saya mencoba mengikuti prinsip KERING dalam pemrograman saya sekuat yang saya bisa. Baru-baru ini saya telah belajar pola desain di OOP dan akhirnya saya mengulangi cukup banyak.
Saya telah membuat pola Repositori bersama dengan pola Pabrik dan Gateway untuk menangani kegigihan saya. Saya menggunakan database dalam aplikasi saya tapi itu tidak masalah karena saya harus bisa menukar Gateway dan beralih ke jenis kegigihan lain jika saya mau.
Masalah yang akhirnya saya buat sendiri adalah bahwa saya membuat objek yang sama untuk jumlah tabel yang saya miliki. Misalnya ini akan menjadi objek yang saya butuhkan untuk menangani tabel 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);
}
}
Kemudian controller saya terlihat seperti
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));
}
}
Jadi saya pikir saya menggunakan pola desain dengan benar dan menjaga praktik yang baik, tetapi masalah dengan hal ini adalah ketika saya menambahkan tabel baru, saya harus membuat kelas yang sama hanya dengan nama lain. Ini menimbulkan kecurigaan pada saya bahwa saya mungkin melakukan sesuatu yang salah.
Saya memikirkan solusi di mana alih-alih antarmuka saya memiliki kelas abstrak yang menggunakan nama kelas mencari tahu tabel yang mereka butuhkan untuk memanipulasi tetapi itu sepertinya bukan hal yang tepat untuk dilakukan, bagaimana jika saya memutuskan untuk beralih ke penyimpanan file atau memcache di mana tidak ada tabel.
Apakah saya mendekati ini dengan benar, atau adakah perspektif berbeda yang harus saya lihat?