2010-07-14 26 views
7

Tôi có một câu hỏi chung ... khi nào tôi nên sử dụng các lớp tĩnh hoặc phương pháp tĩnh? .. Tôi biết ý tưởng rằng các phương thức tĩnh có thể được gọi mà không instantiating ... và các lớp tĩnh chỉ nên được sử dụng cho các phương pháp tĩnh? ... nhưng có bất kỳ mối quan tâm hiệu suất nào với nó ... và khi nào chúng nên được ưa thích hơn các phương pháp và lớp học? .. Nếu ai đó có thể chỉ đề cập ngắn gọn khi tôi nên chọn sử dụng chúng và khi nào tôi nên tránh chúng?Khi nào nên sử dụng các lớp và phương pháp tĩnh?

Trả lời

1

Có là mục nhập trước đây có vẻ như: When to use static classes in C#

Tôi sẽ các lớp tĩnh hink là để giữ các hàm hoặc dữ liệu mà bạn muốn gọi mà không phải tạo một đối tượng cho nó. Nếu tôi nhớ lại, khởi tạo một đối tượng đặt nó vào bộ nhớ. Và bởi hàm ý, một lớp tĩnh không đối tượng không đi vào bộ nhớ? Đã được một thời gian kể từ khi tôi đã lấy các lớp lý thuyết của tôi, (Xin lỗi,

+0

Một constructor tĩnh chỉ được gọi một lần, và một lớp tĩnh vẫn còn trong bộ nhớ cho tuổi thọ của miền ứng dụng mà các chương trình của bạn cư trú. - http://msdn.microsoft.com/en-us/library/79b3xss3.aspx –

0

Tôi nghĩ rằng một nguyên tắc chung có thể là các hàm tiện ích phải là tĩnh. như sqrt(), vì thực sự không cần phải có thứ gì đó giống như một đối tượng Math riêng biệt

Đối với các lớp tĩnh, bạn nên nghĩ về các lớp giữ trạng thái, thường giống như thông tin phiên, không cần quan tâm đường dẫn chính xác đi qua ứng dụng của bạn và bạn thường cần chính xác một ứng dụng. (nghĩ về trình duyệt của bạn, có thể luôn giữ chính xác 1 cookie-jar giống như lớp học)

Biến tĩnh là cặp song sinh ít ác của các biến toàn cục (chúng giữ giá trị của chúng, nhưng với phạm vi của chúng bị hạn chế đối với hàm), thường hữu ích để giữ một số dạng trạng thái (ví dụ: lưu trữ dữ liệu) hoặc liệt kê những thứ phải là duy nhất nhưng việc đánh số không phải là rất quan trọng bên ngoài phạm vi chức năng hoặc ứng dụng của bạn (ví dụ: đánh số hoặc gỡ lỗi từ các hàm gỡ rối ("..") hoặc hồ sơ() của riêng bạn)

Về cơ bản, chỉ sử dụng bất kỳ thứ gì trong số họ khi bạn chắc chắn rằng làm những việc "giống như" OOP giống như cách sẽ dẫn đến việc tạo ra một con quái vật.

0

Khi tôi hiểu rằng đó là khi không có ý nghĩa để tạo ra một đối tượng của một lớp để gọi một hành động hoặc lớp đó là phổ biến trong ứng dụng. Ví dụ, trong C#, lớp Console được niêm phong (vì vậy bạn không thể tạo một đối tượng và kế thừa nó, và thực sự không có ý nghĩa để làm điều đó). Nhưng các chuyên gia sẽ giải thích cho bạn tốt hơn, tuy nhiên.

4

Một điều cần lưu ý là các tác động thử nghiệm của các phương pháp tĩnh. Một phương pháp tĩnh "con dấu" rất nhiều seams. Đường nối là nơi bạn có thể thay đổi hành vi mà không thay đổi mã sản xuất của mình; ví dụ là phân lớp hoặc liên kết đến thư viện thử nghiệm. Vì các phương thức tĩnh được giải quyết tại thời gian biên dịch và không bị ràng buộc động, bạn không thể ném vào một đối tượng thử nghiệm và thay đổi cách một phương thức tĩnh hoạt động. Kiểm tra lớp đó sẽ là một kéo.

Đối với những thứ như các hàm toán học, bạn có thể chắc chắn một phương pháp tĩnh sẽ ổn, nhưng bạn gần như chắc chắn sẽ không muốn một phương thức tĩnh kết nối với cơ sở dữ liệu. Hãy suy nghĩ về cách bạn sẽ thử nghiệm mã sử dụng phương pháp tĩnh mà bạn đang nghĩ đến việc tạo.

Dưới đây là một liên kết tốt từ blog thử nghiệm google: Static Methods are Death to Testability

+0

Bài đăng tuyệt vời - Tôi yêu freaking Miško Hevery. Bạn đã xem Google Talk Talks chưa? (Tôi nghĩ rằng đó là cuộc nói chuyện có tiêu đề "Cuộc nói chuyện mã sạch - Thử nghiệm đơn vị", mặc dù tất cả các cuộc đàm phán của ông đều đáng giá.) Những cuộc nói chuyện này gây ra một khoảnh khắc siêu tân tinh nhận thức về tâm trí, kết hợp IOC và TDD vào một số loại vũ khí khổng lồ sử thi. –

+0

"Một phương pháp tĩnh" con dấu "rất nhiều đường nối." không quan trọng đối với các phương thức mức thấp, nhưng importatn cho các phương thức mức cao hơn. – Raedwald

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