Sử dụng goto ở đây thực sự quá tệ?
Vào tháng Ba năm 1968, Dijkstra gửi một bức thư cho Communications of the ACM được xuất bản dưới tiêu đề Go To Statement Considered Harmful. Đây là một bài đọc thú vị và là một phần của truyền thuyết lập trình.
Đối số chống lại GOTO được trình bày trong thư này phải liên quan đến cách lập trình viên xây dựng mô hình tinh thần để theo dõi tiến trình thực thi mã. Dijkstra lập luận rằng một mô hình tâm thần như vậy là quan trọng, bởi vì giá trị của các biến chỉ có ý nghĩa liên quan đến tiến trình thực hiện. Ví dụ, khi chương trình của chúng ta đếm số lần một sự kiện xảy ra, luôn luôn có một khoảnh khắc ở giữa mà N sự kiện đã xảy ra, nhưng biến theo dõi của nó vẫn chưa được tăng lên và vẫn ở N-1.
Ông đi qua các bước trong lập luận của mình chống lại GOTO:
Đầu tiên xem xét một ngôn ngữ rất đơn giản mà không cần thủ tục, cáp bẹ hoặc GOTO. Trong một ngôn ngữ như vậy, lập trình viên có thể theo dõi tinh thần thực hiện bằng cách tưởng tượng một con trỏ thực hiện tiến từ đầu tệp đến cuối. Một chỉ mục duy nhất (tức là số dòng) đủ để mô hình tiến trình thực hiện.
Bây giờ, chúng tôi thêm thủ tục vào ngôn ngữ. Tiến trình thực hiện có thể không còn được theo dõi bởi một chỉ mục duy nhất, vì nó có thể nằm trong một thủ tục. Chúng tôi cũng phải theo dõi từ đó thủ tục được gọi. Ngoài ra, thủ tục có thể được gọi từ các thủ tục khác. Do đó, chúng tôi lập mô hình tiến trình thực hiện như một chuỗi các chỉ mục. (Trong cuộc sống thực, các lập trình viên gọi một chuỗi như vậy là "dấu vết ngăn xếp".)
Bây giờ chúng ta thêm các vòng vào ngôn ngữ. Đối với mỗi dòng trong dấu vết ngăn xếp của chúng ta nằm bên trong một vòng lặp, chúng ta cần phải thêm một loại chỉ mục khác để mô hình tiến trình thực hiện: số đếm lặp lại.
Bây giờ chúng tôi thêm GOTO. Dijkstra lập luận rằng với việc sử dụng GOTO không hạn chế, khả năng theo dõi tiến độ thực hiện của chúng tôi hiện nay bị hỏng. Chúng tôi vẫn có thể theo dõi tiến độ thực hiện với "đồng hồ thực hiện" bằng cách nói "bây giờ chúng tôi đang thực hiện câu lệnh 152". Tuy nhiên, điều này không thực sự hữu ích khi thiết lập ngữ cảnh cần thiết để diễn giải các giá trị của các biến.
Miễn là chúng tôi chỉ sử dụng câu lệnh GOTO để xây dựng vòng lặp đơn giản, bạn có thể cho rằng tình huống tương đương với điểm (3) và không có vấn đề gì. Nhưng trong trường hợp đó bạn chỉ có thể sử dụng các cấu trúc vòng lặp. Tốt hơn là chỉ giữ GOTO ra khỏi mã của bạn, để bạn không rơi vào tình huống được mô tả tại điểm (4).
Nguồn
2010-09-24 11:08:45
Có gì sai với vòng lặp? – Joe
Không có gì sai với vòng lặp, tôi chỉ hỏi. – Pietro
Dù sao, bây giờ bạn có [những thứ khác phải lo lắng] (http://xkcd.com/292/). * SCNR * – Bobby