2012-06-11 24 views

Trả lời

16

Đó là do số ancient debate about goto, phân nhánh và mã spaghetti không điều kiện, đã diễn ra trong 40 năm hoặc lâu hơn. Các câu hỏi goto, continue, break và nhiều câu hỏi return đều được coi là tệ hơn hoặc kém hơn.

Sự đồng thuận của cộng đồng lập trình thế giới gần như đã kết thúc bằng một cái gì đó như: chúng tôi nhận ra rằng bạn có thể sử dụng các tính năng này của ngôn ngữ mà không cần viết mã spaghetti nếu bạn biết mình đang làm gì. Nhưng chúng tôi vẫn không khuyến khích họ bởi vì có một cơ hội lớn mà một người không biết những gì họ đang làm sẽ sử dụng các tính năng nếu họ có sẵn, và sau đó tạo ra spaghetti. Và chúng tôi cũng không khuyến khích họ vì chúng là các tính năng thừa: bạn có thể viết rõ ràng các chương trình mà không cần sử dụng chúng.

Vì MISRA-C hướng tới các hệ thống quan trọng, MISRA-C: 2004 có cách tiếp cận để cấm càng nhiều tính năng chi nhánh vô điều kiện càng tốt. Do đó, goto, continue và nhiều lần trả lại bị cấm. break chỉ được phép nếu có một lần ngắt trong cùng một vòng lặp.

Tuy nhiên, trong bản nháp "MISRA-C: 2011" hiện đang được đánh giá, ủy ban đã xem xét để cho phép tất cả các tính năng này một lần nữa, với giới hạn rằng goto chỉ được phép nhảy xuống và không bao giờ trở lên. Lý do từ ủy ban nói rằng hiện nay có các công cụ (tức là máy phân tích tĩnh) đủ thông minh để phát hiện luồng chương trình xấu, vì vậy các từ khóa có thể được cho phép.

Cuộc tranh luận goto vẫn diễn ra mạnh mẽ ...

5

Lập trình bằng C khiến cho việc theo dõi nhiều nhánh thực thi trở nên khó khăn. Nếu bạn phân bổ tài nguyên ở đâu đó, bạn phải giải phóng chúng ở nơi khác, không cục bộ. Nếu các nhánh mã của bạn, bạn nói chung cần phải có logic phân bổ riêng cho mỗi nhánh hoặc cách để thoát khỏi phạm vi.

Tuyên bố continue thêm một cách khác để thoát khỏi phạm vi của vòng lặp for và do đó làm cho vòng lặp khó hơn để hiểu và hiểu tất cả các cách có thể kiểm soát có thể chảy qua nó. để xác định rằng mã của bạn hoạt động chính xác trong mọi trường hợp.

Đây chỉ là suy đoán về phía tôi, nhưng tôi tưởng tượng rằng cố gắng hạn chế sự phức tạp đến từ hành vi phân nhánh phụ này là lý do lái xe cho quy tắc mà bạn đề cập đến.

+5

IMO, nếu tiếp tục tạo vòng lặp khó hiểu, thì mã vòng lặp quá dài .... –

+0

@MitchWheat: Đúng vậy. Bạn nên vận động hành lang MISRA để thêm quy tắc "không có vòng lặp dài"! (Nhưng cá nhân, trong C++, tôi thấy nó rất dễ nói để có thể bỏ qua các dòng chú thích khi phân tích cú pháp đầu vào bằng một 'tiếp tục' đơn giản. Sau đó, C++ là một ngôn ngữ phù hợp hơn cho thành ngữ" thoát sớm ") –

+3

Vô nghĩa: Từ kinh nghiệm, các tiêu chuẩn mã hóa như của chúng thường bị giảm xuống cho mẫu số chung thấp nhất. Tôi sử dụng tiếp tục trong C/C++/C# Nó là một cấu trúc hoàn hảo tốt. –

1

Như với tất cả các quy tắc Misra, nếu bạn có thể biện minh cho nó, bạn có thể đi chệch khỏi sự cai trị (phần 4.3.2 của Misra-C: 2004)

Điểm đằng sau MISRA (và các nguyên tắc tương tự khác) là bẫy những thứ thường gây ra vấn đề ... có, continue có thể được sử dụng đúng cách, nhưng bằng chứng gợi ý rằng đó là nguyên nhân phổ biến gây ra sự cố.

Như vậy, MISRA đã tạo quy tắc để ngăn chặn việc sử dụng (ab) của nó và cộng đồng đánh giá đã phê duyệt quy tắc. Và lượt xem của cộng đồng người dùng thường hỗ trợ quy tắc.

Nhưng tôi lặp lại, nếu bạn thực sự muốn sử dụng nó, và bạn có thể biện minh cho hệ thống phân cấp công ty của bạn, đi chệch.

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