Tôi có cần phải đối phó với tình huống mà các phương thức riêng tư được gọi thông qua sự phản chiếu không?


12

Khi tạo một thư viện, tôi phải đảm bảo rằng các phương thức riêng tư phải hoạt động như mong đợi khi được gọi không phải bởi các phương thức khác của cùng một lớp, mà bởi một thư viện khác thông qua sự phản chiếu ?

Ví dụ: nếu một phương thức riêng private DoSomething(int number)dự kiến ​​rằng:

  • number là một số nguyên dương khác không và:
  • một biến riêng string abckhông phải là null và không phải là một chuỗi rỗng,

và hoàn toàn, thất bại xấu nếu hai điều kiện đó không khớp nhau, tôi phải xử lý các lỗi đó ngay cả khi tôi biết rằng tất cả các phương thức trong lớp sẽ luôn luôn gán một giá trị không trống cho abctrước khi gọi DoSomethingvà chuyển một số nguyên dương khác không cho điều này phương pháp?

Nói cách khác, mã không được bảo vệ chống lại các cuộc gọi không an toàn thông qua phản xạ có thể được coi là mã chất lượng thấp hay thuộc về người gọi sử dụng phản xạ để đảm bảo rằng cuộc gọi không phá vỡ bất cứ điều gì?

Lưu ý: câu hỏi của tôi chỉ bao gồm một bộ thư viện tiêu chuẩn. Điều này không bao gồm mã phải được bảo mật cao (nghĩa là khi ai đó có thể quan tâm bằng cách sử dụng sự phản chiếu để làm cho nó hoạt động bất ngờ hoặc sụp đổ).


Bởi vì lớp được ghi lại chính xác, bởi vì có đủ các bài kiểm tra đơn vị để chắc chắn rằng bất kỳ nhà phát triển nào khác sẽ không phá vỡ phương thức này, v.v.


các lớp dẫn xuất sẽ có thể gọi các phương thức riêng?
oenone

Câu trả lời:


16

Bằng cách đánh dấu phương pháp của bạn riêng tư, bạn đã thiết lập ý định của mình và một hợp đồng. Bằng cách sử dụng sự phản chiếu, mã khách hàng có thể chọn phá vỡ hợp đồng này và do đó sẽ phải gánh chịu hậu quả. Điều tương tự cũng xảy ra với các giao thức, để mọi thứ hoạt động theo quy tắc phải được tuân theo hoặc những điều xấu sẽ xảy ra.

Vấn đề tương tự có thể xảy ra với các ngôn ngữ khác như C ++ nơi tôi thấy những thứ như

#define private public

Tóm lại - bạn KHÔNG bắt buộc phải giải quyết những tình huống này, người gọi nên biết rõ hơn.


3
Tôi đã thấy mọi người chuyển các lớp thành (ký tự không dấu *) và ghi trực tiếp vào phần bù bộ nhớ của biến thành viên mà họ muốn thay đổi. Mắt tôi đỏ hoe.
Shawn D.

6
Tôi sẽ nói thêm rằng về cơ bản là không thể bảo vệ lớp của bạn trước mã đặc quyền nguy hiểm . Nếu bạn bằng cách nào đó quản lý để bảo vệ bản thân khỏi việc sử dụng phản xạ không phù hợp thì ai đó sẽ tìm ra một cách khác để hủy hoại ngày của bạn, có thể chỉ bằng cách ghi đè lên bộ nhớ quá trình của bạn trực tiếp. Mã hóa phòng thủ cuối cùng đạt đến điểm giảm lợi nhuận và sự phản chiếu đã vượt qua điểm đó.
Aaronaught

5

Nếu bất cứ ai đang sử dụng sự phản chiếu để gọi các phương thức riêng tư của bạn, thì đó là dấu hiệu cho thấy ai đó đang làm gì đó sai. Hoặc là anh ta đang sử dụng mã theo cách mà nó không được thiết kế hoặc bạn đang che giấu quá nhiều hoạt động nội bộ và làm giảm API.

Nhưng có vẻ như bạn thậm chí chưa ở giai đoạn đó và chỉ đang cố gắng để được ưu tiên. Vì vậy, ý kiến ​​của tôi là: đừng lo lắng về nó. Một phương pháp riêng tư nên được coi là ngoài giới hạn; nếu ai đó cố tình vi phạm những giới hạn đó, thì đó là vấn đề của họ nếu mọi thứ nổ tung.


0

Chà, luôn luôn là một ý tưởng tốt để xác nhận các biến không cục bộ trước khi bạn sử dụng chúng, nhưng ngoài ra tôi sẽ không lo lắng về nó. Như những người khác đã nói, bạn đã thiết lập ý định của mình bằng cách đặt phương thức ở chế độ riêng tư ngay từ đầu; bất cứ ai gọi nó từ bên ngoài lớp học của bạn không có đảm bảo. Khi làm việc với Java, tôi thậm chí không đưa các bình luận javadoc vào các phương thức riêng tư của mình, vì tôi không muốn các nhà phát triển khác biết rằng họ đang ở đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.