2009-10-21 27 views
15

Tôi muốn giữ cái này ngắn gọn. Tôi xây dựng một HouseA có hai phòng, nói BedRoomStudyRoom, cả hai đều xuất phát từ một lớp cơ sở được gọi là Room. BedRoomStudyRoom có cùng một phụ huynh được gọi là House. Ngoài ra, bất kỳ phòng nào trong một căn nhà đều có thể truy cập bất kỳ phòng nào khác chỉ thông qua phụ huynh. Nếu BedRoom phải truy cập vào bất kỳ thuộc tính nào của StudyRoom, nó phải chỉ đi qua House (tức là cha mẹ) và ngược lại.Tôi có nên sử dụng thừa kế hoặc sáng tác không?

HouseA ISA House 
HouseA HAS BedRoom and StudyRoom. 
BedRoom ISA Room 
StudyRoom ISA Room 

Bây giờ Vấn đề: Hãy nói rằng, tôi xây dựng một ngôi nhà (nói HouseB), mà là một chính xác giống như trên, nhưng với một sự thay đổi. Tôi không muốn có hai phòng riêng biệt (ví dụ: BedRoomStudyRoom), nhưng thay vào đó là một phòng đơn (MasterRoom) có cả hai cơ sở này. Vì lợi ích của sử dụng lại mã, tôi có thể nghĩ đến các phương án thiết kế như sau:

Option-1: 
HouseB ISA House 
HouseB HAS MasterRoom 
MasterRoom ISA Room 

Ở đây tôi mất khả năng tái sử dụng các thuộc tính của BedRoomStudyRoom rằng tôi đã tạo cho HouseA. Lưu ý rằng hầu hết các thuộc tính của BedRoomStudyRoom cần phải được thực hiện lại trong MasterRoom, do đó dẫn đến sao chép mã.

Option-2: 
HouseB ISA House 
HouseB HAS MasterRoom 
MasterRoom ISA Room 
MasterRoom HAS LogicalBedroom 
MasterRoom HAS LogicalStudyRoom 
LogicalBedroom ISA BedRoom 
LogicalStudyRoom ISA StudyRoom 

Bằng cách này, tôi sử dụng thành phần để tôi có thể tái sử dụng hầu hết mã của tôi (Tôi có vài ngàn dòng mã mà tôi có thể tái sử dụng), nhưng vấn đề là BedRoom là một lớp bê tông và logicalBedRoom có thể tìm thấy một số thuộc tính không phù hợp và có thể buộc phải ghi đè lên các phương thức để chúng không làm gì cả. Ví dụ: Bedroom->noOfSides() = 4logicalBedRoom->noOfSides() = ??. Đây có phải là một sử dụng tốt của thừa kế?

Thiết kế thực tế của tôi là dành cho một chip phức hợp kết hợp chức năng của hai chip riêng lẻ (tôi đã sử dụng Nhà (bo mạch chủ) và tương tự Room (chip)). Tôi mã trong Object Oriented Perl và tôi thực sự sẽ đánh giá cao bất kỳ đề xuất thiết kế thay thế.

Cảm ơn

Trả lời

19

Tại sao không sử dụng vai trò để đạt được điều này:

House A has a Bedroom 
Bedroom does SleepingArea 
House has a Studyroom 
Studyroom does ComfyArea 

House B has a MasterRoom 
MasterRoom does SleepingArea and ComfyArea 

Cách dễ nhất để có được roles là sử dụng Moose.

+1

Có vai trò giống như Mixin trong Ruby không? – rpattabi

+1

@ ragu.pattabi, vai trò tương tự như mixin. Sự khác biệt chính là các vai trò có một số điều khiển khi chúng có thể được áp dụng - các vai trò có thể yêu cầu các phương thức nhất định có sẵn trong một lớp tiêu thụ. Có những khác biệt khác nữa. Perl sử dụng các thuật ngữ vai trò bản đồ để 'đặc điểm' trong thế giới lớn hơn của nghiên cứu OO. Trong Perl/Moose một đặc điểm là một vai trò được áp dụng cho một phương thức sử dụng giao thức siêu đối tượng, nằm ngoài phạm vi của trả lời này. Tôi nâng cao điểm để tôi có thể tránh sự xuất hiện của trình tự không phải là trình tự như tôi hướng dẫn bạn đến một tài nguyên về các đặc điểm nói chung: http://scg.unibe.ch/research/traits/ – daotoad

+0

Điều đó có nghĩa là vai trò cung cấp cơ chế như phương thức mẫu mô hình không có hành lý thừa kế. Điều đó khá thú vị. – rpattabi

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