2015-09-18 15 views
5

Tôi đang cố gắng tìm hiểu xem có cách nào để ngăn các chức năng/phương thức không được thêm vào (EDIT: bởi các nhà phát triển khác) vào một lớp đối với trường hợp đối tượng là Mô hình hoặc DTO không chứa phương pháp (để ngăn chặn 'lạm dụng' Mô hình/DTO của những người khác, những người có thể thử và thêm các phương thức 'trợ giúp', v.v.).Làm cách nào để ngăn các phương thức được thêm vào một lớp học?

Có cách nào để đạt được điều này không?

+3

Chỉ cần không làm điều đó. –

+4

Viết quy tắc CodeAnalysis (FxCop) hoặc "Roslyn" tùy chỉnh, thêm quy tắc đó vào quy trình tạo của bạn để tạo lỗi nếu vi phạm. –

+0

@NickG câu hỏi quá rộng và hơi khó hiểu - những cấu trúc nào phải làm với phương pháp ngăn chặn? Bạn có hay không muốn kế thừa từ lớp học? –

Trả lời

5

Sử dụng phản chiếu và viết một bài kiểm tra đơn vị không thành công nếu lớp mô hình có phương pháp.

Đánh dấu tất cả các lớp mô hình của bạn bằng thuộc tính tùy chỉnh. Sau đó thực hiện một phép thử đơn vị sử dụng sự phản chiếu để nạp một assembly đã cho, lặp lại tất cả các lớp trong assembly đó và kiểm tra xem các lớp được đánh dấu bằng thuộc tính model không có phương thức nào. Điều này nên được khá thẳng về phía trước bằng cách sử dụng sự phản ánh.

+1

Đừng quên xây dựng một đồ thị kế thừa và kiểm tra tất cả các loại có nguồn gốc để đảm bảo chúng không có phương pháp. Nếu bạn không thể tin tưởng ai đó không thêm phương pháp, bạn chắc chắn không thể tin tưởng họ để thêm thuộc tính của bạn. –

+0

@Asad không lo lắng - Tôi chủ yếu hỏi về sự tò mò hơn là bất cứ điều gì khác :) Chúng tôi không có vấn đề lớn với điều này và thậm chí tôi không thể triển khai các giải pháp được đề xuất. Tôi chỉ tự hỏi nếu có một "sửa chữa nhanh" – NickG

0

Bạn không cần sử dụng cấu trúc để ngăn việc thêm vào lớp học. Bạn có thể sử dụng từ khóa sealed

public sealed class MyDTOObject { ... } 

Bây giờ, bạn không thể cố hữu một lớp và cũng ngăn chặn kế thừa (về cơ bản những gì bạn đang yêu cầu). Thực tế thừa kế MyDTOObject là tạo một lớp mới là dựa trên số không bằng hoặc bị hạn chế hoặc được xác định theo bất kỳ cách nào bằng cách thực hiện MyDTOObject.

Bạn có thể sử dụng lớp abstract, để buộc các lớp dẫn xuất phải triển khai một số phương pháp nhất định, nhưng không phải theo cách khác.

Nếu bạn muốn ngăn người khác bắt nguồn từ lớp học và thực hiện các phương pháp trợ giúp, bạn phải sử dụng từ khóa sealed hoặc đánh dấu lớp nội bộ.

+2

Tôi nghĩ rằng OP đã hỏi làm thế nào để ngăn chặn _any_ phương pháp, đó là ngay cả trong "MyDTOObject" chính nó. –

+1

Tôi nghĩ rằng OP có yêu cầu mong muốn có thể kế thừa và thêm thuộc tính, không phải là phương pháp. –

+1

@ Christian.K: và tôi đang nói điều đó là không thể, ngoài việc làm cho lớp được niêm phong để ngăn chặn sự thừa kế. (ông chỉ định bổ sung "bởi các nhà phát triển khác") – caesay

3

Tôi tin rằng bạn đang cố gắng giải quyết vấn đề về thủ tục với mã nơi bạn nên sử dụng giao tiếp.

Đồng nghiệp của bạn (tôi giả định) đang hoạt động trên các tệp mã có đặc quyền 'tin cậy đầy đủ'. Nếu họ phá vỡ đặc ân đó, bạn nên mở một cuộc đối thoại. Sử dụng thay đổi làm cơ hội để giáo dục họ trên thiết kế dự định. Có lẽ chúng đúng và bạn sẽ được giáo dục!

Tôi đề nghị chỉ đơn giản là làm cho thiết kế dự định rõ ràng trong tên lớp và với một nhận xét cho biết bản chất dự định. Có lẽ trích dẫn (các) tài liệu thiết kế đã thông báo cho lớp.

2

Bạn không thể cản trở bất kỳ ai có toàn quyền truy cập vào cơ sở mã của bạn để làm như vậy. Hai điều duy nhất bạn có thể làm để tránh nó tạo ra một số quy tắc CodeAnalysis cho FXCop như được đề cập bởi Christian.K trong các nhận xét hoặc bằng cách viết lớp DTO của bạn để chắc chắn là một DTO không nên có phương pháp bằng cách sử dụng một tên unambigious cho lớp và nếu điều này là không đủ cung cấp một số mã ý kiến ​​thông báo cho coder để không như vậy.

Tuy nhiên, bạn có thể cần một số loại phương pháp nếu sử dụng các bộ sưu tập, ví dụ: nơi bạn sẽ cần một số loại so sánh nếu hai trường hợp của DTO của bạn bằng nhau, vì vậy bạn phải cung cấp ít nhất một Equals - và GetHashCode -method.

0

Bạn có thể ngăn lớp được mở rộng hoặc kế thừa bằng cách đánh dấu final theo cách đó không ai có thể mở rộng lớp học của bạn và do đó không thể thêm bất kỳ hành vi nào. Nhưng hãy dừng lại và tự hỏi liệu bạn có muốn làm điều đó hay không, bởi vì sau đó bạn muốn ký một hợp đồng vô hình mà mọi thứ được yêu cầu bởi lớp được viết trong lớp và lớp này không cần thêm vào nữa.

Để rõ ràng, tôi đã nói trong ngữ cảnh Java.

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