Các cấu trúc luồng điều khiển mức cao hơn có xu hướng tương ứng với các khái niệm trong miền vấn đề. Một if / other là một quyết định dựa trên một số điều kiện. Một vòng lặp nói để thực hiện một số hành động lặp đi lặp lại. Ngay cả một tuyên bố phá vỡ nói rằng "chúng tôi đã làm điều này nhiều lần, nhưng bây giờ chúng tôi cần phải dừng lại".
Mặt khác, một câu lệnh goto có xu hướng tương ứng với một khái niệm trong chương trình đang chạy, không phải trong miền vấn đề. Nó nói để tiếp tục thực hiện tại một điểm được chỉ định trong chương trình . Ai đó đọc mã phải suy luận điều đó có nghĩa gì đối với miền vấn đề.
Tất nhiên tất cả các cấu trúc cấp cao hơn có thể được xác định theo thuật ngữ gotos và các nhánh có điều kiện đơn giản. Điều đó không có nghĩa là họ chỉ đơn thuần là ngụy trang. Hãy nghĩ về chúng như những hình ảnh bị hạn chế - và đó là những hạn chế làm cho chúng hữu ích. Một tuyên bố phá vỡ được thực hiện như một bước nhảy đến cuối vòng lặp kèm theo, nhưng tốt hơn hết là bạn nên vận hành toàn bộ vòng lặp.
Tất cả những thứ khác đều bằng nhau, mã có cấu trúc phản ánh rằng miền vấn đề có xu hướng dễ đọc và duy trì hơn.
Không có trường hợp nào một tuyên bố goto là hoàn toàn bắt buộc (có một định lý cho hiệu ứng đó), nhưng có những trường hợp nó có thể là giải pháp kém nhất. Những trường hợp khác nhau tùy theo ngôn ngữ, tùy thuộc vào những gì cấu trúc cấp cao hơn mà ngôn ngữ hỗ trợ.
Ví dụ, trong C, tôi tin rằng có ba kịch bản cơ bản trong đó một goto là phù hợp.
- Thoát ra khỏi một vòng lặp lồng nhau. Điều này sẽ không cần thiết nếu ngôn ngữ có tuyên bố phá vỡ được dán nhãn.
- Bảo lãnh ra khỏi một đoạn mã (thường là thân hàm) trong trường hợp có lỗi hoặc sự kiện bất ngờ khác. Điều này sẽ không cần thiết nếu ngôn ngữ có ngoại lệ.
- Thực hiện một máy trạng thái hữu hạn rõ ràng. Trong trường hợp này (và, tôi nghĩ, chỉ trong trường hợp này) một goto tương ứng trực tiếp với một khái niệm trong miền vấn đề, chuyển từ trạng thái này sang trạng thái khác được chỉ định, trong đó trạng thái hiện tại được biểu thị bằng khối mã nào hiện đang thực thi .
Mặt khác, một máy trạng thái hữu hạn rõ ràng cũng có thể được thực hiện với một câu lệnh chuyển đổi bên trong một vòng lặp. Điều này có lợi thế là mọi trạng thái bắt đầu tại cùng một vị trí trong mã, có thể hữu ích cho việc gỡ lỗi, chẳng hạn.
Việc sử dụng chính của một goto trong một ngôn ngữ hợp lý hiện đại (một ngôn ngữ hỗ trợ if / other và các vòng lặp) là để mô phỏng một cấu trúc luồng điều khiển bị thiếu trong ngôn ngữ.