2015-07-23 15 views
5

Tôi đang làm việc trên một dự án mà chúng tôi có một lớp trừu tượng (BaseConverter) với một phương pháp trừu tượng (convert()) và vài phương pháp cụ thể. Một phương pháp cụ thể quan trọng là invokeConverter() về cơ bản sẽ gọi phương thức convert() được triển khai trong lớp con.Gọi phương thức lớp con từ lớp siêu không phải là phương pháp hay nhất?

Trong khi mã của chúng tôi đang được xem xét bởi người khác, anh ta nói rằng, các phương thức lớp con không nên được gọi từ superclass và anh ta nói nó không phải là thực hành tốt nhất. Dưới đây là cấu trúc lớp học của chúng tôi. Ai đó có thể vui lòng cho biết đây không phải là cách phù hợp để làm không?

@Named 
public abstract class BaseConverter{ 

    @Inject 
    private ConversionDriver conversionDriver;//this class is responsible to return the correct subclass object based on the type 

    protected abstract String convert(Object toConvert); 

    public String invokeConverter(ConverterType type, Object toConvert){ 
     conversionDriver.getConverter(type).convert(toConvert);//getConverter() return the subclass object based on the type 
    } 
    .... 
    .... 
} 
+2

Bạn không gọi phương thức phân lớp. Bạn chỉ đang gọi phương thức ghi đè của lớp cha. Và đó là một trong những lý do để có phương pháp trừu tượng ở vị trí đầu tiên. Tôi không biết làm thế nào điều này sẽ được thực hành xấu. – Codebender

+0

@Codebender, cảm ơn .. vâng, tôi biện minh với cùng câu trả lời nhưng anh chàng đó không bị thuyết phục và yêu cầu chúng tôi thay đổi cấu trúc. – whoami

+1

hỏi anh chàng đó .... hãy để anh ta giải thích khi anh ta biết mã của bạn tốt. – Garry

Trả lời

4

Nó thực sự là một mẫu thiết kế được gọi là Template Method bởi GOF. Tuy nhiên, bạn không nên áp dụng nó vì nó ủng hộ thừa kế trên bố cục.

Xác định bộ xương của thuật toán trong một thao tác, trì hoãn một số bước cho các lớp con. Phương thức mẫu cho phép các lớp con xác định lại các bước nhất định của một thuật toán mà không thay đổi cấu trúc của thuật toán.

Bạn sẽ thấy mẫu này được triển khai trong nhiều khung và plugin đã biết. Tuy nhiên, bạn nên xem xét các mô hình khác nhau như Chiến lược hoặc Trang trí trong một số trường hợp. Ví dụ:

Ví dụ: trong khi mẫu Chiến lược sử dụng ủy quyền để thay đổi toàn bộ thuật toán, Phương pháp mẫu sử dụng thừa kế đã bị xóa để thay đổi một phần cụ thể của thuật toán. Chiến lược cũng sửa đổi logic của các đối tượng riêng lẻ trong thời gian chạy, trong khi Phương thức mẫu sửa đổi logic của toàn bộ lớp tại thời gian biên dịch bằng cách phân lớp.


Về "thực hành tốt nhất" - đó là một thuật ngữ gây tranh cãi. Tôi tin rằng phương pháp mẫu nên được thay thế để có được một mẫu thiết kế tốt hơn khi cơ sở mã phát triển và tái cấu trúc cho một sự phức tạp tốt hơn là cần thiết.

Nhưng đôi khi nó là giải pháp tốt nhất cho nhu cầu của bạn. Ví dụ, bạn có thể có phương thức doExecute() và muốn các lập trình viên khác mở rộng lớp của bạn (trong khi không sửa đổi nó), vì vậy bạn hãy để chúng móc vào các phần của mã của bạn cung cấp phương thức beforeExecute(). Hệ thống trưởng thành có thể bao gồm khả năng điều phối sự kiện nếu chúng ta nói về sự kết hợp của các đối tượng khác nhau.

+0

cảm ơn bạn rất nhiều @ TechWisdom. – whoami

+0

Bạn được chào đón bạn của tôi. – TechWisdom

+2

Đây là loại sự thật; nhưng trong ví dụ của OP, chúng thực sự đang làm một cái gì đó khá khác biệt - chúng đang gọi phương thức mẫu trên một cá thể riêng biệt. Không thực sự là mẫu thiết kế "phương thức mẫu" chút nào và hơi khó hiểu. Tôi phải đồng ý với người đánh giá. –

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