MISRA 14.5 tuyên bố tiếp tục không được sử dụng. Bất cứ ai có thể giải thích lý do? Cảm ơn bạn.Tại sao "tiếp tục" được coi là vi phạm C trong MISRA C: 2004?
Trả lời
Đó 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ẽ ...
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.
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 .... –
@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 ") –
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. –
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.
- 1. Tiếp tục được coi là có hại?
- 2. Tại sao `chuyển đổi` được coi là cấu trúc vòng lặp cho mục đích` tiếp tục`?
- 3. Tại sao Redis được coi là CP?
- 4. Tại sao các biến toàn cầu được coi là hành vi xấu?
- 5. Tại sao tất cả các mũ liên tục được coi là phong cách mã hóa xấu?
- 6. Phạm vi biến trong C++
- 7. C# phạm vi câu hỏi
- 8. Phạm vi liên kết phạm vi C tiêu chuẩn
- 9. C++ Chuyển tiếp khai báo lớp liệt kê vi phạm
- 10. Tại sao những từ này được coi là từ dừng?
- 11. Phạm vi của hàm c được xác định trong lớp mục tiêu-c là gì?
- 12. Phạm vi của biến lambda trong C# là gì?
- 13. Tại sao = và <- không tương đương trong phạm vi()?
- 14. Tại sao lại coi 0 là True trong Ruby?
- 15. Trong C++ 11,… được coi là một toán tử?
- 16. C# Phạm vi điều hành
- 17. Hiểu Objective-C phạm vi vấn đề
- 18. Tại sao không có ổ khóa phạm vi cho nhiều mutexes trong C++ 0x hoặc Boost.Thread?
- 19. Tại sao javascript: void (0) được coi là có hại?
- 20. C/C++ 'tiếp tục' Tương đương trong VB6
- 21. Tại sao việc sử dụng nhãn phá vỡ/tiếp tục trong OOP (ví dụ: Java, C#)
- 22. strlen không được khai báo trong phạm vi này - C++
- 23. tại sao chuỗi không khai báo trong phạm vi
- 24. C# biến phạm vi không nhất quán?
- 25. Tại sao mảng Java này được coi là hai chiều?
- 26. Tại sao enums được coi là loại hợp chất?
- 27. Tại sao sizeof được coi là toán tử?
- 28. Tại sao HTTP/SOAP được coi là "dày"
- 29. tại sao sử dụng tổng trong phạm vi kết quả phạm vi 3.1 dẫn đến lỗi?
- 30. Nhấn Enter để tiếp tục trong C
Bạn đã hỏi * họ * vì lý do của họ? –
Như với tất cả các quy tắc "luôn luôn" và "không bao giờ", chúng có thể không đáng chú ý nhiều. –