Programlamamda olabildiğince DRY ilkesini izlemeye çalışıyorum. Son zamanlarda OOP'ta tasarım kalıpları öğreniyorum ve kendimi bir sürü tekrarladım.
Kalıcılığımı işlemek için bir Fabrika ve Ağ Geçidi desenleri ile birlikte bir Depo deseni oluşturdum. Uygulamamda bir veritabanı kullanıyorum, ancak Gateway'i değiştirebilmem ve istersem kalıcılığın başka bir türüne geçebilmem gerektiğinden bu önemli değil.
Kendim için oluşturduğum sorun, sahip olduğum tablo sayısı için aynı nesneleri oluşturmam. Örneğin bunlar bir tabloyu işlemem gereken nesneler olacak 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);
}
}
Sonra kontrol cihazım şöyle görünüyor
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));
}
}
Bu yüzden tasarım desenlerini doğru bir şekilde kullandığımı ve iyi uygulamaları koruduğumu düşündüm, ancak bu sorunla ilgili sorun, yeni bir tablo eklediğimde, aynı sınıfları diğer adlarla oluşturmak zorunda olduğum. Bu, yanlış bir şey yaptığım konusunda içimde şüphe uyandırıyor.
Arabirimler yerine, sınıf adını kullanarak manipüle etmeleri gereken tabloyu anlayan soyut sınıfları olan bir çözüm düşündüm, ancak bu doğru bir şey gibi görünmüyor, ya bir dosya deposuna geçmeye karar verirsem ya da tablo olmayan memcache.
Buna doğru yaklaşıyor muyum yoksa bakmam gereken farklı bir bakış açısı var mı?