Tôi đã viết những suy nghĩ của tôi về các lớp tĩnh trong một chủ đề trước đó :
Tôi đã từng yêu thích các lớp tiện ích chứa đầy các phương thức tĩnh. Họ đã thực hiện một sự hợp nhất tuyệt vời của các phương pháp trợ giúp mà nếu không sẽ nằm xung quanh gây ra sự dư thừa và bảo trì địa ngục. Chúng rất dễ sử dụng, không cần khởi tạo, không xử lý, chỉ cần đốt lửa. Tôi đoán đây là nỗ lực vô tình đầu tiên của tôi trong việc tạo ra một kiến trúc hướng dịch vụ - rất nhiều dịch vụ phi trạng thái chỉ làm công việc của họ và không có gì khác. Khi một hệ thống phát triển, những con rồng đang đến.
Đa hình
Giả sử chúng ta có phương thức UtilityClass.SomeMethod vui vẻ reo lên. Đột nhiên chúng ta cần thay đổi chức năng một chút. Hầu hết các chức năng là như nhau, nhưng chúng ta phải thay đổi một vài phần. Nếu nó không phải là một phương thức tĩnh, chúng ta có thể tạo một lớp phái sinh và thay đổi nội dung phương thức khi cần. Vì nó là một phương pháp tĩnh, chúng ta không thể. Chắc chắn, nếu chúng ta chỉ cần thêm chức năng trước hoặc sau phương thức cũ, chúng ta có thể tạo một lớp mới và gọi lớp cũ bên trong nó - nhưng đó chỉ là thô.
Khủng hoảng giao diện
Các phương thức tĩnh không thể được định nghĩa thông qua các giao diện vì lý do logic. Và vì chúng ta không thể ghi đè các phương thức tĩnh, các lớp tĩnh là vô dụng khi chúng ta cần chuyển chúng qua giao diện của chúng. Điều này làm cho chúng ta không thể sử dụng các lớp tĩnh như là một phần của mẫu chiến lược. Chúng tôi có thể khắc phục một số vấn đề bằng cách chuyển đại biểu thay vì giao diện.
Kiểm tra
Điều này về cơ bản đi đôi với tai ương giao diện được đề cập ở trên. Vì khả năng trao đổi triển khai của chúng tôi rất hạn chế, chúng tôi cũng sẽ gặp khó khăn khi thay thế mã sản xuất bằng mã kiểm tra. Một lần nữa, chúng ta có thể gói chúng lại nhưng nó sẽ yêu cầu chúng ta thay đổi phần lớn mã của chúng ta chỉ để có thể chấp nhận các hàm bao thay vì các đối tượng thực tế.
Bồi dưỡng blobs
Vì các phương thức tĩnh thường được sử dụng làm phương thức tiện ích và phương thức tiện ích thường sẽ có các mục đích khác nhau, chúng tôi sẽ nhanh chóng kết thúc với một lớp lớn chứa đầy chức năng không kết hợp - lý tưởng là mỗi lớp nên có một mục đích duy nhất trong hệ thống. Tôi muốn có nhiều hơn năm lần các lớp miễn là mục đích của chúng được xác định rõ.
Thông số creep
Để bắt đầu, phương pháp tĩnh nhỏ dễ thương và ngây thơ đó có thể có một tham số duy nhất. Khi chức năng phát triển, một vài tham số mới được thêm vào. Các tham số tiếp theo được thêm vào là tùy chọn, vì vậy chúng tôi tạo ra sự quá tải của phương thức (hoặc chỉ thêm các giá trị mặc định, bằng các ngôn ngữ hỗ trợ chúng). Không lâu sau, chúng ta có một phương thức lấy 10 tham số. Chỉ có ba cái đầu tiên thực sự cần thiết, tham số 4-7 là tùy chọn. Nhưng nếu tham số 6 được chỉ định, 7-9 cũng được yêu cầu điền vào ... Chúng ta đã tạo một lớp với mục đích duy nhất là làm phương thức tĩnh này đã làm gì, chúng ta có thể giải quyết điều này bằng cách lấy các tham số bắt buộc trong hàm tạo và cho phép người dùng đặt các giá trị tùy chọn thông qua các thuộc tính hoặc phương thức để đặt nhiều giá trị phụ thuộc lẫn nhau cùng một lúc. Cũng thế,
Yêu cầu người tiêu dùng tạo ra một thể hiện của các lớp mà không có lý do
Một trong những đối số phổ biến nhất là, tại sao yêu cầu người tiêu dùng của lớp chúng ta tạo một thể hiện để gọi phương thức đơn này, trong khi không sử dụng ví dụ sau đó? Tạo một thể hiện của một lớp là một hoạt động rất rẻ trong hầu hết các ngôn ngữ, vì vậy tốc độ không phải là vấn đề. Thêm một dòng mã bổ sung cho người tiêu dùng là một chi phí thấp để đặt nền tảng của một giải pháp dễ bảo trì hơn nhiều trong tương lai. Và cuối cùng, nếu bạn muốn tránh tạo các thể hiện, chỉ cần tạo một trình bao bọc đơn của lớp cho phép tái sử dụng dễ dàng - mặc dù điều này làm cho yêu cầu rằng lớp của bạn không trạng thái. Nếu nó không trạng thái, bạn vẫn có thể tạo các phương thức trình bao bọc tĩnh xử lý mọi thứ, trong khi vẫn mang lại cho bạn tất cả lợi ích về lâu dài. Cuối cùng,
Chỉ có một Sith thỏa thuận trong tuyệt đối
Tất nhiên, có những ngoại lệ đối với việc tôi không thích các phương thức tĩnh. Các lớp tiện ích thực sự không gây ra bất kỳ rủi ro nào cho sự phình to là trường hợp tuyệt vời cho các phương thức tĩnh - System.Convert làm ví dụ. Nếu dự án của bạn là một lần duy nhất không có yêu cầu bảo trì trong tương lai, thì kiến trúc tổng thể thực sự không quan trọng lắm - tĩnh hoặc không tĩnh, không thực sự quan trọng - tuy nhiên tốc độ phát triển.
Tiêu chuẩn, tiêu chuẩn, tiêu chuẩn!
Sử dụng các phương thức cá thể không ngăn cản bạn sử dụng các phương thức tĩnh và ngược lại. Miễn là có lý do đằng sau sự khác biệt và nó được chuẩn hóa. Không có gì tệ hơn là nhìn qua một lớp kinh doanh ngổn ngang với các phương thức thực hiện khác nhau.