2011-01-13 20 views
14

Khá thường xuyên tôi thấy mọi người gọi một cách rõ ràng super() trong một lớp học không mở rộng bất cứ điều gì rõ ràng.Thực hành không tốt để gọi super() trong một lớp không mở rộng bất cứ điều gì?

public class Foo 
{ 
    public Foo() 
    { 
    super(); 

    //do other constructor stuff 
    } 
} 

Bây giờ tôi biết điều này là hoàn toàn hợp pháp và nếu bỏ qua cuộc gọi được thêm vào bởi trình biên dịch nhưng tôi vẫn nghĩ thực tiễn không tốt của nó. Bất cứ khi nào tôi thấy điều này tôi tự hỏi, nếu các lập trình viên có một số hiểu lầm về thừa kế và thực tế là tất cả các lớp học ngầm mở rộng Object.

Tôi có nên thêm điều này vào các tiêu chuẩn mã hóa/thực hành tốt nhất của chúng tôi và tôi có nên kéo các nhà phát triển khác trong nhóm của mình khi tôi thấy họ làm điều đó không? Đó là một con gấu cá nhân của tôi nhưng tôi không biết liệu tôi chỉ là cầu kỳ hay không.

Trả lời

17

Trong khi tôi là người có tất cả sự nhất quán, tôi cũng chống lại vi phạm từng chút về phong cách. Có một danh sách khổng lồ các quy ước mã hóa, đặc biệt khi một số trong chúng có vẻ tùy ý, là một phần của những gì ngăn cản mọi người theo dõi chúng. Tôi nghĩ rằng các hướng dẫn mã hóa nên được sắp xếp hợp lý thành các thực tiễn có giá trị nhất để cải thiện khả năng. Bao nhiêu là dễ đọc, bảo trì, hiệu suất, vv được cải thiện bằng cách bắt buộc thực hành này?

Trong khi thực hành cá nhân của tôi là không để gọi super() trong trường hợp này, nó không đủ nghiêm trọng mà tôi sẽ đưa vào hướng dẫn mã hóa hoặc gọi đó là lỗi trong việc xem xét mã của lập trình viên khác. Tuy nhiên, tôi tuy nhiên vẫn đề cập đến nó và thảo luận nó trong các đánh giá mã (không phải là một khiếm khuyết, cũng giống như một câu hỏi về phong cách) trong một nỗ lực để vận động thêm các kỹ sư để NOT sử dụng cuộc gọi.

+0

Tôi thích câu trả lời này, đánh giá mã dường như là nơi tốt nhất để giải quyết vấn đề như là một điểm của phong cách, và làm sáng tỏ bất kỳ sự hiểu lầm tiềm ẩn nào của lập trình viên. – Qwerky

6

nó sẽ ngầm được gọi là như vậy không cần phải làm điều này

+4

chờ nhận xét của người trả lời –

+3

Tôi không hỏi liệu tôi có cần gọi nó hay không, tôi hỏi liệu đó có phải là hành vi không tốt. – Qwerky

+1

+1 - Không biết ai đã downvoted bạn, nhưng tôi nghĩ câu trả lời của bạn là chính xác. –

8

Thêm mã mà không cần thiết lúc nào cũng là một thực tế xấu. Nó sẽ làm cho mã ít có thể đọc được vì bạn sẽ cần phải dừng lại và bắt đầu tự hỏi tại sao dòng mã này được thêm vào và nếu nó thực sự ở đó vì một lý do.

3

Nó cần phải được chỉ ra, rằng:

  • Calling super() là hoàn toàn vô nghĩa, không có vấn đề nếu lớp được thừa hưởng bất cứ điều gì hay không; nó có ý nghĩa chỉ nếu bạn không gọi hàm tạo ngầm của lớp cơ sở
  • Câu hỏi phải là "Làm điều gì đó hoàn toàn không thực hiện vô nghĩa xấu?". Câu trả lời là hiển nhiên - Vâng!
1

Gọi hàm dựng siêu rõ ràng thường được thêm bởi trình tạo mã tự động theo mặc định, do đó, không phải lúc nào cũng không phải là lập trình thực hành xấu. Hoặc có thể thực hành xấu để lại một cách vô lý tạo ra mã ngu ngốc như vậy.

Eclipse đặc biệt tạo ra cuộc gọi siêu này (tạo hàm tạo từ siêu lớp), tuy nhiên, tôi không có nhiều kinh nghiệm về các IDE khác. (Viết của bạn experiencs trong ý kiến.) My khác 'yêu thích' mặc định tạo ra mã là giao diện phương pháp khai báo: 'trừu tượng công cộng' đó là hoàn toàn dư thừa.

0

cuộc gọi super() được JDeveloper thêm hoàn toàn. Trong khi viết một lớp học của riêng bạn, không có nhu cầu và tính hữu ích của việc này.

+0

Điều này không thực sự trả lời câu hỏi và sẽ phù hợp hơn làm nhận xét – dstarh

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