Java goto

Terdapat lelucon pengaturcara lama yang berlaku seperti ini: Seorang pengaturcara dalam keadaan marah berkata kepada pengaturcara kedua, "Pergi ke Neraka!" Pengaturcara kedua menjawab dengan tegas, "Eh, awak pakai goto!" Maksud humor kutu buku ini adalah bahawa bagi banyak pengaturcara, penggunaan "goto" hanyalah mengenai kesalahan terburuk yang dapat dilakukan seseorang.

Terdapat beberapa sebab mengapa goto dianggap rendah di kalangan pembangun perisian. Makalah Edsger W. Dijkstra A Case Against GO TO Statement adalah risalah awal mengenai kejahatan penyalahgunaan GOTO. Dalam artikel itu, Dijkstra menyatakan, "[Saya menjadi] yakin bahawa pernyataan masuk harus dihapuskan dari semua bahasa pengaturcaraan 'peringkat lebih tinggi'." Surat Pernyataan Dijkstra Dianggap Berbahaya tidak hanya mengecam pernyataan goto, tetapi juga memulakan trend sains komputer yang popular menggunakan frasa "dianggap berbahaya" (walaupun kedua-dua perkataan itu nampaknya digunakan di luar pengaturcaraan sebelum itu).

Banyak pengaturcara sejak Dijkstra digigit oleh beberapa masalah pemeliharaan yang berkaitan dengan penggunaan pernyataan goto dalam bahasa tertentu. Pengaturcara lain telah mendengar cerita-cerita ini atau "Jangan gunakan goto" dengan begitu banyak sehingga mereka tidak perlu mengalami kelemahannya secara langsung untuk mempercayai bahawa mereka tidak boleh menggunakan GOTO.

Walaupun pernyataan goto nampaknya mempunyai reputasi yang buruk, itu bukan tanpa penyokongnya. Frank Rubin menulis respons terhadap Pernyataan Go To Dijkstra yang Dianggap Berbahaya(Mac 1968) dipanggil GOTO Dianggap Berbahaya 'Dianggap Berbahaya (Mac 1987). Dalam surat itu, Rubin menulis tentang surat Dijkstra yang memberi kesan kepada pengaturcara yang begitu dramatis sehingga "tanggapan bahawa GOT0 berbahaya diterima hampir secara universal, tanpa pertanyaan atau keraguan." Mengenai pemerhatian ini, Rubin menulis, "Ini telah menyebabkan kerusakan yang tak terhitung pada bidang pengaturcaraan, yang telah kehilangan alat yang efektif. Ini seperti tukang daging yang melarang pisau kerana pekerja kadang-kadang memotong diri." Perhatikan bahawa Dijkstra membalas surat Rubin dengan Surat Menyurat Mengecewakan. Halaman Cunningham & Cunningham Wiki Go To mengatakan ini mengenai pernyataan goto: "Perantis menggunakannya tanpa berfikir. Pengembara itu menghindarinya tanpa berfikir. Tuan menggunakannya dengan bersungguh-sungguh."

Terdapat banyak sumber lain yang merangkumi kebaikan dan keburukan menggunakan pernyataan goto. Saya tidak bermaksud untuk mengulangi perbahasan di sini selain pembentangan ringkas mengenai sejarah awal kontroversi yang telah diliputi. Saya telah mendengar beberapa pembangun Java menyatakan bahawa Java tidak mempunyai pernyataan goto dan itulah yang ingin saya bincangkan di baki catatan blog ini.

Java memang menyimpan "goto" sebagai kata kunci terpelihara. Walau bagaimanapun, ia adalah kata kunci yang tidak digunakan. Maksudnya adalah bahawa walaupun kata kunci tidak benar-benar menghasilkan sesuatu yang produktif, ia juga merupakan kata yang tidak dapat digunakan dalam kod untuk nama pemboleh ubah atau konstruk lain. Contohnya, kod berikut tidak akan menyusun:

package dustin.examples; /** * Class demonstrating Java's goto-like functionality. */ public class JavaGotoFunctionality { /** * Main executable function. * * @param arguments Command-line arguments: none expected. */ public static void main(final String[] arguments) { final String goto = "Go to bed!"; } } 

Sekiranya saya cuba menyusun kod itu, saya akan melihat ralat seperti yang ditunjukkan dalam tangkapan skrin seterusnya.

Mesej ralat "dijangkakan" dengan penunjuk di ruang sebelum "goto" memberi cukup banyak petunjuk kepada pengembang Java untuk menyedari bahawa ada sesuatu yang salah tentang penggunaan "goto." Namun, mungkin tidak begitu jelas bagi seseorang yang baru menggunakan Java.

Saya biasanya tidak menggunakan konstruk goto, tetapi saya juga menyedari bahawa terdapat situasi di mana penggunaannya menjadikan kod yang lebih mudah dibaca dan menggunakan cara kerja yang kurang menggila daripada tidak menggunakannya. Di Jawa, ini juga telah disadari dan sokongan diberikan untuk beberapa situasi yang paling umum di mana pernyataan goto akan sangat berguna dan kemungkinan sebenarnya lebih disukai daripada alternatif. Contoh yang paling jelas adalah pernyataan yang breakdilabel dan dilabelkan continue. Perkara-perkara ini dibincangkan dan ditunjukkan dalam bahagian Tutorial Java Statement Branching.

Keupayaan untuk melabelkan pernyataan tertentu dan kemudian mempunyai breakatau continueberlaku pada pernyataan itu daripada pernyataannya yang paling segera (seperti yang tidak berlabel breakatau continuetidak) sangat berguna dalam kes di mana gelung bersarang sebaliknya memerlukan kod yang lebih banyak dan kod yang lebih kompleks untuk mencapai yang sama benda. Saya mendapati bahawa saya sering dapat merancang semula struktur dan kod data saya untuk mengelakkan situasi seperti itu, tetapi ini tidak selalu praktikal.

Sumber lain yang baik yang berkaitan dengan penggunaan fungsi seperti goto di Java adalah 13 Jun 2000 JDC Tech Tip Goto Statements dan Java Programming. Seperti yang ditunjukkan oleh petua ini, label sebenarnya boleh digunakan untuk sebarang blok dan tidak terhad kepada breakdan continue. Walau bagaimanapun, adalah pengalaman saya bahawa perlunya pendekatan ini di luar breakdan continuejauh lebih jarang berlaku.

Satu pemerhatian penting mengenai label adalah bahawa pelaksanaan kod tidak secara harfiah kembali ke label tersebut ketika label break somelabeldilaksanakan. Sebaliknya, aliran pelaksanaan menuju ke penyataan segera setelah pernyataan berlabel. Sebagai contoh, jika saya mempunyai forgelung luar yang disebut "dustin:", maka penembusan ke arah itu sebenarnya akan menuju ke pernyataan yang dapat dilaksanakan pertama setelah akhir forgelung berlabel itu . Dengan kata lain, ia bertindak lebih seperti perintah "goto the statement follow the labeled statement".

Saya tidak memberikan contoh penggunaan pernyataan breakberlabel atau berlabel ini continuedi sini kerana terdapat banyak contoh baik yang mudah didapati dalam talian. Secara khusus, dua sumber yang telah saya sebutkan (Java Tutorials Branching Statements and Goto Statements and Java Programming Tech Tip) merangkumi contoh ilustrasi sederhana.

Semakin saya bekerja di industri pengembangan perisian, semakin yakin saya menjadi yakin bahawa terdapat sedikit mutlak dalam pengembangan perisian dan bahawa kedudukan ekstremis hampir selalu salah pada satu ketika atau yang lain. Saya biasanya menjauhi penggunaan kod goto atau mirip goto, tetapi ada kalanya ia adalah kod terbaik untuk pekerjaan tersebut. Walaupun Java tidak mempunyai sokongan goto langsung, ia memberikan sokongan seperti goto yang memenuhi sebahagian besar keperluan saya untuk sokongan seperti itu.

Kisah ini, "Java's goto" pada awalnya diterbitkan oleh JavaWorld.