Hãy để tôi nói trước điều này bằng cách nói rằng tôi chủ yếu nói về việc truy cập phương thức ở đây và ở mức độ thấp hơn một chút, đánh dấu lớp cuối cùng, không phải là quyền truy cập của thành viên.
Trí tuệ cũ
"đánh dấu nó riêng tư trừ khi bạn có lý do chính đáng để không"
có ý nghĩa trong những ngày khi nó được viết, trước khi nguồn mở thống trị không gian thư viện nhà phát triển và VCS / phụ thuộc mgmt. trở nên siêu hợp tác nhờ Github, Maven, v.v. Trước đó, cũng có tiền để kiếm được bằng cách hạn chế (các) cách mà thư viện có thể được sử dụng. Có lẽ tôi đã dành 8 hoặc 9 năm đầu tiên trong sự nghiệp của mình tuân thủ nghiêm ngặt "thực hành tốt nhất" này.
Hôm nay, tôi tin rằng đó là lời khuyên tồi. Đôi khi, có một lý lẽ hợp lý để đánh dấu một phương thức riêng tư hoặc một lớp cuối cùng nhưng nó cực kỳ hiếm, và thậm chí sau đó có lẽ nó không cải thiện bất cứ điều gì.
Bạn có bao giờ:
- Bị thất vọng, ngạc nhiên hoặc bị tổn thương bởi một thư viện, v.v. Tôi có.
- Muốn sử dụng một thư viện cho trường hợp sử dụng hơi khác so với tưởng tượng của các tác giả nhưng không thể làm như vậy vì các phương thức và lớp riêng tư / cuối cùng? Tôi có.
- Bạn có thất vọng, ngạc nhiên hay bị tổn thương bởi một thư viện, vv được cho phép quá mức trong khả năng mở rộng của nó? Tôi không có.
Đây là ba cách hợp lý hóa lớn nhất mà tôi đã nghe để đánh dấu các phương thức riêng tư theo mặc định:
Hợp lý hóa # 1: Không an toàn và không có lý do gì để ghi đè một phương thức cụ thể
Tôi không thể đếm số lần tôi đã sai về việc có cần phải ghi đè một phương pháp cụ thể mà tôi đã viết hay không. Đã làm việc trên một số lib nguồn mở phổ biến, tôi đã học được một cách khó khăn chi phí thực sự của việc đánh dấu những thứ riêng tư. Nó thường loại bỏ các giải pháp thực tế duy nhất để giải quyết các vấn đề hoặc các trường hợp sử dụng. Ngược lại, tôi chưa bao giờ trong hơn 16 năm phát triển chuyên nghiệp hối tiếc vì đã đánh dấu một phương pháp được bảo vệ thay vì riêng tư vì những lý do liên quan đến an toàn API. Khi một nhà phát triển chọn mở rộng một lớp và ghi đè một phương thức, họ có ý thức nói rằng "Tôi biết những gì tôi đang làm." và vì lợi ích của năng suất nên là đủ. giai đoạn = Stage. Nếu nó nguy hiểm, hãy lưu ý nó trong lớp / phương thức Javadocs, đừng chỉ đóng sập cửa một cách mù quáng.
Các phương pháp đánh dấu được bảo vệ theo mặc định là một giảm thiểu cho một trong những vấn đề chính trong phát triển SW hiện đại: thất bại của trí tưởng tượng.
Hợp lý hóa # 2: Nó giữ sạch API / Javadocs công khai
Điều này hợp lý hơn, và tùy thuộc vào đối tượng mục tiêu, nó thậm chí có thể là điều đúng đắn, nhưng đáng để xem xét chi phí của việc giữ API "sạch" thực sự là gì: khả năng mở rộng. Vì những lý do đã đề cập ở trên, có lẽ sẽ hợp lý hơn khi đánh dấu những thứ được bảo vệ theo mặc định chỉ trong trường hợp.
Hợp lý hóa # 3: Phần mềm của tôi là thương mại và tôi cần hạn chế sử dụng.
Điều này cũng hợp lý, nhưng với tư cách là một người tiêu dùng tôi sẽ đi cùng với đối thủ cạnh tranh ít hạn chế hơn (giả sử không tồn tại sự khác biệt đáng kể về chất lượng).
Không bao giờ nói không bao giờ
Tôi không nói không bao giờ đánh dấu phương pháp riêng tư. Tôi đang nói quy tắc tốt hơn là "làm cho các phương thức được bảo vệ trừ khi có lý do chính đáng để không".
Lời khuyên này phù hợp nhất cho những người làm việc trên các thư viện hoặc các dự án quy mô lớn hơn đã được chia thành các mô-đun. Đối với các dự án nguyên khối nhỏ hơn hoặc nhiều hơn, nó không có xu hướng quan trọng bằng việc bạn vẫn kiểm soát tất cả mã và dễ dàng thay đổi cấp độ truy cập của mã nếu / khi bạn cần. Mặc dù sau đó, tôi vẫn đưa ra lời khuyên tương tự :-)