2013-06-04 34 views
5

Tôi thích các biến được đặt tên chính xác nhưng trong một số trường hợp, nó rất khó thực hiện.Nhiều biến có cùng tên trong một phương thức

Vì vậy, nếu đối tượng của tôi thực hiện IDisposable sau đó tôi có thể sử dụng:

using (var whatever = new Whatever()) { //... } 

Nhưng đó là trường hợp hiếm hoi, vì vậy tôi tìm thấy một cách khác để xử lý nó - khối vô danh (không chắc chắn làm thế nào nó được gọi một cách chính xác):

//... 
{ 
    var whatever = new Whatever(); 
    //... 
} 
//... 
if (condition) 
{ 
    var whatever = new Whatever(); 
} 

Đây có phải là cách tiếp cận tốt không? Có bất kỳ cạm bẫy hoặc niềm tin rộng rãi nào làm giảm khả năng đọc mã không?

+2

Mặc dù tôi đã đọc câu hỏi, tại sao không đặt tên cho biến sau những gì nó sẽ được sử dụng cho, chứ không phải là những gì nó được tuyên bố từ ? –

+2

Tại sao bạn không thể ghi đè lên 'bất cứ điều gì'? 'var whatever = new(); ... whatever = new(); ... ' – SimpleVar

+4

Thông thường tôi sẽ chia phương pháp thành các phương thức khác nhau thay thế ... ít nhất trong nhiều trường hợp. –

Trả lời

3

Về cơ bản, nếu trình biên dịch không phàn nàn và mã của bạn có thể đọc được và dễ hiểu, không có gì sai với điều đó.

Ví dụ:

foreach (var foo in foos) 
{ 
    var task = new FooTask(foo); 
    task.Run(); 
} 
foreach (var bar in bars) 
{ 
    var task = new BarTask(bar); 
    task.Run(); 
} 

Đây là thực sự (theo ý kiến ​​của tôi) một chút dễ dàng hơn để đọc hơn

foreach (var foo in foos) 
{ 
    var task1 = new FooTask(foo); 
    task1.Run(); 
} 
foreach (var bar in bars) 
{ 
    var task2 = new BarTask(bar); 
    task2.Run(); 
} 
+1

'var task = foo? new FooTask(): BarTask mới(); task.Run(); 'có vẻ dễ đọc nhất đối với tôi, trong trường hợp này. Nhưng không thể thực hiện được nếu cả hai không thực hiện một số giao diện 'IRunnableTask', hoặc một cái gì đó tương tự. – SimpleVar

+1

@YoryeNathan Vâng, tôi đồng ý, tôi chỉ đang cố gắng tìm ra một trường hợp phù hợp với câu hỏi của OP. Tôi đã cập nhật câu trả lời của mình với các khối 'foreach' minh họa điểm tốt hơn một chút. –

+0

Tôi không bao giờ sử dụng tên biến được liệt kê bởi vì tôi tin rằng đó cũng là thực tế không tốt trong việc đặt tên chuyển đổi. Vì vậy, trong trường hợp đó tốt hơn sẽ được cung cấp cho tên mà sẽ khám phá tốt hơn mục đích sử dụng biến. Nhưng trong trường hợp của tôi biến trở thành lẻ và quá dài – Vladimirs

1

tôi chỉ kiểm tra mã của bạn vì thông thường, với VSCodeAnalysis và R # và StyleCop thở xuống cổ tôi chắc chắn sẽ có rất nhiều cảnh báo. Nhưng không. Tất cả đều giữ im lặng. Vì vậy, nó không có vẻ là chống lại bất kỳ hướng dẫn mã hóa của Microsoft.

Tuy nhiên: Nếu bạn cần tạo các khối ẩn danh thừa chỉ nhằm tránh lỗi trình biên dịch do tên biến, nó không còn dễ dàng và đơn giản nữa. Về cơ bản, bạn đang ẩn từ trình biên dịch và ẩn sẽ không bao giờ giải quyết vấn đề. Từ quan điểm của tôi, nó sẽ là cách tốt hơn mã nếu bạn đã chọn một tên chính xác cho mỗi biến (đặt tên cho loại này là không chính xác tuyệt vời anyway) và loại bỏ các khối ẩn danh.

Theo nguyên tắc KISS: "Hãy đơn giản, ngu ngốc".

1

Tôi sẽ thận trọng với cách tiếp cận này; nó có thể cản trở khả năng đọc và khả năng gỡ lỗi. Tôi đã có những tình huống trong quá khứ, nơi tôi đã có hai breakpoints xem hai biến khác nhau khi tôi nghĩ rằng tôi đã xem một.

Các quy tắc mà C# áp đặt để giúp đảm bảo rằng các phương pháp của bạn không sử dụng tên không nhất quán là phức tạp. Nếu bạn quan tâm tìm hiểu thêm về chúng, hãy xem:

http://blogs.msdn.com/b/ericlippert/archive/tags/simple+names/

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