Bạn không. Và ví dụ của riêng bạn là một ví dụ hoàn hảo để chỉ ra tại sao không.
Bạn muốn gửi email, phải không? Vì vậy, bạn tạo ra một nơi nào đó một lớp tĩnh CommunicationUtilities
với một tĩnh SendEmail()
trong đó. Bạn sử dụng phương thức này từ một số lớp thực hiện một loạt các công cụ, ví dụ như đặt lại mật khẩu của người dùng và gửi cho anh ta một mật khẩu mới qua email. Hoàn hảo.
Bây giờ, điều gì xảy ra nếu bạn muốn kiểm tra đơn vị lớp học của bạn? Bạn không thể, bởi vì mỗi khi bạn muốn kiểm tra phương thức đặt lại mật khẩu, nó sẽ thay đổi cơ sở dữ liệu (không phù hợp với kiểm tra đơn vị) và hơn nữa sẽ gửi email (thậm chí còn tệ hơn).
Bạn có thể đã đọc về Inversion of Control, có lợi ích giúp việc kiểm tra đơn vị dễ dàng hơn. Các bài viết về IoC sẽ giải thích cho bạn rằng thay vì làm một cái gì đó như:
void ResetPassword(UserIdentifier userId)
{
...
new MailSender().SendPasswordReset(userMail, newPassword);
}
bạn làm:
void ResetPassword(IMailSender sender, UserIdentifier userId)
{
...
sender.SendPasswordReset(userMail, newPassword);
}
cho phép sử dụng giả và sơ khai.
Hãy thử áp dụng IoC cho bạn CommunicationUtilities
. Phải, bạn không thể. Đó là lý do tại sao nó bị hỏng.