Trước đây được biết về vòng lặp không thấy nói đến vòng lặp goto hay là go...
Nếu goto cũng gọi là vòng lặp thì đệ quy có thể gọi là 1 kiểu vòng lặp?
Goto là một hình thức để thực hiện vòng lặp không có cấu trúc.
Định nghĩa cấu trúc trong ngữ cảnh vòng lặp:
Loại vòng lặp có cấu trúc được ngôn ngữ quy định cho nên chúng cũng có sự chặt chẽ của chúng. Điển hình là giới hạn (boundary) và phạm vi (scope) vòng lặp được xác định rõ rệt. Giới hạn: vòng lặp có đầu và đuôi (điển hình đầu For, đuôi Next), ở giữa là một nhóm code (block). Phạm vi: hai vòng lặp chỉ có thể chứa nhau chứ không thể móc vào nhau. Chính trình dịch sẽ kiểm soát hai luật này, không cho vi phạm.
Loại vòng lặp không cấu trúc hoàn toàn không có sự kiểm soát của trình dịch. Muốn mấy đầu mấy đuôi đều chả ai cản được. Muốn vòng chỗ nào thì vòng. Muốn móc chỗ nào thì móc.
Tuy nhiên, GoSub mà bảo làm vòng lặp thì gượng ép quá. GoSub là một lệnh cổ, thời ngôn ngữ chưa được cấu trúc hoá. Người ta bây giờ chỉ dùng nó làm một xảo thuật để lặp lại một nhóm code (lưu ý là từ "lặp" thì đúng, nhưng "vòng" thì gượng ép).
Nhiều người vẫn thích dùng GoSub vì có hai lý do:
1. cái "sub" mà GoSub nhảy vào vẫn còn nằm trọn trong Sub mẹ cho nên chia sẻ cùng tầm vực biến với Sub mẹ. Như vậy khỏi mất công truyền tham số mà vẫn tránh không phải dùng biến toàn cục. Lưu ý là cũng như biến toàn cục, được cái lợi chia biến thì cũng mang cái hại là khó kiểm soát biến.
2. khi GoSub thì VBA chỉ phải chép địa chỉ "Return" vào stack, không phải làm mấy thủ tục khác như khi Call cho nên GoSub nhanh hơn Call.
Kết luận: Goto và GoSub là loại lệnh nhảy của code mỳ Ý (gú gô từ khoá spaghetti code). Trường phái chung chung viết code có cấu trúc không dùng.
Người dùng hai lệnh Goto/GoSub này thuộc về hai hạng:
a. viết code cẩu thả, không nắm vững cấu trúc.
b. viết code rất giỏi (vì vậy mới có cái chuyện tự phong "siêu cao" [sic] ở trên), và không màng tới cấu trúc. Tuy nhiên, họ tự có một số quy luật riêng để theo. Không có số quy luật này thì chắc chắn sẽ bị:
i) không kiểm soát được biến, không kiểm soát được các đường rẽ nhánh.
ii) vài tháng sau, đọc lại code sẽ chẳng hiểu mình viết gì.
Dùng vòng lặp hay viết code cho dễ đọc chỉ dành cho các đối tượng "hạng xoàng" như anh Vetmini thôi. Cấp độ "siêu cao" ưu việt hơn nhiều, tư duy và cách viết code phải khác biệt giữa đám đông. Anh Vetmini nên cố gắng tiếp thu và học tập tư duy "vòng lặp siêu cấp" để tiệm cận được cấp độ "siêu cao" nhé.
Ở môi trường tôi, người ta tính tiền công theo các Tiêu Chí Vận Hành (Functional Benchmarks) của code. Code "viết cho khó đọc" thì bên nghiệm thu họ lấy gì nghiệm thu mà trả tiền?
Chuyện code bị đánh cắp là chuyện của bên nhận code. Mấy chục năm làm việc với họ, tôi chưa hề nhận một hợp đồng nào có tiêu chí "code khó bị đánh cắp".
Chức vị "siêu cao" nhường cho mấy người muốn ngồi trên bục thờ đi. Tôi còn trần tục lắm, vẫn cần cơm ăn áo mặc.
Thực ra lúc về sau này tôi làm bên nghiệm thu nhiều hơn bên viết code. Code viết không chú thích đầy đủ là tôi xổ toẹt. Mấy thằng lập trình đống code bên Xi Lợt Lợt hoặc Ê Ét Em thì chỉ làm khổ xếp chúng (thằng Xi Nho) thôi. Tôi bắt thằng trưởng nhóm phải viết lại cái pseudo-code, và bảo đảm là code bên trong thực sự như vậy trước khi nghiệm thu.