2009-04-14 25 views
8

Cá nhân tôi không có vấn đề với đoạn mã sauĐâu là số dư đúng của các biến vị ngữ trong một câu lệnh if?

if (Object foo != null && !String.IsNullOrEmpty(foo["bar"])) 
{ 
    // do something 
} 

Bởi vì tôi nghĩ rằng đây là quá tiết

if (Object foo != null) 
{ 
    if (!String.IsNullOrEmpty(foo["bar"])) 
    { 
     // do something 
    } 
} 

Nhưng tôi sẽ không đi xa với quan điểm này nếu nói rằng có 5 vị và tôi phải bọc văn bản trong trình chỉnh sửa để xem tất cả cùng một lúc, có một "dòng" hợp lý mà bạn vẽ bao nhiêu biến vị ngữ mà bạn đưa vào trong một câu lệnh if trong một ý nghĩa tương tự để nói rằng các phương pháp đó không bao giờ yêu cầu nhiều hơn 7 thông số

+0

Không bao giờ nói không bao giờ. Bạn đã bao giờ sử dụng hơn 7 tham số trong họ các chức năng printf chưa? – Les

Trả lời

10

Tôi không nghĩ rằng viết lại câu lệnh if trong hai là cách, đặc biệt nếu bạn xem xét việc thêm mệnh đề else vào ví dụ của bạn sẽ cho kết quả khác nhau. Nếu tôi muốn giảm số lượng các mệnh đề nguyên tử trong tình trạng này, tôi sẽ yếu tố một số có ý nghĩa với nhau để một chức năng của riêng mình, như:

if(won_jackpot(obj)) ... 
3

Không phải số lượng các vị từ nhưng độ phức tạp đếm. Miễn là bạn có thể hiểu được những gì các mã không với nỗ lực tối thiểu, có vẻ ok với tôi.

Để thêm vào đó, tôi sẽ không thay đổi thành nhiều if nhưng tôi thêm chức năng cho các vị từ. Đặc biệt nếu cùng một số vị từ được sử dụng ở nhiều nơi.

1

Tôi không nghĩ có bất kỳ quy tắc, tuy nhiên:

  1. là nó đủ phức tạp mà khi bạn hiển thị nó cho người khác, họ phải vật lộn để hiểu nó?
  2. có cần bao gồm nhiều dòng không?
  3. bạn có kiểm tra điều kiện lặp lại trong nhiều mệnh đề 'if' không? Điều này sẽ trỏ đến việc tái cấu trúc bắt buộc vào một số phương thức

Nếu có bất kỳ điều nào ở trên áp dụng, tôi sẽ làm lại.

9

Tôi nghĩ đó là số dư của các loại toán tử khác nhau và định dạng chính xác. Nếu tất cả các nhà khai thác đều giống nhau (tất cả "và" hoặc tất cả "hoặc"), thì có thể bạn có thể ghép lại với nhau một số vô hạn các biểu thức mà không làm mất sự hiểu biết:

if (something() && 
    something_else() && 
    so_on() && 
    so_forth() && 
    some_more_stuff() && 
    yada() && 
    yada() && 
    yada() && 
    newman() && 
    soup_nazi() && 
    etc()) 
    ... 
3

Nó phụ thuộc vào những gì bạn đang làm. Câu lệnh thứ hai tạo ra một kết quả khác khi bạn đảo ngược nó. (thêm một "không" ở phía trước của nó) và là một nguồn rất phổ biến của lỗi.

Tôi đã xem mã với khoảng 20 biến vị ngữ hoạt động (hoặc ít nhất, hoạt động đủ tốt!) Quy tắc ngón tay cái tôi sử dụng, nếu nó giống như bữa tối cho chó, tôi xem xét tái cấu trúc.

4

Tôi không tin rằng có số ma thuật. Nếu tất cả các vị ngữ có ý nghĩa với nhau, thì tôi sẽ đặt chúng lại với nhau. Điều này có thể liên quan đến việc chia tách câu lệnh if trên hai dòng, nhưng tôi thường không bao giờ giới thiệu thêm nếu các câu lệnh thừa. Nhưng nếu nó đặc biệt dài, bạn nên tự hỏi mình nếu tất cả các câu lệnh đều thực sự cần thiết. Có lẽ bạn có thể lọc ra một số giá trị trước đó hoặc một cái gì đó như thế. Mối quan tâm lớn nhất là dễ đọc. Nếu người khác khó hiểu, bạn cần phải cấu trúc lại mã của mình. Nhưng tách mã thành hai câu lệnh if khác nhau hiếm khi làm cho mã dễ đọc hơn, nó chỉ chiếm nhiều dòng hơn.

5

Bộ nhớ ngắn hạn có dung lượng bảy mục, tặng hoặc lấy hai. Điều này ngụ ý rằng một biểu thức liên quan đến hơn năm đối tượng khác nhau có thể yêu cầu một để tạm dừng và suy nghĩ về nó.

1

Vấn đề này với danh sách dài các điều kiện không phải là quá nhiều mất khả năng đọc , nhưng mất khả năng thử nghiệm. Đặc biệt là khi đối phó với các đối số phương pháp xấu đôi khi nó thực sự dễ dàng hơn để yêu cầu sự tha thứ hơn là sự cho phép (ví dụ như xem câu trả lời cho this question). Bằng cách đó bạn giữ cho mã của bạn sạch sẽ và có thể kiểm tra và sửa chữa người gọi hoặc cho phép họ xử lý ngoại lệ kết quả.

0

Tất cả phụ thuộc vào những gì cần phải làm. Nhưng có một điều bạn có thể muốn nhìn vào đó sẽ làm cho các thuật toán nhất định ít tiết là một câu lệnh switch:

switch (myVal) 
{ 
    case "isThis": 
    case "isThat": 
    case "something else": 
     doThis(); 
     break; 
    case "another": 
    case "yet another": 
    case "even another": 
     doThat(); 
     break; 
    case "another one": 
    case "more more": 
     doThisAgain(); 
     break; 
}

Làm điều đó có thể đã được khá tiết trong câu lệnh if khác. Một số mã sẽ cần tấn nếu và câu lệnh khác, một số sẽ có thể được cô đặc, vv Chỉ cần không bao giờ hy sinh chất lượng của việc thực thi mã cho sự đẹp của mã nguồn.

0

Cách nào tốt hơn? Cũng không. Ngữ nghĩa của cả hai đều khác nhau.

Tôi đồng ý mặc dù tách làm cho gỡ dễ dàng hơn, nhưng như vậy không có điều kiện breakpoint :)

Nếu đó là một sự kết hợp đơn giản của 'AND là hay' OR là đó là dài hơn 3 thử nghiệm, cấu trúc lại nó.

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