8

Tôi đang cố gắng sử dụng Dependency Injection càng nhiều càng tốt, nhưng tôi gặp khó khăn khi nói đến những thứ như phụ thuộc ngắn ngủi.Các nhà máy trừu tượng có sử dụng "mới" không?

Ví dụ: giả sử tôi có đối tượng trình quản lý blog muốn tạo danh sách blog được tìm thấy trong cơ sở dữ liệu. Các tùy chọn để thực hiện việc này (theo như tôi có thể biết) là:

  1. Blog mới();
  2. $ this-> loader-> blog();
    • đối tượng nạp tạo ra các loại khác nhau của các đối tượng như đối tượng cơ sở dữ liệu, bộ lọc văn bản, vv
  3. $ this-> blogEntryFactory-> tạo();

Tuy nhiên, # 1 là xấu bởi vì nó tạo ra sự ghép nối mạnh mẽ. # 2 vẫn còn có vẻ xấu bởi vì nó có nghĩa là nhà máy đối tượng đã được tiêm trước đó - phơi bày tất cả các đối tượng khác mà nó có thể tạo ra.

Số 3 có vẻ ổn, nhưng nếu tôi sử dụng # 3, tôi có đặt từ khóa "mới" trong chính blogEntryFactory, OR, để tôi tải trình nạp vào blogEntryFactory và sử dụng trình tải không?

Nếu tôi có nhiều nhà máy khác nhau như blogEntryFactory (ví dụ tôi có thể có userFactory và commentFactory), có vẻ như việc đặt từ khóa "mới" trên tất cả các nhà máy khác nhau sẽ tạo ra sự cố phụ thuộc.

Tôi hy vọng điều này có ý nghĩa ...

LƯU Ý

Tôi đã có một số câu trả lời về cách thức này là không cần thiết ví dụ như viết blog cụ thể này, nhưng có, trên thực tế, trường hợp bạn cần sử dụng Abstract Factory Pattern, và đó là điểm tôi đang nhận được. Bạn có sử dụng "mới" trong trường hợp đó hay làm điều gì đó khác?

+0

Nếu tôi không giải thích điều này một cách chính xác hoặc đủ kỹ lưỡng, vui lòng cho tôi biết và tôi sẽ cố gắng làm rõ – johnnietheblack

+0

Tôi chưa bao giờ thấy việc sử dụng tiêm phụ thuộc vào các lớp mô hình. Trừ khi lớp 'Blog' đóng gói một số logic nghiệp vụ (mà các mô hình hiếm khi làm), không có điểm cố gắng để giảm khớp nối với nó - không có hành vi nào để kết nối. (Chỉ có cấu trúc của thực thể, nhưng điều đó sẽ không thay đổi.) – millimoose

+0

Đầu tiên, cảm ơn nhận xét ... vậy bạn có nói rằng BlogManager nên/có thể gọi là "Blog mới()" không? – johnnietheblack

Trả lời

4

Tôi không có chuyên gia, nhưng tôi sẽ giải quyết vấn đề này. Điều này giả định rằng Blog chỉ là một đối tượng mô hình dữ liệu hoạt động như một vùng chứa cho một số dữ liệu và được điền bởi bộ điều khiển (new Blog không phải là rất có ý nghĩa). Trong trường hợp này, Blog là một lá của biểu đồ đối tượng và sử dụng new là không sao. Nếu bạn sẽ thử nghiệm các phương thức cần tạo ra một Blog, bạn phải đồng thời kiểm tra việc tạo ra các Blog anyway, và sử dụng một đối tượng giả không có ý nghĩa .. các Blog không tồn tại quá khứ phương pháp này.

Ví dụ: giả sử PHP không có cấu trúc mảng nhưng có đối tượng bộ sưu tập. Bạn có gọi số $this->collectionsFactory->create() hoặc bạn có hài lòng khi nói new Array; không?

+0

Khai sáng bằng lời giải thích về lá. – johnnietheblack

+1

Tandu, như tôi vừa thêm ở trên, mặc dù kịch bản này có thể không xứng đáng với một nhà máy, có những tình huống mà các nhà máy được đánh giá cao. Trong những trường hợp đó, bạn có sử dụng "mới" trong Nhà máy hay làm điều gì khác không? – johnnietheblack

Các vấn đề liên quan