Tôi đã nghe nói rằng nên xác thực các đối số của các phương thức công khai:
- Có nên kiểm tra null nếu anh ta không mong đợi null?
- Một phương thức nên xác nhận các tham số của nó?
- MSDN - CA1062: Xác thực các đối số của các phương thức công khai (Tôi có nền tảng .NET nhưng câu hỏi không phải là C # cụ thể)
Động lực là điều dễ hiểu. Nếu một mô-đun sẽ được sử dụng sai cách, chúng tôi muốn ném ngoại lệ ngay lập tức thay vì bất kỳ hành vi không thể đoán trước.
Điều làm phiền tôi, đó là các đối số sai không phải là lỗi duy nhất có thể được thực hiện trong khi sử dụng một mô-đun. Dưới đây là một số tình huống lỗi trong đó chúng tôi cần thêm kiểm tra logic nếu chúng tôi thực hiện theo khuyến nghị và không muốn leo thang lỗi:
- Cuộc gọi đến - cuộc tranh cãi bất ngờ
- Cuộc gọi đến - mô-đun ở trạng thái sai
- Cuộc gọi bên ngoài - kết quả không mong đợi được trả về
- Cuộc gọi bên ngoài - tác dụng phụ không mong muốn (nhập kép vào mô-đun gọi, phá vỡ các trạng thái phụ thuộc khác)
Tôi đã cố gắng tính đến tất cả các điều kiện này và viết một mô-đun đơn giản với một phương thức (xin lỗi, không phải là C # guys):
public sealed class Room
{
private readonly IDoorFactory _doorFactory;
private bool _entered;
private IDoor _door;
public Room(IDoorFactory doorFactory)
{
if (doorFactory == null)
throw new ArgumentNullException("doorFactory");
_doorFactory = doorFactory;
}
public void Open()
{
if (_door != null)
throw new InvalidOperationException("Room is already opened");
if (_entered)
throw new InvalidOperationException("Double entry is not allowed");
_entered = true;
_door = _doorFactory.Create();
if (_door == null)
throw new IncompatibleDependencyException("doorFactory");
_door.Open();
_entered = false;
}
}
Bây giờ an toàn =)
Nó khá đáng sợ. Nhưng hãy tưởng tượng nó đáng sợ như thế nào trong một mô-đun thực với hàng tá phương thức, trạng thái phức tạp và rất nhiều cuộc gọi bên ngoài (hi, những người yêu thích tiêm phụ thuộc!). Lưu ý rằng nếu bạn đang gọi một mô-đun mà hành vi có thể bị ghi đè (lớp không được niêm phong trong C #) thì bạn đang thực hiện một cuộc gọi bên ngoài và hậu quả không thể dự đoán được trong phạm vi của người gọi.
Tóm tắt, cách nào là đúng và tại sao? Nếu bạn có thể chọn từ các tùy chọn bên dưới, hãy trả lời các câu hỏi bổ sung.
Kiểm tra toàn bộ mô-đun sử dụng. Chúng ta có cần kiểm tra đơn vị không? Có ví dụ về mã như vậy? Có nên hạn chế tiêm phụ thuộc trong việc sử dụng (vì nó sẽ gây ra logic kiểm tra nhiều hơn)? Không thực tế khi chuyển các kiểm tra đó sang thời gian gỡ lỗi (không bao gồm trong bản phát hành)?
Chỉ kiểm tra đối số. Từ kinh nghiệm của tôi, kiểm tra đối số - đặc biệt là kiểm tra null - là kiểm tra ít hiệu quả nhất, bởi vì lỗi đối số hiếm khi dẫn đến các lỗi phức tạp và leo thang lỗi. Hầu hết thời gian bạn sẽ nhận được NullReferenceException
ở dòng tiếp theo. Vậy tại sao kiểm tra đối số là đặc biệt?
Đừng kiểm tra sử dụng mô-đun. Đó là ý kiến khá phổ biến, bạn có thể giải thích tại sao?