Tôi đang tham gia một dự án TDD, vì vậy tôi cố gắng gắn bó hết mức có thể với những điều tốt đẹp liên quan đến loại phát triển đó. Một trong số đó là tránh càng nhiều càng tốt tĩnh và toàn cầu.
Tôi đang đối mặt với vấn đề này: Tôi có một "bài báo" đối tượng có thể có "tùy chọn" (bổ sung "bài báo vi mô") liên kết với nó.
Tôi không thể tìm ra cách để có một cách tiếp cận tốt sẽ không phản tác dụng hoặc tạo ra quá nhiều truy vấn vì tôi sẽ ở trong tình huống mọi thứ bị tách rời đến mức về cơ bản tôi sẽ cần thực hiện 1 truy vấn cho mỗi đối tượng.
Từ quan điểm thực tế của tôi, tôi thấy 3 tùy chọn:
1) Xây dựng bên trong bài viết:
class Article
{
//[...]
public function getArrOption(){
//Build an array of Options instance.
//return an array of Options.
}
}
Pro: Thẳng tiến
Const: Khả năng bảo trì: Đối tượng bài viết hiện chứa logic xây dựng cho đối tượng Tùy chọn. Điều này có thể sẽ dẫn đến sao chép mã.
2) Sử dụng tùy chọnFactory
class Article
{
//[...]
public function getArrOption(){
return OptionFactory::buildFromArticleId($this->getId());
}
}
Pro: Logic xây dựng không nằm ngoài lớp Article
Const: Tôi đang phá vỡ quy tắc "tĩnh rất khó để chế giễu", khiến lớp Bài viết của tôi khó kiểm tra.
3) Tách tất cả các logic.
//Build the array of Option instance in a controller somewhere, using a Factory:
$arrOption = OptionFactory::buildFromArticleId($article->getId());
Pro: Bài viết chỉ xử lý khả năng đáp ứng của chính anh ấy và không quan tâm đến liên kết "cha" của anh ấy với các tùy chọn. Mọi thứ thực sự tách rời
Const: Sẽ yêu cầu nhiều mã hơn trong Bộ điều khiển mọi lúc tôi sẽ cần truy cập Tùy chọn. Điều đó có nghĩa là tôi không bao giờ nên sử dụng Factory bên trong một vật thể, và điều đó nghe có vẻ không tưởng với tôi ...
Cách tốt nhất để đi là gì? (Tôi đã bỏ lỡ điều gì à?) Cảm ơn.
Biên tập:
Chưa kể rằng nếu tôi không thể gọi nhà máy bên trong lớp, tôi có thể không bao giờ sử dụng mô hình khởi tạo lười biếng ...