Các phương thức tĩnh riêng trong C # có làm tổn thương gì không?


10

Tôi đã tạo một phương thức xác thực riêng cho một xác nhận nhất định xảy ra nhiều lần trong lớp của mình (Tôi không thể lưu trữ dữ liệu được xác thực vì nhiều lý do). Bây giờ, ReSharper gợi ý rằng chức năng có thể được thực hiện tĩnh. Tôi hơi miễn cưỡng khi làm như vậy do các vấn đề đã biết với các phương thức tĩnh. Nó sẽ là một phương thức tĩnh riêng . Câu hỏi của tôi là, các phương thức tĩnh riêng có thể gây ra các vấn đề khớp và kiểm tra tương tự như các phương thức tĩnh công khai không? Đó có phải là một thực hành xấu? Tôi đoán là không, nhưng tôi không chắc có cạm bẫy ở đây không.


10
"Các vấn đề đã biết" với các phương thức tĩnh là gì?
Robert Harvey

3
@Ed: Phải rồi. Các phương thức tĩnh được viết đúng không nên chạm vào trạng thái hoặc trạng thái của API bên ngoài. Thao tác trạng thái nội bộ được gói gọn trong một lớp có vẻ hoàn toàn ổn đối với tôi và phương thức sẽ không cần phải được kiểm tra đơn vị, vì kiểm thử đơn vị kiểm tra hành vi bên ngoài của lớp.
Robert Harvey

1
Các phương thức tĩnh có xu hướng sửa đổi trạng thái toàn cầu và chúng cũng giết chết tính kế thừa (bất cứ khi nào bạn muốn mở rộng chức năng, bạn sẽ cần sửa đổi mã cuộc gọi vì bạn không thể ghi đè phương thức trong lớp dẫn xuất). Của bạn được gắn với một thực hiện. Các phương thức tĩnh không thể bị chế giễu khiến chúng rất khó kiểm tra đơn vị. Họ che giấu sự phụ thuộc . Tôi chắc chắn có nhiều hơn nữa. Không chỉ mù quáng tránh họ, tôi đang yêu cầu đưa ra quyết định sáng suốt.
Tamás Szelei

2
@ Tamás Phương thức tĩnh chỉ sửa đổi trạng thái toàn cầu nếu bạn viết chúng theo cách đó, điều mà tôi không bao giờ làm. Nói chung, tôi chỉ sử dụng các phương thức tĩnh trong các lớp tiện ích, các phương thức lấy một hoặc nhiều đối tượng và trả về một đối tượng mà không có tác dụng phụ. Những loại phương pháp này không có vấn đề nào bạn mô tả.
Robert Harvey

1
@ TamásSzelei Họ có xu hướng sửa đổi trạng thái toàn cầu như thế nào? Họ thậm chí không thể tìm thấy trạng thái toàn cầu trừ khi bạn chuyển nó vào một tham số.
CodeInChaos

Câu trả lời:


16

Tôi sẽ nghĩ: "Tôi có cần kiểm tra cái này không?"

Nếu phương thức của bạn là riêng tư, nghĩa là bạn không muốn kiểm tra logic trong chính phương thức đó, thì theo khả năng kiểm tra và khả năng bảo trì thì lớp của bạn là một hộp đen, hoạt động bên trong của lớp là công việc của bạn và một mình nó. Tái cấu trúc cũng sẽ không bị ảnh hưởng, đó cũng là điều cần xem xét.

Vì vậy, theo tôi: Không, thực hiện một phương thức "riêng tư" "riêng tư" sẽ không có sự phân nhánh lâu dài nào.


17

Theo tôi, phương pháp tĩnh là điều dễ nhất có thể.

DataIn -> Phương thức -> DataOut

Không có sự phụ thuộc vào các đối tượng bên ngoài, không có tác dụng phụ. Tại sao bạn coi họ là xấu?


Cảm ơn bạn. Tôi đã giải thích mối quan tâm của tôi trong các ý kiến ​​dưới câu hỏi.
Tamás Szelei

2
Những gì bạn mô tả chỉ đúng với các phương thức tĩnh không phụ thuộc vào các biến thành viên tĩnh - đó là điều có thể tạo ra sự khác biệt giữa phương thức tĩnh "tốt" và "xấu".
Doc Brown

2

Các lớp kiểm thử sử dụng các phương thức tĩnh công khai có thể khó, vì nó không (đặc biệt) dễ dàng để loại bỏ / giả / giả định các phương thức tĩnh. Mặt khác, các phương thức sơ thẩm có thể bị chế giễu một cách dễ dàng, đặc biệt nếu chúng là ảo hoặc thỏa mãn một giao diện.

Tuy nhiên, tôi không thể thấy bất kỳ lý do nào để không sử dụng các phương thức tĩnh riêng tư. Thật vậy, có một lợi ích hiệu suất nhỏ, vì bạn không cần một thể hiện của lớp để chiếm bộ nhớ.

Mặt khác, bất cứ thứ gì tĩnh là một chút mùi mã. Đây thực sự là một "lớp người trợ giúp"? Có thể là phương thức có thể cư trú hữu ích hơn trên một trong các lớp được truyền dưới dạng tham số? Câu trả lời cho những câu hỏi đó thường là "nó tốt như một tĩnh" nhưng nó đáng để ghi nhớ.


Lớp chứa phương thức tĩnh dù sao cũng đã chiếm bộ nhớ. Nỗi sợ của bạn về statictừ khóa dường như vô căn cứ.
Robert Harvey
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.