2010-05-27 34 views
18

Vấn đề lớp cơ sở mong manh trong java là gì?Vấn đề lớp cơ sở mong manh là gì?

+3

chống lại sự thôi thúc để tham khảo một giải thưởng lớn! hoặc album NIN ... – scunliffe

+3

Xin lỗi vì đã phá vỡ nó cho bạn, @scunliffe, nhưng bạn đã thất bại ;-) –

+0

Nếu người ta nói rằng vấn đề FBC đang có một lớp cơ sở với một hợp đồng không rõ ràng (hoặc không đầy đủ) để thay đổi lớp học sẽ có thể phá vỡ những người có nguồn gốc dựa vào nó, sẽ đủ? Và chúng ta có thể có giao diện bắt nguồn, btw không? – mlvljr

Trả lời

18

Lớp cơ sở mong manh là một vấn đề phổ biến với thừa kế, áp dụng cho Java và bất kỳ ngôn ngữ nào khác hỗ trợ kế thừa.

Tóm lại, lớp cơ sở là lớp bạn kế thừa, và nó thường được gọi là mong manh vì những thay đổi đối với lớp này có thể có kết quả không mong muốn trong các lớp kế thừa từ nó.

Có một vài phương pháp giảm thiểu điều này; nhưng không có phương pháp đơn giản nào để tránh hoàn toàn nó trong khi vẫn sử dụng thừa kế. Bạn có thể ngăn các lớp khác kế thừa từ một lớp bằng cách gắn nhãn khai báo lớp là final trong Java.

Cách tốt nhất để tránh những sự cố tồi tệ nhất này là gắn nhãn tất cả các lớp là cuối cùng trừ khi bạn đang có ý định kế thừa từ chúng. Đối với những người có ý định kế thừa từ, hãy thiết kế chúng như thể bạn đang thiết kế một API: ẩn tất cả các chi tiết triển khai; nghiêm ngặt về những gì bạn phát ra và cẩn thận về những gì bạn chấp nhận và ghi lại hành vi mong đợi của lớp học một cách chi tiết.

11

Lớp cơ sở được gọi là mong manh khi thay đổi được thực hiện để phá vỡ lớp dẫn xuất.

class Base{ 
    protected int x; 
    protected void m(){ 
     x++; 
    } 

    protected void n(){ 
     x++;  // <- defect 
     m(); 
    } 
} 


class Sub extends Base{ 
     protected void m(){ 
      n(); 
     } 
    } 
+0

Thật dễ vỡ khi những thay đổi đơn giản đối với lớp cha mẹ phá vỡ lớp con. Nếu bạn đang thay đổi mọi thứ trong phụ huynh và điều đó làm cho trẻ em bị vỡ, điều đó không nhất thiết có nghĩa là phụ huynh mong manh; nếu bạn thay đổi một cái gì đó dường như lành tính và mọi thứ sụp đổ, nó rất mong manh. –

+3

Nhưng những thay đổi nào đơn giản thì, tức là tiêu chuẩn là gì? – mlvljr

0

Tất cả những gì "Colin Pickard" đã nói là sự thật, và ở đây tôi muốn thêm vào danh sách các thực hành tốt nhất để bảo vệ khi bạn đang viết code mà có thể gây ra loại vấn đề bằng ngôn ngữ Java .. .

  1. làm cho tất cả lớp học của bạn thức bởi vì bạn không muốn họ được thừa hưởng
  2. Nếu bạn không thể và bạn phải sử dụng thừa kế (ví dụ abstract class) sau đó làm cho tất cả các phương pháp thực hiện của nó chính thức trở thành không được sửa đổi bởi subClasses của nó (ngay cả các phương pháp được bảo vệ là một ý tưởng tồi nói chung, subClasses nên không biết nhiều lắm về các lớp con của nó) ...
  3. Cố gắng không sử dụng mối quan hệShip [là một] thay vì cố gắng sử dụng mối quan hệ [sử dụng a] giữa sơ đồ lớp của bạn sử dụng giao diện để tránh các vấn đề mở rộng ..
  4. Mọi mở rộng có thể thay thế bằng dụng cụ và nếu bạn phải thực hiện một cài đặt mặc định đây là một spinen mã:

public interface MyBehavior { 
 
    void doAction(); 
 

 
    static class Implementation implements MyBehavior { 
 
     public void doAction() { 
 
      //do some stuff 
 
     } 
 
    } 
 
} 
 

 
// instead of doing extends To a class that have the doAction method 
 
// we will make a [use a] relationShip between the Example class & the Implementation class 
 
public class Example { 
 
    private MyBehavior.Implementation helper = new MyBehavior.Implementation(); 
 

 
    public void doAction() { 
 
     this.helper.doAction(); 
 
    } 
 
}

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