2013-08-22 37 views
5

Thực tiễn không tốt trong trường hợp chuyển đổi có phải là trường hợp chuyển đổi không? Nếu vậy, lựa chọn thay thế là gì? Tôi thực sự không muốn sử dụng if/else if nếu tôi không cần.Thực tiễn không tốt trong trường hợp chuyển đổi có phải là trường hợp chuyển đổi không?

Thay vì làm một số như:

if((this == 1) && (that == 1)){ //something } 
else if((this == 1) && (that == 2)){ //something } 
else if((this == 2) && (that == 3)){ //something } 

Tôi đã suy nghĩ dọc theo dòng:

switch(this){ 
    case 1: 
     switch(that){ 
      case 1: 
       // something 
      break; 
      .... 
     } 
    break; 
    .... 
} 

Nó chỉ trông thật sự không đúng với tôi. Không sai về cú pháp nhưng sai về thực hành đúng.

+2

Tôi có thể xem các trường hợp OK. Nhưng tôi nhìn chằm chằm vào nó khá lâu và xem liệu tôi có thể tìm ra một kỹ thuật đơn giản hơn không. –

+0

Không thực sự là một bản dupe, nhưng có thông tin liên quan/thú vị: http://stackoverflow.com/questions/7807970/nesting-switch-cases-in-javascript-any-speed-advantage – Joum

+1

Để nhận được câu trả lời có liên quan, sẽ tốt hơn nếu thêm mã của bạn vào câu hỏi ... –

Trả lời

3

Tránh sau cách tiếp cận

switch(id) 
{ 
    case 1: 
    { 
     switch (subid) 
     { 
      case 4: 
       // nested code 
     } 
    } 
    case 2: 
     // some code 
} 

Cách tiếp cận thích hợp hơn và cải thiện mã của bạn bằng cách di chuyển phần lồng vào một phương pháp

switch(id) 
{ 
    case 1: 
     SubSwtich(subid); 
     break; 
    case 2: 
     // some code 
} 

function SubSwtich(int subid) 
{ 
     switch (subid) 
     { 
      case 4: 
       // nested code 
     } 
} 
+0

Cảm ơn tất cả các bạn vì những câu trả lời tuyệt vời. Tôi đánh giá cao tất cả những hiểu biết. – seroth

3

tôi sẽ coi đó là một tình huống không tốt. trong hầu hết các trường hợp, điều này không thể đọc được.

bạn có thể trích xuất các trường hợp chuyển "phụ" thành phương thức.

7

Thực tiễn không tốt là có các chức năng lớn làm nhiều việc khác nhau. Nếu bạn có trường hợp chuyển đổi trong trường hợp chuyển đổi, điều đó cho thấy chức năng của bạn có thể quá lớn và bạn nên xem xét tách nó thành các phần nhỏ dễ hiểu hơn.

Nhưng không có quy tắc cứng và nhanh; tất cả phụ thuộc vào kịch bản chính xác.

0

Thực hành không tốt? Không! Một nỗi đau tiềm năng khi nói đến xử lý sự cố, có lẽ! Xem những gì bạn có thể làm để chuyển tất cả các 'tùy chọn' thành một cái gì đó được tổ chức hơn và thường được kết nối. Thậm chí có thể viết chức năng của riêng bạn bằng cách sử dụng phương thức nạp chồng được xác định bởi số lượng tham số được gửi đi.

Hãy xem at this SO post và xem liệu nó có cung cấp cho bạn một số ý tưởng hay không.

0

Bạn nên ngắt mã theo các thói quen khác nhau, tùy thuộc vào câu lệnh chuyển đổi và trong chế độ thường xuyên, bạn cũng có thể tiếp tục sử dụng hộp chuyển đổi. Cũng giống như sau.

private void Switch(int value) 
    { 

     switch (value) 
     { 
      case 1: 
       SwitchNest(value); 
       break; 
      case 2: 
       break; 
     } 
    } 

    private void SwitchNest(int value) 
    { 
     switch (value) 
     { 
      case 1: 
       SwitchOtherMethod(value); 
       break; 
      case 2: 
       break; 
     } 
    } 
+0

Một chức năng để sử dụng một lần, tôi cho rằng, không đáng giá. Chưa kể bạn đang nhảy các vị trí bên trong mã để theo dõi luồng công việc thay vì một nơi. (Từ một quan điểm dễ đọc, và điều này có thể là IMHO, tôi muốn thay đổi thông qua các thiết bị chuyển mạch lồng nhau hơn là theo đuổi các chức năng một lần.) –

1

Nếu nó làm cho mã của bạn khó khăn hơn để đọc, sau đó nó xấu thực hành.

Cho dù đó là trường hợp trong ví dụ cụ thể của bạn là tùy thuộc vào bạn để quyết định, nhưng nói chung tôi muốn nói nó có thể là trường hợp.

Bạn hỏi giải pháp thay thế ...

  1. Trích xuất một số mã của bạn thành một phụ chức năng. Ví dụ:

    case 'foo' : 
        myVar = 'blah'; 
        break; 
    case 'bar' : 
        myVar = secondLevelFunction(); 
        break; 
    

    Ở đây, secondLevelFunction() chứa switch() tuyên bố thêm trong đó mỗi case trả về một giá trị cho myVar.

  2. Sử dụng ánh xạ mảng.Ví dụ:

    var mapper = {'foo':'blah', 'bar':'bibble', etc}; 
    
    //now, instead of a big switch(input) { .... } block that sets myVar 
    //for each option, you can just set it directly in a single line, like so: 
    var myVar = mapper[input]; 
    

Ngoài ra, nếu bạn đang tìm kiếm biện pháp cụ thể về chất lượng mã, bạn nên tìm hiểu về Cyclomatic Complexity. Đây là thước đo mức độ phức tạp của hàm. Phép đo được thực hiện bằng cách xem có bao nhiêu "điểm quyết định" mà hàm có. Mỗi case, if, vòng lặp, v.v. là "điểm quyết định". Bạn càng có nhiều chức năng của bạn càng phức tạp.

Độ phức tạp của Cyclomatic liên quan đến chất lượng mã và thực hành mã hóa tốt, vì vậy nếu hàm của bạn có điểm CC cao (có thể sẽ làm nếu nó có nhiều khối lồng nhau switch), thì đó là dấu hiệu của chất lượng mã kém . Cả hai giải pháp thay thế mà tôi đã mô tả ở trên đều có thể giúp giải quyết vấn đề này. Tôi sẽ để nó cho bạn đọc thêm về CC.

Rõ ràng là các giải pháp thay thế sẽ cần phải được điều chỉnh theo nhu cầu của bạn, nhưng hy vọng chúng sẽ cung cấp cho bạn một số ý tưởng.

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