2012-06-21 32 views
6

Tôi đã được thông báo rằng việc sử dụng nhãn ngắt và tiếp tục trong ngôn ngữ OOP không phải là kiểu lập trình OOP. Bạn có thể giải thích chi tiết tại sao và vấn đề là gì? Bí quyết là với từ nhãn này. Tôi có nghĩa là dán nhãn/tiếp tục.Tại sao việc sử dụng nhãn phá vỡ/tiếp tục trong OOP (ví dụ: Java, C#)

class BreakWithLabelDemo { 
    public static void main(String[] args) { 

     int[][] arrayOfInts = { 
      { 32, 87, 3, 589 }, 
      { 12, 1076, 2000, 8 }, 
      { 622, 127, 77, 955 } 
     }; 
     int searchfor = 12; 

     int i; 
     int j = 0; 
     boolean foundIt = false; 

    search: 
     for (i = 0; i < arrayOfInts.length; i++) { 
      for (j = 0; j < arrayOfInts[i].length; 
       j++) { 
       if (arrayOfInts[i][j] == searchfor) { 
        foundIt = true; 
        break search; 
       } 
      } 
     } 

     if (foundIt) { 
      System.out.println("Found " + searchfor + 
           " at " + i + ", " + j); 
     } else { 
      System.out.println(searchfor + 
           " not in the array"); 
     } 
    } 
} 

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html

+8

Đừng tin vào mọi thứ bạn nghe thấy. – crypted

+3

Đây có phải là ngữ cảnh của một số khối mã cụ thể hoặc một nhận xét chung không? [Một người phải đối mặt với cùng một] (http://programmers.stackexchange.com/questions/58237/are-break-and-continue-bad-programming-practices) – V4Vendetta

+3

http://programmers.stackexchange.com/questions/58237/đang-break-và-tiếp-xấu-lập trình-thực hành – Niko

Trả lời

23

Người đã nói với bạn rằng điều đó có thể có nghĩa là nghỉ giải lao và tiếp tục là các tuyên bố phân nhánh như goto là một cơ chế bắt buộc lập trình.

Ngắt/tiếp tục chỉ cho phép bạn chuyển sang tuyên bố bên ngoài, có nghĩa là bạn không thể đi khắp mọi nơi trong mã. Vì vậy, bạn ở trong cùng một đối tượng phương thức, vì vậy nó không tương thích với OOP.

Dù sao, nói rằng ngắt và tiếp tục không phải là OOP là không có ý nghĩa. Chúng ta có thể thảo luận về tác động của chúng đối với khả năng đọc được, nhưng đó là tất cả.

-4

Tôi nghĩ rằng lý do chính là mã mà không phải là quá rõ ràng với break và continue.

Nhưng cũng có thể có một số vấn đề về hiệu năng (không liên quan đến OOP): CPU sử dụng các trình dự đoán để tải lệnh trong hàng đợi trước khi lệnh này được xử lý. Nó dễ dàng cho dự đoán để phát hiện những gì hướng dẫn để tải tiếp theo cho nhảy có điều kiện và sẽ khó khăn hơn cho vô điều kiện.

+1

Bạn đang nói rằng các dự đoán nhánh CPU không thể xử lý các bước nhảy vô điều kiện? Nó đã được khá một vài năm kể từ khi tôi đã được giao dịch với phần cứng ở cấp đó, nhưng tại thời điểm nhảy vô điều kiện được coi là trường hợp _trivial_ ... –

+0

Tôi nghĩ rằng OP nhầm lẫn tuyên bố của mình với tối ưu hóa trình biên dịch. Từ mã hoàn chỉnh: Một goto vô điều kiện làm cho luồng dữ liệu khó phân tích và giảm khả năng của trình biên dịch để tối ưu hóa mã. – rents

16

ngắt và tiếp tục không phải là chức năng lập trình kiểu. Không có gì về OOP đề xuất break, continue hoặc thậm chí goto trong một phương pháp là một ý tưởng tồi.

IMHO sử dụng ngắt và tiếp tục không được khuyến khích bằng ngôn ngữ OOP vì chúng có thể dẫn đến sự phức tạp và nhầm lẫn. Vì Nhãn được sử dụng hiếm khi chúng có thể gây nhầm lẫn hơn nữa. Tôi sẽ nói rằng bạn vẫn nên sử dụng chúng khi bạn cảm thấy nó là giải pháp đơn giản nhất cho vấn đề.

// confusing use of LABEL 
http://www.google.com/ 
do { 
    if (condition) continue http; 
} while(condition2) 

khác sử dụng khó hiểu

GOTO: { 
    // code 
    if (condition) 
     break GOTO; // without a loop 
    // code 
} 

Tốt sử dụng một nhãn

OUTER: 
for(outer loop) { 
    for(inner loop) 
     if (condition) 
     continue or break OUTER; 
} 

sử dụng Odd của một nhãn

FOUND: { 
    for(loop) 
     if(found) 
      break FOUND; 

    // not found 
    handle not found 
} 
+4

Tôi không đồng ý trên goto, nếu goto cho phép bạn đi bất cứ nơi nào trong mã nó không còn OOP. Nếu goto được giới hạn trong phương pháp hiện tại, thì ok. – tibo

+0

Điểm tốt. Tôi đã suy nghĩ điều này, nên đã đề cập đến nó. –

2

Bruce Eckel đã viết trong "tư duy trong Java" ý tưởng sau: "Điều quan trọng là phải thành viên là lý do duy nhất để sử dụng nhãn trong Java là khi bạn có vòng lặp lồng nhau và bạn muốn phá vỡ hoặc tiếp tục thông qua nhiều cấp độ lồng nhau. "

Thực ra khi bạn không sử dụng lables, quy trình làm việc của mã rõ ràng hơn trong nhiều trường hợp.

2

Lời khuyên không nên sử dụng ngắt/tiếp tục có thể không thực sự liên quan đến OOP. Nó dựa trên thực tế là những phát biểu này tương tự như GOTO khét tiếng, có thể làm cho mã hoàn toàn không thể đọc được. Tuy nhiên, giáo điều là counsels xấu. Các mô hình chính nên dễ đọc mã. Nhảy ra khỏi vòng lặp trong dòng đầu tiên bằng cách phá vỡ hoặc tiếp tục có thể rõ ràng hơn nhiều so với việc đặt toàn bộ phần còn lại vào một điều kiện nếu.

+0

Chính xác, đây là quan điểm của tôi. Ngay bây giờ vòng lặp của tôi với một tiếp tục là có thể đọc được nhưng linter của chúng tôi là phàn nàn. Thở dài ... phá vỡ, tiếp tục không có gì giống như GOTO và cần thiết trong nhiều trường hợp. –

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