PDA

View Full Version : ve viec dung goto



skywalker
22-09-2002, 18:15
em đọc sách thì người ta nói là dùng các lệnh goto, break,... gì đó là phi pascal, nhưng mà ở một số bài giải thì các thầy lại dùng goto, break một cách liên tục, thế là sao, mình có thể dùng goto, break mà ko bị mất cảm tình ko

Nicky
22-09-2002, 19:49
Bạn cứ dùng thoải mái chứ mắc mớ gì đâu !
Việc dùng goto, break là một cách tốt để điều hướng chương trình.

quangvu
23-09-2002, 08:39
Tôi cho là không nên dùng GoTo vì như vậy "sẽ làm mất cấu trúc của chương trình" (như lời With ,tác giả pascal có nói).
Thục ra thì Pascal được thiết kế có nhiều lý do ,một trong các lý do đó là vì With không muốn các học trò của ông sử dịng "Goto".Bạn có thể dùng các cấu trúc khác để thay GoTo ,như vậy sẽ tốt hơn.

real_time
23-09-2002, 10:43
dung goto lam gi khi ma minh co cac vong lap hay hon nhieu!
Con dung break thi con co the tam chap nhan duoc

Nicky
23-09-2002, 14:47
Nhưng dùng Goto rất tiện lợi trong việc bẫy lỗi !

quangvu
23-09-2002, 14:53
1.Với chương trình nhỏ thì có thể ,nhưng với các chương trình lớn và phức tạp thì dùng GoTo sẽ làm chương trình rối rắm.
2.Pascal và một chương trình có cấu trúc mạnh ,rõ ràn và "đẹp" .Nó được mệnh danh là "Nữ hoàng của các Ngôn Ngữ Lập trình" ,dùng GoTo sẽ làm mất ý nghĩa Pascal.
3.Các cấu trúc trong Pascal (Do while ,Repeat Until,If Then,If Then Else )đủ sức thay thế cho lệnh GoTo và làm cho chương trình thêm sáng sủa.
---> Tôi hy vọng các bạn học Pascal (và cả C/C++) cố gắn tránh (tốt nhất không dùng) lệnh GoTo.

patfinder
23-09-2002, 15:14
Theo toi thi doi khi de toi uu chuong trinh cung can ung goto

Zero
23-09-2002, 17:46
Tại sao để tối ưu chương trình lại cần dùng GOTO?

Tôi không nghĩ là nên dùng GOTO để lập trình vì thực tế thì lệnh GOTO sẽ phá vỡ cấu trúc chương trình, tôi có một đứa bạn hồi mới học nó suốt ngày dùng goto chỗ nào cũng lôi vào nhưng nó đã bỏ không dùng GOTO từ lâu lắm rồi.

To skywalker : thế nào là mất cảm tình ? nếu chấm bài thì cứ cho chạy test rồi đo thời gian lấy điểm chứ có ai để ý đến trình bày và cách viết đâu, nói về cách viết ct thì có nhiều thầy mình học có cách viết rất khó đọc hic mỗi khi xem bài giải mẫu là đau cả mắt.

CrazyBabe
24-09-2002, 09:30
Hì hì, tại sao lại không dùng ? Có cái gì mà ngôn ngữ cung cấp là vô tác dụng đâu nhỉ ? Thực tế các bạn suy nghĩ không kĩ rùi, ngữ pháp phát sinh khoá Goto không phải để thay thế các cấu trúc lặp mà để mềm hoá chương trình, thực tế tôi chưa thấy ai phàn nàn về sự có mặt của kiến trúc này cả (Ngay cả với những người dùng ngôn ngữ dòng C). Thực sự Goto thích hợp với kĩ thuật cắt khối mã - Tương tự như kiểu long_jumping của assembly chẳng hạn - Rất cần thiết, có thể nói là không thể thiếu trong một số trường hợp, có thể bạn thay thế nó bằng một cú pháp khác rối rắm hơn nhưng có vẻ dễ hiểu hơn, nhưng chẳng hiểu thay 1 mã = 4,5 mã rùi chạy cả vạn lần thì sao ? Các bạn tự tìm đến con đường vòng cho chương trình của mình rùi đó. Mà thực sự theo tôi nhớ, goto của P đâu có cho phép nhảy ra khỏi khối mã thực sự của nó ? Vậy thì đâu có "phá vỡ kiến trúc chương trình" được ?
With quangvu: Bạn đừng nên "hi vọng" điều đó, loại bỏ một thành phần của ngôn ngữ mình sự dụng là điều ngu xuẩn nhất mà tôi đã từng nghe, hãy nhớ cho rằng khi xây dựng ngôn ngữ từ phòng thí nghiệm, các kĩ sư tập trung một khối lượng lớn tester và điều đầu tiên họ làm là loại bỏ đi những thứ không cần thiết. Trong quá trình phát triển các trình biên dịch "xịn" cho dòng P và C, tôi không biết một trình dịch nào loại bỏ Goto cả.
Còn những người nói Goto làm phá vỡ kiến trúc chương trình hay làm nó rối rắm hơn, có thể chưa biết được vị trí thực sự của kiến trúc này, hoặc là kĩ năng quá giới hạn, không hiểu được-không xây dựng được một chương trình có dùng Goto chăng ?

quangvu
24-09-2002, 16:49
Bạn nói rất đúng ,GoTo được viết ra là để mềm hoá chương trình ,như đó là từ thập niên 60 -70.Khi mà các Lập trình viên phải dựa trên các ngôn ngữ cổ như Fortran ,Cobol ,Algol 68 . . . .Và khi đó cấu trúc lệnh vẩn còn rất nghèo nàn ,như chỉ có if .. then mà không có if then else (trong Fortran).
Khi đó ,việc dùng GoTo là một phương pháp tiện lợi ,hiệu quả và gần như bắt buộc để xây dựng các ứng dụng lớn.Người ta gọi cách lập trình đó là lập trinh "Phi cấu trúc".
Do đó ,North With đã nân cấp Algol 68 thành Algol_W .và đây là ngôn ngữ duy nhất thời đó hổ trợ "Đệ quy" (Thuật toán QuickSort nổi tiếng phải đợi đến khi có Algol_W mới chạy được,và tác giả thuật toán QuickSort đã khuyến khích With cải tiến Algol_W -> Pascal),và được cải tiến thêm một bước nửa thành Pascal .Mở đầu thời kì "Lập trình cấu trúc".
Cấu trúc dữ liệu + giải thuật = Chương trình
và lệnh GoTo được đưa và Pascal chẳng qua do "Bắc đắc dĩ" ,vì các giáo trình thời đó và cảc các ứng dụng nửa đều dùng GoTo .Có GoTo trong Pascal chẳng qua do "Tương thích ngược".Và như With đã nói "Dùng GoTo là không hiểu hết Pascal" (hay đại loại thế ,xin lỗi tôi không nhớ hết nguyên văn,trong sách "Giáo trình Pascal" của Quách Tuấn Ngọc).
Và hiện nay ,các ngôn ngữ hiện tại đã hỗ trợ cho chúng ta rất nhiều thứ để né GoTo như cấu trúc If then else ,case of . . .,sử dụng hàm và thủ tục hay lập trình OOP cũng là một số kĩ thuật +phương pháp thông dụng.
Dùng GoTo để bẩy lổi thì mình chỉ thấy trong VB 6.0 ,nhưng sang Vb.Net thì nó bỏ phong cách này rồi (dùng Try . . .catch như trong Java) ,tại sao ?
Và chọn dùng GoTo hay không ngoài khả năng lập trình ra còn một vấn đề nửa là "Sở thích" ,và dĩ nhiên không ai bắt buộc bạn phải từ bỏ GoTo.Nếu bạn nhiệt tình ủng hộ GoTo như vậy ,xin hỏi có phải bạn là một Fan của VB không .(Khi dùng VB thì bắt buộc phải dùng GoTo).
Tuy nhiên với người mới học thi tôi khuyên nên bỏ phong cách này để cấu trúc bạn tường minh hơn và Pascal hơn.

Nicky
25-09-2002, 15:07
Rite !!!
Nếu dùng VB 6 thì không thể nào không dùng đến Goto, và trong VB goto tỏ ra rất hiệu quả trong việc bẫy lỗi và vài thứ khác.
Còn trong Pas, C ? Không có thứ gì mà bỏ phí, không ai ở không mà nghĩ ra goto để rồi không dùng. Việc dùng hay không vả chăng chỉ là do sở thích hay thói quen mà thôi.
Nhưng mà đừng tự làm mình khó hiểu bằng những lệnh Goto là được !

real_time
25-09-2002, 15:14
Theo mình được biết trong Passcal và trong C/C++ thi các thầy giáo khuyến khích không nên dùng goto vì như thế dễ phát sinh lỗi không lường trước được nên theo mình đã có vô số vòng lắp khác rùi cần gì đến goto nữa! còn trong delphi va basic thi minh ko rõ lắm!

White_Rose
28-09-2002, 14:01
Bài viết được gửi bởi Nicky
Rite !!!
Nếu dùng VB 6 thì không thể nào không dùng đến Goto, và trong VB goto tỏ ra rất hiệu quả trong việc bẫy lỗi và vài thứ khác.
Còn trong Pas, C ?
bẫy lỗi thì hiệu quả thật nhưng mà không thể nào không dùng thì mình chả hiểu gì cả. Nếu viết một chương trình không thể có lỗi (tất nhiên chỉ là lý thuyết còn thực sự thì hầu như chương trình nào chả có lỗi, chỉ là nhiều hay ít thôi) thì càng tốt chứ sao. Vì thế chỉ dùng nếu bị bắt buộc thôi.

real_time
28-09-2002, 16:21
việc dùng lệnh goto này thi no cũng lung tung lắm! Nhưng noi rang chương trình nao ma chẳng có lỗi là đúng! nhưng nếu như mình tránh được càng nhiều càng tốt chứ

Nicky
30-09-2002, 15:37
Túm cho thiệt gọn lại
Nhấn cho thiệt mạnh xuống thì việc dung Goto hay không là tuỳ lúc, nếu cần thì dùn...thế thôi ... lol

CrazyBabe
02-10-2002, 10:19
Hu hu, tôi lại chẳng bít tí VB nào mí ngại chớ, ngôn ngữ thì cái gì tui cũng chơi ngoại trừ VB ra nha. Nhưng thực tế tôi cũng không dùng goto - Trừ những trường hợp bất khả kháng, mà trường hợp này tôi nghĩ bạn chưa gặp bao giờ wá, còn sách hả, thông cảm nha mí cái wuển sách đó tôi chưa đọc bao giờ, trong vốn kiến thức ít ỏi của tôi không có dòng nào nói goto là "phi P" cả (bi chừ mí bít đó). Thứ nữa là từ bé đến giờ, tôi chưa có hân hạnh sử dụng một chương trình dịch P chuẩn nào cả, chỉ có vài trình thông dịch S_Pascal thì dĩ nhiên hông có goto.
Wan điểm tui là: Có gì dùng đó, cứ nắm hết là xong thui, he he..

quangvu
02-10-2002, 16:56
Hừ ,thế mà la cho lớn ,cứ tưởng mỗi câu lệnh là có một dòng GoTo chớ.

CrazyBabe
06-10-2002, 18:31
He he, đã thế từ bi giờ mỗi lần đặt tên cho thêm prefix goto_ vô, ý tôi là các bạn đừng bỏ wa gì hết á, rùi sẽ đến lúc phải dùng thôi, tránh sao được sét ?

White_Rose
07-10-2002, 00:58
Tôi cũng đồng ý với ý kiến "có gì dùng đó". Không phải ngẫu nhiên mà hàng bao nhiêu năm rồi mà Goto vẫn được giữ lại ở các ngôn ngữ lập trình thông dụng nhất. Nếu nó hoàn toàn là vô ích, là phi cấu trúc, là *** thì người ta đã bỏ đi lâu rồi.

robemark
09-10-2002, 09:00
lắm chuyện quá nhỉ go to không nên dùng quá nhiều là đúng thôi viết đúng thì không sao, sai 1cái thi coi như máy của mấy vị treo cái bụp toi cơm.

real_time
09-10-2002, 10:44
Cái gì cũng có hai mặt mà có ưu và có khuyết mình nên tránh khuyết chứ lại.

quangvu
09-10-2002, 19:32
Bạn robemark , real_time_program nói rất đúng .Đơn cử một chương trình khoảng 25 hàm được chia cho 4 người viết , 3 trong 4 người này đều khoái dùng Goto và :

A : Tôi cho GoTo đến X_Label và hàm trở nên rất gon nhẹ.

B : Trời ,tôi cũng dùng GoTo đến X_Label rồi ,hay ông sửa lại giùm đi vì toi gọi GoTo X_Label nhiều lắm.

C : Cái gì ,các ông biết tôi hay dùng GoTo X_Label mà sau còn dùng nửa .Các ông phải sửa lại hết.

D : Ối trời ,may mà tôi không dùng GoTo.

**Thế đấy.

danceswithwolves
10-10-2002, 08:53
góp ý một chút nhé :

trong một số rất hãn hữu trường hợp programmer mới phải dùng đến goto, vì tuyệt đại đa số các trường hợp còn lại đều có thể viết bằng các cấu trúc lặp. Dù vậy, goto vẫn là phần không thể thiếu (ít nhất cho đến lúc này).

Mặt khác, lệnh goto là sự phát triển từ lệnh jump của assembly - cốt lõi của cấu trúc rẽ nhánh có và không có điều kiện (conditional/unconditional branches). Vì lý do vẫn còn ứng dụng và tính chất lịch sử đã đi vào thói quen của các lập trình viên trường phái cổ điển nên các language/compiler designers vẫn luôn thêm cấu trúc goto vào ngôn ngữ và trình biên dịch của họ.

Tuy nhiên, lạm dụng goto là nguồn gốc của bugs khó dò (hard to trace). Bây giờ programmer lập trình theo teamwork nên có sự học tập trao đổi code cho nhau. Lạc vào những đoạn code đầy rẫy goto thì người đọc sẽ khó nắm bắt được vấn đề chính của giải thuật. Code sẽ khó đọc và vì thế sẽ khó bảo trì và phát triển. Quan niệm đương đại của lập trình là clarity, easy to maintain & develop. Vậy theo ý tớ thì hạn chế goto được chừng nào hay chừng ấy.

ví dụ của quangvu@ khá hay :).

CrazyBabe
10-10-2002, 09:02
Hi hi, chuyện của bạn kể nghe không thấy đáng cười lúm, tại zề tôi nhớ là nguyên tắc thiết kế chỉ cho phép nhảy đến một nhãn thuộc đoạn mã cục bộ thôi, điều này dẫn đến là trùng lặp nhãn khi mà 2 người cùng build một modun chung, rất ít khi xảy ra (trong trường hợp bạn nói là mỗi người write 1 func mà, right ?) Mà chuyện cẩn thận là dĩ nhiên khỏi nói đi, nếu mà bạn design không chuẩn thì cái gì cũng có thể sinh lỗi hết á. Nếu bạn nào có thời gian xem qua ct này rùi chuyển sang mã none_goto xem, nhớ là đừng làm phình mã lên, đừng làm chậm mã đi nha...
1:
If something then
Begin
....
If Something2 then Goto 1
....
If Something3 then Goto 2
....
If Something4 then Goto 3
....
End
....
2:
If Something then Goto 1
....
3:
....


Đối với kĩ thuật thiết kế bậc cao thì thí dụ này đúng là xí dụ chứ không đáng xem xét đâu...

danceswithwolves
10-10-2002, 10:28
cái quan trọng là vấn đề cần giải quyết có ý nghĩa không, chứ cứ chế đại mấy đoạn code goto vô nghĩa để đánh đố người khác thì mắc cười thiệt. CB@ thấy có gì không đúng thì chỉ giáo.

Nếu thêm khoảng mấy level goto nữa thì e rằng cả mấy chục ngàn thằng programmers của Microsoft cũng trố mắt nhìn chứ đừng nói gì hạng nửa mùa như tớ.

Chúng ta đến đây là để học tập, không nên khích bác nhau. Chào thân ái.

CrazyBabe
10-10-2002, 11:30
He he, có khích bác gì đâu ? Thật sự là có vài đoạn mã tôi áp dụng kĩ thuật này đó, nếu bạn thích thú với kĩ thuật chương trình dịch sẽ thấy có kha khá chương trình dịch viết mã kiểu này (Thường ở phân đoạn tách từ tố - token), ban đầu tôi cũng viết bình thường thôi, đến lúc học đàng hoàng thì viết kiểu này do nó sinh mã gọn nhẹ hơn, dĩ nhiên là ct của tôi chạy điên hơn kha khá đó, chứ còn tôi viết chỉ cần tôi hiểu thôi, cần wé gì các bạn hỉu ? Đây là xí dụ tôi đưa ra để các bạn biết là có trường hợp sử dụng goto thì tốt hơn các cú pháp khác thôi. He he chứ bác mà thấy thế là kích đểu anh em thì xin lũi nhá, tôi không phải loại người đó đâu ạ. Tôi đảm bảo là đoạn mã tôi đưa ra không hề vô nghĩa một chút nào hết, ok ? Có thể bạn chuyển được nó thành đoạn mã khác không hề có goto nhưng tôi nghĩ là khó mà nhanh+nhỏ tương đương lắm. Còn nếu muốn hiểu hả, đơn giản là bạn kiếm một trình parser nào đó hiển thị lại thành một biểu đồ là ok, nếu không chịu khó vẽ bằng tay cũng được. Dĩ nhiên là chuyển từ biểu đồ zề ct thì dễ hơn rùi, và tôi cũng không rõ các bạn có thói quen thiết kế chương trình trước không chứ làm vậy thì cái gì cũng dễ dàng hơn hết á, mà khó mắc lỗi nữa, kể cả dùng goto cũng ko vấn đề, right ?

CrazyBabe
10-10-2002, 11:38
Nói lẹm chút xíu: Nếu mà teamwork share source cho nhau chẳng hạn, thì comment đầy đủ, thậm chí làm brain-map thật tốt là hiểu hết ý mờ, mình không làm team mí nhưng ct của mình đều được comment rất kĩ - trung bình 30% là comment - và lưu trữ toàn bộ brain-map + topic (He he đề phòng trường hợp sau này lâu wá sẽ .. quên mất mình làm gì) nên chắc chắn ai cũng sẽ hiểu được ct của mình - Đến lúc mình share cho các bạn sẽ bít, ke ke ke...

danceswithwolves
11-10-2002, 09:00
nên nhớ, code do programmer A viết không chắc sẽ được maintain & improve bởi chính programmer A. Mình viết code chỉ mình đọc được thôi thì đó là điều hết sức bất lợi cho việc chuyển giao code. Tớ cũng chẳng muốn nói nhiều nữa, nên...

...tùy thôi, trong đa số các cuộc tranh luận không có người thắng kẻ thua. Chỉ là góp ý kiến của mỗi cá nhân để tự mỗi người rút ra được kết luận cho mình. CB@ thích goto thì cứ tự nhiên, tớ chẳng muốn, chẳng có khả năng và cũng chẳng rỗi hơi đâu thuyết phục cậu.

Kết thúc thread này ở đây được rồi.

real_time
12-10-2002, 09:50
đây là mọi người cùng đóng góp ý kiến thôi chứ có phải là đem ra diễn đàn để phân tranh thắng thua đâu. Nếu ai thấy ý kiến của mình là đúng thì cứ việc sài thế thôi mà.

panda
14-10-2002, 18:12
Tôi theo ý kiến của Zero tuyệt đối không bao giờ dùng Goto vì thực sự cũng không cần dùng Pascal có chổ yếu là quá cứng về cấu trúc chương trình nên lệnh if lồng sẽ nhiều khi này thì dùng break thôi chứ còn những trường hợp khác thì đều thay thế được cả

CrazyBabe
15-10-2002, 09:01
Chà, chế mà tôi tưởng cái thread này đặt ra để bàn luận "ở đâu dùng goto và ở đâu không dùng goto" cơ đấy, nếu mà chỉ để thể hiện wan điểm riêng hay là cãi nhau thì tôi không tham gia đâu. Nói lại một lần nữa, quan điểm của tôi là: Không bỏ qua cái gì hết á, có gì dùng đó là chắc ăn nhất, còn dùng cái gì cũng phải cẩn thận hết (cái này lại là vấn đề khác rồi nhể ?) chứ còn các bạn muốn dùng gì không muốn dùng gì ai cấm được chớ ?
<<END>>

narutokage
13-04-2009, 17:35
He he, có khích bác gì đâu ? Thật sự là có vài đoạn mã tôi áp dụng kĩ thuật này đó, nếu bạn thích thú với kĩ thuật chương trình dịch sẽ thấy có kha khá chương trình dịch viết mã kiểu này (Thường ở phân đoạn tách từ tố - token), ban đầu tôi cũng viết bình thường thôi, đến lúc học đàng hoàng thì viết kiểu này do nó sinh mã gọn nhẹ hơn, dĩ nhiên là ct của tôi chạy điên hơn kha khá đó, chứ còn tôi viết chỉ cần tôi hiểu thôi, cần wé gì các bạn hỉu ? Đây là xí dụ tôi đưa ra để các bạn biết là có trường hợp sử dụng goto thì tốt hơn các cú pháp khác thôi. He he chứ bác mà thấy thế là kích đểu anh em thì xin lũi nhá, tôi không phải loại người đó đâu ạ. Tôi đảm bảo là đoạn mã tôi đưa ra không hề vô nghĩa một chút nào hết, ok ? Có thể bạn chuyển được nó thành đoạn mã khác không hề có goto nhưng tôi nghĩ là khó mà nhanh+nhỏ tương đương lắm. Còn nếu muốn hiểu hả, đơn giản là bạn kiếm một trình parser nào đó hiển thị lại thành một biểu đồ là ok, nếu không chịu khó vẽ bằng tay cũng được. Dĩ nhiên là chuyển từ biểu đồ zề ct thì dễ hơn rùi, và tôi cũng không rõ các bạn có thói quen thiết kế chương trình trước không chứ làm vậy thì cái gì cũng dễ dàng hơn hết á, mà khó mắc lỗi nữa, kể cả dùng goto cũng ko vấn đề, right ?

bác nói chí lí goto cục bộ thì làm quái gì mà lỗi... ai đọc được thì đọc không đọc được thì thôi... tui thấy nó cũng dễ hiểu chớ có khó hiểu đâu mà kêu mà mì ăn liền hè... tội nghiệp thằng goto... mà goto tui thấy ở đâu nó cũng có dường như 90% các chương trình lập trình (10% còn lại là tui không biết (kiến thức còn hạn hẹp)) đều chơi goto ngay cả batch (lệnh batch) còn sài goto mà

mà nhiều lệnh thì goto nhanh cực bố láo việc gì phải tìm cách né nó trong khi dùng nó ta có thể làm nhanh 1 việc còn thằng khác lại cứ né nó để làm chậm hơn ta...

mà goto cục bộ thì sao mà bug được tui thấy cũng bình thường mà còn cũng dễ đọc lắm chớ chả thấy khó gì cả... không hiểu mọi người thấy sao chớ tui thấy nó khá là dễ đọc

với lại có thì dại gì ta không dùng... thách thì mấy cái chương trình lập trình kia cũng không dám bỏ goto C# là chương trình mới mà cũng sài goto mà đâu phải do thói quen đâu

[=========> Bổ sung bài viết <=========]


Chà, chế mà tôi tưởng cái thread này đặt ra để bàn luận "ở đâu dùng goto và ở đâu không dùng goto" cơ đấy, nếu mà chỉ để thể hiện wan điểm riêng hay là cãi nhau thì tôi không tham gia đâu. Nói lại một lần nữa, quan điểm của tôi là: Không bỏ qua cái gì hết á, có gì dùng đó là chắc ăn nhất, còn dùng cái gì cũng phải cẩn thận hết (cái này lại là vấn đề khác rồi nhể ?) chứ còn các bạn muốn dùng gì không muốn dùng gì ai cấm được chớ ?
<<END>>
uhm đúng mấy người kia đặt nặng thắng thua quá... bác CB có bảo bác ấy thắng đâu chỉ đưa ra 1 đoạn code minh họa thôi mà... sao lại nói mấy câu nghe bất mãn thế...

bác ấy chỉ nói trong 1 số trường hợp thì goto rất cần thiết...