2012-01-18 22 views
5

Tôi có một lớp trừu tượng có tên là Node. Nó chứa một hàm tạo lấy một hàng từ cơ sở dữ liệu của tôi và tạo ra các thông tin cơ bản. Tất cả các mảnh của nội dung trên trang web của tôi mở rộng lớp này - Person, Event, Project vvĐiều gì sẽ là mẫu thiết kế thích hợp để sử dụng trong cấu trúc lớp PHP này, không có nhiều thừa kế?

3 của các lớp này mở rộng là đặc biệt - khi chúng được xây dựng, ngoài việc kéo giá trị từ cơ sở dữ liệu, họ cũng cần phải truy vấn một dịch vụ web; nếu dịch vụ web cung cấp các giá trị khác với các giá trị được cung cấp trong DB, chúng cần lưu vào DB.

Trong ngôn ngữ có khả năng đa thừa kế, điều này sẽ khá đơn giản; bất kỳ một trong các lớp này sẽ mở rộng cả hai NodeAPIData hoặc một thứ gì đó tương tự. Không có MI, tôi không chắc chắn làm thế nào để xử lý điều này. Sử dụng giao diện sẽ không hữu ích, vì điều đó không cung cấp triển khai cụ thể.

Mẫu trang trí đôi khi được đề xuất như là một thay thế cho một số tính năng của MI, nhưng tôi không có đủ kinh nghiệm để xác định xem đây có phải là lựa chọn thích hợp hay không. Bất kỳ đề xuất?

+0

IMO: PHP không hỗ trợ đa kế thừa là FEATURE. P.S. Kiểm tra mẫu thiết kế 'Chiến lược' http://www.dofactory.com/Patterns/PatternStrategy.aspx –

+2

Rất ít ngôn ngữ hỗ trợ đa kế thừa. Các mẫu thiết kế bình thường dựa trên các giao diện và ủy nhiệm làm việc tốt trong PHP. –

Trả lời

1

Vì lớp APIData sẽ có chức năng từ lớp Node của bạn, bạn chỉ cần mở rộng nó. Đây là một số mã giả:

abstract class APIData extends Node { 

    public function __construct($data) { 
     parent::__construct($data); 
     $this->checkData(); 
    } 

    protected function checkData() { 
     // load data from webservice 
     $data = $this->loadData(); 

     // check if data is the same 
     foreach($data as $item => $value) { 
      if ($this->data[$item] != $value) { 
       // save in database 
      } 
     } 
    } 
} 
3

Đối tượng phải câm. Khi tôi xây dựng một cái gì đó, nó không nên làm bất cứ điều gì khác hơn những gì tôi yêu cầu nó - tức là xây dựng chính mình. Đừng truy vấn các dịch vụ web và ghi vào cơ sở dữ liệu. Nếu tôi đang sử dụng các đối tượng của bạn như một nhà phát triển khác trong nhóm của bạn, tôi sẽ bị sốc.

Đây cũng là lý do tại sao tôi nghĩ rằng bạn đang đấu tranh cho đúng mẫu, bởi vì đối tượng của bạn có nhiều mối quan tâm.

Tôi nghĩ rằng phương pháp tốt nhất ở đây là tạo ra một dịch vụ mà trả về đối tượng, chẳng hạn như một PersonService, EventService, vv, mà làm những điều sau đây:

  • Lấy bản ghi từ cơ sở dữ liệu
  • Nếu cần phải kiểm tra webservice:
    • Lấy dữ liệu từ webservice
    • Nếu thay đổi tồn tại, lưu lại cơ sở dữ liệu
  • kỷ lục Pass để phản đối contructor
  • đối tượng Return

Điều này sẽ giúp mối quan tâm của các cuộc gọi webservice ở một nơi mà nó có ý nghĩa - đó là, mã để lấy dữ liệu cần thiết để xây dựng và trở về đối tượng, aka một dịch vụ (EDIT: thực sự nhiều hơn một DAO, nhưng bạn có được ý tưởng).

+0

Lúc đầu, tôi nghĩ rằng bạn có nghĩa là sử dụng các đối tượng là một sự lãng phí thời gian, tức là "ngu ngốc". Tôi nghĩ rằng thuật ngữ ưa thích trong trường hợp đó là "câm". –

+0

Cập nhật thành "câm" ;-) –

+0

Mặc dù tôi nghĩ rằng nói chung những gì bạn đề nghị có lẽ là một ý tưởng tốt hơn, tôi đã chọn câu trả lời có 'APIData' mở rộng' Node' do các đặc tính riêng biệt của ứng dụng cụ thể này, chẳng hạn như một ID duy nhất được liên kết với bất kỳ dữ liệu dựa trên API nào. – rybosome

0

Bạn không nhất thiết phải ngồi xuống và chọn mẫu thiết kế như trong "okay, tôi sẽ triển khai mẫu trang trí". Thay vào đó, bạn nên thiết kế mã của mình theo cách nó được cho là hoạt động và mẫu thiết kế sẽ phát triển như là kết quả của việc đó. Nó chỉ như vậy xảy ra chúng tôi có rất nhiều thuật ngữ hiện có mô tả một số mẫu thiết kế phổ biến và biết những gì họ đang gọi có thể làm cho nó dễ dàng hơn để mô tả chúng.

Ở mức nào, tôi khuyên bạn nên đi lên thay vì xuống.Thay vì mở rộng Node và cố gắng để buộc APIData trong đó bằng cách nào đó, bạn có thể có một đối tượng riêng biệt bao gồm các đối tượng NodeAPIData và thực hiện công việc riêng lẻ của chúng thông qua chúng.

Khi PHP 5.4 xuất hiện với các đặc điểm của nó, điều này sẽ dễ dàng hơn nhiều.

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