2009-09-29 21 views
9

Tôi thích khả năng đọc.Phương pháp mở rộng - IsNull và IsNotNull, sử dụng tốt hay xấu?

Vì vậy, tôi đã đưa ra một phần mở rộng mothod cách đây vài phút cho cú pháp kiểu (x =! Null), được gọi là IsNotNull. Inversly, tôi cũng đã tạo ra một phương pháp khuyến nông IsNull, do đó

if(x == null) becomes if(x.IsNull()) 

if(x != null) becomes if(x.IsNotNull()) 

Tuy nhiên, tôi lo lắng tôi có thể lạm dụng phương pháp khuyến nông. Bạn có nghĩ rằng đây là phương pháp sử dụng Extenion không tốt?

+0

Nó rất giống http://stackoverflow.com/questions/790810/is-extending-string-class-with-isnullorempty-confusing – Vadim

+7

Nó không phải bất kỳ ngắn hơn, và đó là không rõ ràng hơn. –

+0

+1 Pavel - đặt tốt. –

Trả lời

11

Nó dường như không bất kỳ dễ đọc hơn và có thể nhầm lẫn người đọc mã, tự hỏi nếu có bất kỳ logic họ không biết trong những phương pháp đó.

Tôi đã sử dụng phương thức PerformIfNotNull (Func) (cũng như quá tải có hành động), tôi có thể chuyển biểu thức lambda nhanh để thay thế toàn bộ khối, nhưng nếu bạn không làm gì khác ngoài kiểm tra cho null nó có vẻ như nó không cung cấp bất cứ điều gì hữu ích.

2

Nó hoàn toàn hợp lệ để làm nhưng tôi không nghĩ nó cực kỳ hữu ích. Vì các phương thức mở rộng chỉ đơn giản là thủ thuật biên dịch nên tôi đấu tranh để gọi bất kỳ việc sử dụng chúng là "lạm dụng" vì chúng chỉ là lông tơ. Tôi chỉ phàn nàn về các phương pháp mở rộng khi họ làm tổn thương khả năng đọc.

2

Có tiền lệ, trong càng nhiều càng tốt các lớp chuỗi có IsNullOrEmpty

+2

Có, nhưng phần OrEmpty cung cấp chức năng bổ sung, điều này có vẻ như nó thêm nhiều cách gõ không có lợi ích. – Davy8

+1

Cá nhân tôi thích IsNullOrEmpty như là 'phương pháp ol two bird one stone. – CmdrTallen

+0

@ Davy8 - Tốt điểm –

1

Bạn cũng giới thiệu chi phí cuộc gọi phương thức cho một hoạt động nội tại CLR. JIT có thể in nó đi, nhưng nó có thể không. Đó là một nitpick vi-perf, chắc chắn, nhưng tôi đồng ý rằng nó không đặc biệt hữu ích. Tôi làm những việc như thế này khi có một cải thiện đáng kể khả năng đọc, hoặc nếu tôi muốn một số hành vi khác như "ném một ArgumentNullException và vượt qua tên arg" đó là câm để làm nội tuyến hơn và hơn nữa.

0

Điều này có thể có ý nghĩa nếu bạn, ví dụ, giả sử rằng bạn có thể muốn ném một ngoại lệ bất cứ khi nào x là null (chỉ cần làm điều đó trong phương pháp mở rộng). Tuy nhiên, tôi sở thích cá nhân của tôi trong trường hợp cụ thể này là để kiểm tra một cách rõ ràng (một đối tượng null phải là null :-)).

3

Tôi không thấy rằng vô cùng hữu ích, nhưng điều này:

someString.IsNullOrBlank() // Tests if it is empty after Trimming, too 
someString.SafeTrim()   // Avoiding Exception if someString is null 

vì các phương pháp đó thực sự giúp bạn tiết kiệm từ việc phải làm nhiều kiểm tra. nhưng thay thế một kiểm tra duy nhất bằng một cuộc gọi phương thức có vẻ vô dụng đối với tôi.

+4

'string.IsNullOrWhiteSpace' là một phương thức mới trong .NET 4 (http://msdn.microsoft.com/en-us/library/system.string.isnullorwhitespace(VS.100).aspx). –

+0

+1 thật tuyệt vời! – Botz3000

0

Để theo dõi mẫu, nó phải là thuộc tính chứ không phải là phương pháp (nhưng tất nhiên là không hoạt động với tiện ích mở rộng).

Giá trị dữ liệu trong không gian tên System.Data có thuộc tính IsNull xác định xem giá trị có chứa giá trị DbNull hay không.

Lớp DataRow có phương pháp IsNull, nhưng nó không xác định nếu DataRow là null, nó xác định nếu một trong các trường trong hàng dữ liệu chứa giá trị DbNull.

1

Thay vào đó tôi muốn đi với một cái gì đó như:

static class Check { 
    public static T NotNull(T instance) { 
     ... assert logic 
     return instance; 
    } 
} 

Sau đó sử dụng nó như thế này:

Check.NotNull(x).SomeMethod(); 
y = Check.NotNull(x); 

Cá nhân đó là rõ ràng hơn nhiều những gì đang xảy ra hơn là thông minh và cho phép như sau:

if(((Object)null).IsNull()) ... 
+0

Tôi nghĩ rằng điều này là mơ hồ, làm thế nào một người dùng nên nhớ rằng Check.NotNull (x) sẽ trả về một thể hiện cùng loại! Với tôi khi tôi đọc Check.NotNull (x) trong một mã tôi mong đợi để có được kết quả đúng/sai. –

2

Tôi hoàn toàn không đồng ý với lý do "có thể gây nhầm lẫn".

Ở một mức độ nào đó, tôi có thể thấy điều gì có nghĩa là không có lý do gì để mạo hiểm bên ngoài "hiểu biết chung" - mọi người hiểu đối tượng! = Null.

Nhưng trong Visual Studio, chúng tôi có các công cụ tuyệt vời, nơi bạn có thể chỉ cần di chuột qua phương pháp, để tiết lộ một số thông tin bổ sung.

Nếu chúng ta nói rằng phương pháp mở rộng đã được chú thích với một lời giải thích tốt, thì tôi cảm thấy rằng đối số của sự nhầm lẫn bị tách rời.

Phương thức .IsNotNull() và .IsNull() giải thích chính xác chúng là gì. Tôi cảm thấy họ rất hợp lý và hữu ích.

Trong tất cả sự trung thực, đó là vấn đề "những gì bạn thích". Nếu bạn cảm thấy các phương pháp sẽ làm cho nó dễ đọc hơn trong bối cảnh dự án của bạn, sau đó đi cho nó. Nếu bạn đang phá vỡ quy ước trong dự án của bạn, thì tôi sẽ nói ngược lại.

Tôi đã có những suy nghĩ tương tự như bạn có về chủ đề và đã hỏi một số nhà phát triển rất có kinh nghiệm tại nơi làm việc của tôi. Và không ai trong số họ đã đưa ra một lý do chính đáng (ngoại trừ những gì đã được đề cập về -confusion- ở đây) mà sẽ giải thích tại sao bạn không nên làm điều này.

Go cho nó :-)

Các vấn đề liên quan