Thứ nhất: đừng làm quá nhiều trong một câu lệnh. Nếu bạn có số lượng lớn các hoạt động dereferencing trong một dòng, nó sẽ là nhiều hơn khó tìm được thủ phạm. Các Law of Demeter giúp với điều này quá - nếu bạn đã có một cái gì đó như order.SalesClerk.Manager.Address.Street.Length
sau đó bạn đã có rất nhiều tùy chọn để lội qua khi bạn nhận được một ngoại lệ. (Tôi không giáo điều về Luật của Demeter, nhưng tất cả mọi thứ trong chừng mực ...)
Thứ hai: thích đúc qua sử dụng as
, trừ khi đó là hợp lệ cho đối tượng là một kiểu khác nhau, mà thông thường liên quan đến một kiểm tra null ngay sau đó. Vì vậy, ở đây:
// What if foo is actually a Control, but we expect it to be String?
string text = foo as string;
// Several lines later
int length = text.Length; // Bang!
Ở đây chúng ta sẽ nhận được một NullReferenceException và cuối cùng theo dõi nó trở lại text
là null - nhưng sau đó bạn sẽ không biết liệu đó là bởi vì foo
là null, hoặc bởi vì nó là một loại bất ngờ. Nếu nó nên thực sự, thực sự là mộtstring
, sau đó đúc thay vì:
string text = (string) foo;
Bây giờ bạn sẽ có thể cho biết sự khác nhau giữa hai kịch bản.
Thứ ba: như những người khác đã nói, xác thực dữ liệu của bạn - thường là đối số cho API công khai và tiềm năng nội bộ. Tôi làm điều này ở đủ nơi trong Noda Time rằng tôi đã có một lớp tiện ích để giúp tôi từ chối kiểm tra. Vì vậy, ví dụ (từ Period
):
internal LocalInstant AddTo(LocalInstant localInstant,
CalendarSystem calendar, int scalar)
{
Preconditions.CheckNotNull(calendar, "calendar");
...
}
Bạn nên tài liệu những gì có thể và không thể được null, quá.
Nguồn
2012-04-12 16:57:51
Luôn 'Tự do' cho giá trị null. – leppie
@leppie - đó là rất nhiều khẳng định! Có, tôi có thể làm điều đó nhưng tôi đã hy vọng cho một giải pháp thanh lịch hơn để đưa vào các tình huống tài khoản như tôi quên làm điều đó :) –
Protip: Giữ cho bạn phương pháp nhỏ (nói tối đa 10-20 dòng), sau đó bạn không thực sự cần số dòng . – leppie