가능한 한 열심히 프로그래밍에서 DRY 원칙을 따르려고합니다. 최근에는 OOP에서 디자인 패턴을 배우고 있었고 꽤 많은 것을 반복했습니다.
지속성을 처리하기 위해 팩토리 및 게이트웨이 패턴과 함께 리포지토리 패턴을 만들었습니다. 내 응용 프로그램에서 데이터베이스를 사용하고 있지만 원하는 경우 게이트웨이를 교체하고 다른 종류의 지속성으로 전환 할 수 있기 때문에 중요하지 않습니다.
내가 스스로 만들었던 문제는 내가 가지고있는 테이블 수에 대해 동일한 객체를 생성한다는 것입니다. 예를 들어 이들은 테이블을 처리하는 데 필요한 개체 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));
}
}
따라서 디자인 패턴을 올바르게 사용하고 모범 사례를 유지하고 있다고 생각했지만이 문제는 새 테이블을 추가 할 때 다른 이름으로 동일한 클래스를 만들어야한다는 것입니다. 이것은 내가 뭔가 잘못하고 있다는 의심을 불러 일으킨다.
인터페이스 대신 클래스 이름을 사용하여 조작 해야하는 테이블을 알아내는 추상 클래스가있는 솔루션을 생각했지만 올바른 것으로 보이지 않습니다. 파일 저장소로 전환하기로 결정한 경우 또는 테이블이없는 memcache.
내가 이것에 올바르게 접근하고 있습니까, 아니면 내가보아야 할 다른 관점이 있습니까?