Tôi nhận thấy rằng gần như mỗi lần tôi thấy các lập trình viên sử dụng các lớp tĩnh trong các ngôn ngữ hướng đối tượng như C #, họ đang làm sai. Các vấn đề chính rõ ràng là tình trạng toàn cầu và khó khăn trong việc hoán đổi việc triển khai trong thời gian chạy hoặc với các giả / cuống trong các thử nghiệm.
Vì tò mò, tôi đã xem xét một vài dự án của mình để chọn những dự án được thử nghiệm tốt và khi tôi nỗ lực thực sự nghĩ về kiến trúc và thiết kế. Hai tập quán của các lớp tĩnh tôi đã tìm thấy là:
Lớp tiện ích, một cái gì đó tôi muốn tránh nếu tôi viết mã này ngày hôm nay,
Bộ đệm ứng dụng: sử dụng lớp tĩnh cho điều đó hoàn toàn sai. Nếu tôi muốn thay thế nó bằng
MemoryCache
hoặc Redis thì sao?
Nhìn vào .NET Framework, tôi cũng không thấy bất kỳ ví dụ nào về việc sử dụng các lớp tĩnh hợp lệ. Ví dụ:
File
lớp tĩnh làm cho nó thực sự đau đớn để chuyển sang lựa chọn thay thế. Ví dụ: điều gì sẽ xảy ra nếu một người cần chuyển sang Lưu trữ cô lập hoặc lưu trữ tệp trực tiếp trong bộ nhớ hoặc cần nhà cung cấp có thể hỗ trợ giao dịch NTFS hoặc ít nhất có thể xử lý các đường dẫn dài hơn 259 ký tự ? Có một giao diện chung và nhiều triển khai thực hiện dễ dàng như sử dụngFile
trực tiếp, với lợi ích là không phải viết lại hầu hết các cơ sở mã khi các yêu cầu thay đổi.Console
lớp tĩnh làm cho thử nghiệm quá phức tạp. Làm thế nào tôi nên đảm bảo trong một bài kiểm tra đơn vị rằng một phương thức đưa ra một dữ liệu chính xác cho bàn điều khiển? Tôi có nên sửa đổi phương thức để gửi đầu ra tới một ghi có thể ghiStream
được trong thời gian chạy không? Có vẻ như một lớp giao diện điều khiển không tĩnh sẽ đơn giản như một lớp tĩnh, chỉ cần không có tất cả các nhược điểm của một lớp tĩnh, một lần nữa.Math
lớp tĩnh cũng không phải là một ứng cử viên tốt; Nếu tôi cần chuyển sang số học chính xác tùy ý thì sao? Hoặc để một số thực hiện mới hơn, nhanh hơn? Hoặc với một sơ khai sẽ cho biết, trong một bài kiểm tra đơn vị, rằng một phương thức đã cho của mộtMath
lớp thực sự được gọi trong một bài kiểm tra?
Trên Lập trình viên. Tôi đã đọc:
Đừng sử dụng Tĩnh Tĩnh trong C #? Một số câu trả lời khá chống lại các lớp tĩnh. Những người khác khẳng định rằng các phương thức Tĩnh tĩnh là tốt để sử dụng và có một vị trí hợp lý trong lập trình. Nhưng, không nướng nó với các đối số.
Khi nào nên sử dụng Singleton và khi nào nên sử dụng lớp tĩnh . Các lớp tiện ích được đề cập, do tôi đã đề cập ở trên rằng các lớp tiện ích có vấn đề.
Tại sao và khi nào tôi nên tạo một lớp 'tĩnh'? Mục đích của từ khóa 'tĩnh' trên các lớp là gì? Việc sử dụng hợp lệ duy nhất được đề cập là một thùng chứa cho các phương thức mở rộng. Tuyệt quá.
Bên cạnh các phương thức mở rộng, việc sử dụng hợp lệ các lớp tĩnh là gì, tức là các trường hợp trong đó Dependency Injection hoặc singletons là không thể hoặc sẽ dẫn đến một thiết kế chất lượng thấp hơn và khả năng mở rộng và bảo trì khó hơn?
instanceof
) vì hai trường hợp IFoo
không có gì đảm bảo chúng được hỗ trợ bởi cùng một lớp.
YAGNI
, và chấp nhận rằng nếu bạn cần một loại khác nhau của chuỗi, bạn chỉ sẽ nhận được IDE của bạn để thay đổi mỗi thể hiện của com.lang.lib.String
để com.someones.elses.String
trong toàn bộ cơ sở mã.