2011-04-19 22 views
8

Có câu nói cũ nhưng khôn ngoan "Thành phần giá trị thừa kế". Tôi đã cố gắng áp dụng điều này, cùng với các OOP khác và Thiết kế-Mẫu, cho vài dự án cuối cùng mà tôi đã tham gia.Thành phần, làm thế nào để bạn biết khi nào nên dừng?

Đối với hầu hết các trường hợp, nó hoạt động tốt và trông giống như đúng. Nhưng tôi đã nhận thấy rằng một số lần, chỉ có 2 hoặc 3 lớp học thực sự có được tốt nhất của nó, trong khi 10 lớp khác đột nhiên trở thành loại đại biểu đơn giản với các chi tiết thay đổi nhỏ.

Đôi khi, tôi cố gắng khắc phục điều này bằng cách sử dụng lớp trừu tượng với các chi tiết không thay đổi mà đại biểu cho những cái khác nhau để triển khai cụ thể, nhưng một cái gì đó không cảm thấy hoàn toàn đúng về nó.

Làm thế nào để bạn giữ sự cân bằng của điều này và làm theo những câu nói khôn ngoan cũ cùng một lúc? Tôi có làm điều gì sai?

Trả lời

3

Tôi nghĩ rằng vấn đề của bạn có thể là bạn đang cố gắng tuân theo "câu nói khôn ngoan cũ". Bạn có thể biết rõ hơn các yêu cầu của ứng dụng hơn bất kỳ hướng dẫn chung nào.

Khi bạn đã tập hợp một số ứng dụng xây dựng trải nghiệm, bạn sẽ có được cảm giác tự nhiên về cách thực hiện. Các hướng dẫn chỉ là, hướng dẫn để giúp bạn hiểu một khái niệm. Chúng không phải là quy tắc.

2

"Thành phần giá trị thừa kế" là câu nói cũ có giá trị ngay cả ngày hôm nay. Thành phần và kế thừa có nghĩa là tăng số tái sử dụng & để giảm mã trùng lặp. Thừa kế cũng có những lợi ích khác.

Thành phần có nghĩa là nếu bạn có phương pháp chung thuộc về 2 hoặc nhiều phân cấp lớp, hãy tách nó ra làm lớp mới và để phân cấp lớp có lớp mới này như một phần của bố cục. Với điều này bạn không chạm vào hệ thống phân cấp lớp, bạn sẽ nhận được lợi ích của mã có thể tái sử dụng.

class Aves { ... } 
class Hawk: Aves { ... } 

class Mammal { ... } 
class Bat: Mammal { ... } 

Trong ví dụ trên, tất cả Aves (chim) Fly(), (các loài chim không bay như Penguin hoặc Dodo vẫn có thể thực hiện bay() không bay). Nhưng Bát mà là một động vật có vú cũng có thể bay()

Bây giờ bạn có thể kéo ra Fly() như là một lớp riêng biệt và thành phần có lợi cho cơ nghiệp (bao gồm Fly() như một phần của Aves)

class FlyBehavior 
{ 
public void Fly() { ... } 
} 

FlyBehavior có thể là một hệ thống phân cấp lớp với ShortFlightBehavior và LongFlightBehavior chẳng hạn.

Tôi hy vọng tôi không nhầm lẫn bạn thêm nữa :)

0

Có vẻ như bạn đang thay đổi trí tuệ heuristic thành tuyệt đối. Nó không nói cho bạn "không bao giờ" để sử dụng thừa kế. Nếu bạn đang ở trong tình huống mà một trong hai thừa kế hoặc bố cục hoạt động tốt như nhau, thì hãy sử dụng bố cục. Đơn giản.

1

Khi nào nên dừng? Ngừng tập trung vào bố cục. Nó sẽ đến một cách tự nhiên nếu bạn tập trung vào các quy tắc khác.

Tập trung vào "is-a" và SRP để có được thừa kế thích hợp thay thế.

Cách dễ nhất để kiểm tra SRP cho lớp là cố gắng kết hợp từng tên phương thức với tên lớp.

class Vehicle 
{ 
    private void WriteLog(string message) {} 
    public void Start(); 
} 

Phương pháp WriteLog có thể không thực sự được liên kết với Vehicle. Phá vỡ nó ra và mang nó vào thông qua các nhà xây dựng để thay thế (thành phần và tiêm phụ thuộc).

+0

Thú vị. Vì vậy, trong trường hợp này, bạn sẽ chuyển đối tượng 'Log' tới hàm tạo của Vehicle? Và làm thế nào để bạn gọi điều này? Bạn vẫn cần phương thức 'WriteLog()' trong lượt của mình, gọi phương thức 'Write()' trên đối tượng 'Log'. Có đúng không? – Martijn

+1

lưu ý rằng phương thức 'WriteLog' là riêng tư. đã có nó như là 'công khai' thậm chí còn tồi tệ hơn. Vì vậy, sử dụng nó trong nội bộ không thực sự là một vấn đề. chỉ cần sử dụng trường. – jgauffin

+0

Không nhận thấy phương thức là riêng tư. Lỗi của tôi. Cảm ơn lời giải thích mặc dù. – Martijn

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