Điều thực sự làm phiền tôi nhất về một số ngôn ngữ lập trình (ví dụ: C#, Javascript) là cố gắng truy cập thuộc tính của null
gây ra lỗi hoặc ngoại lệ xảy ra.Tại sao cố gắng truy cập thuộc tính null gây ra ngoại lệ ở một số ngôn ngữ?
Ví dụ, trong đoạn mã sau,
foo = bar.baz;
nếu thanh là null
, C# sẽ ném một khó chịu NullReferenceException
và phiên dịch javascript tôi sẽ phàn nàn với Unable to get value of the property 'baz': object is null or undefined
.
tôi có thể hiểu được điều này, về mặt lý thuyết, nhưng trong mã thực tôi thường có các đối tượng hơi sâu, giống như
foo.bar.baz.qux
và nếu bất kỳ một trong foo
, bar
, hoặc baz
là null, mã của tôi là bị hỏng. :(Hơn nữa, nếu tôi đánh giá các biểu thức sau đây trong một giao diện điều khiển, có vẻ như là kết quả không phù hợp.
true.toString() //evaluates to "true"
false.toString() //evaluates to "false"
null.toString() //should evaluate to "null", but interpreter spits in your face instead
tôi hoàn toàn khinh viết code để xử lý vấn đề này, bởi vì nó luôn tiết, mã mùi Các sau đây là những ví dụ không giả tạo, tôi nắm lấy những từ một trong những dự án của tôi (người đầu tiên là trong Javascript, thứ hai là trong C#):
if (!(solvedPuzzles &&
solvedPuzzles[difficulty] &&
solvedPuzzles[difficulty][index])) {
return undefined;
}
return solvedPuzzles[difficulty][index].star
và
if (context != null &&
context.Request != null &&
context.Request.Cookies != null &&
context.Request.Cookies["SessionID"] != null)
{
SessionID = context.Request.Cookies["SessionID"].Value;
}
else
{
SessionID = null;
}
Mọi thứ sẽ dễ dàng hơn nhiều nếu toàn bộ biểu thức trả lại null
nếu bất kỳ thuộc tính nào là rỗng. Các ví dụ mã ở trên có thể đơn giản hơn nhiều:
return solvedPuzzles[difficulty][index].star;
//Will return null if solvedPuzzles, difficulty, index, or star is null.
SessionID = context.Request.Cookies["SessionID"].Value;
//SessionID will be null if the context, Request, Cookies,
//Cookies["SessionID"], or Value is null.
Tôi đang thiếu cái gì? Tại sao những ngôn ngữ này không sử dụng hành vi này thay vì? Có khó để thực hiện vì một lý do nào đó không? Nó sẽ gây ra vấn đề mà tôi nhìn?
Không có giá trị hợp lệ cho tất cả các giá trị đó trong chuỗi không? Nó dễ dàng hơn để không lưu trữ null trong đó ở nơi đầu tiên. Sau đó, bạn có thể tránh những kiểm tra hoàn toàn. –
Bạn sẽ yêu thích [Mẫu đối tượng Null] (http://en.wikipedia.org/wiki/Null_Object_pattern) ... – fredoverflow
Đó không phải là lỗi của ngôn ngữ mà bạn quyết định có một bộ sưu tập rỗng hơn là một bộ sưu tập trống. – canon