Jawaban: Ini telah dibahas beberapa kali di Stack Overflow, dan Chris Gillum
merangkum kemungkinan penggunaan
Saya berpendapat, seperti banyak orang lain akan berpendapat, bahwa dalam semua kasus ini, penggunaan Konstruksi aliran kontrol level yang lebih tinggi cenderung sesuai dengan konsep dalam domain masalah. If / else adalah keputusan berdasarkan beberapa kondisi. Loop mengatakan untuk melakukan beberapa tindakan berulang kali. Bahkan pernyataan break mengatakan "kami melakukan ini berulang kali, tapi sekarang kami harus berhenti". Pernyataan goto, di sisi lain, cenderung sesuai dengan konsep dalam program yang sedang berjalan, bukan dalam domain masalah. Dikatakan untuk melanjutkan eksekusi pada titik tertentu dalam program . Seseorang yang membaca kode harus menyimpulkan apa artinya sehubungan dengan domain masalah. Tentu saja semua konstruksi tingkat yang lebih tinggi dapat didefinisikan dalam hal gotos dan cabang kondisional sederhana. Itu tidak berarti bahwa mereka hanya goto yang menyamar. Pikirkan mereka sebagai goto yang dibatasi - dan pembatasanlah yang membuatnya bermanfaat. Pernyataan break diimplementasikan sebagai lompatan ke ujung loop tertutup, tetapi lebih baik dianggap beroperasi pada loop secara keseluruhan. Semua yang lain dianggap sama, kode yang strukturnya mencerminkan bahwa dari domain masalah cenderung lebih mudah dibaca dan dipelihara. Tidak ada kasus di mana pernyataan goto mutlak diperlukan (ada teorema untuk efek itu), tetapi ada kasus di mana itu bisa menjadi solusi yang paling buruk. Kasing tersebut bervariasi dari satu bahasa ke bahasa lain, tergantung pada tingkat konstruksi apa yang didukung oleh bahasa tersebut. Di C, misalnya, saya percaya ada tiga skenario dasar di mana goto sesuai.
Di sisi lain, mesin negara hingga eksplisit juga dapat diimplementasikan dengan pernyataan switch di dalam loop. Ini memiliki keuntungan bahwa setiap negara mulai di tempat yang sama dalam kode, yang dapat berguna untuk debugging, misalnya. Penggunaan utama goto dalam bahasa modern yang cukup (yang mendukung jika / else dan loop) adalah untuk mensimulasikan konstruksi aliran kontrol yang hilang dari bahasa. Tentunya itu tergantung pada bahasa pemrogramannya. Alasan utama Java telah berusaha untuk "memecahkan" masalah ini dengan menolak Dalam C #, Iya nih. Ketika loop Anda bersarang dalam beberapa level, Tentu saja, Keputusasaan yang paling besar datang dari semacam "agama" yang telah diciptakan oleh Dewa Djikstra yang memaksa pada awal tahun 60an tentang kekuatannya yang membabi buta untuk:
Ini tidak ada hubungannya dengan Khususnya, titik utama pertama di atas diizinkan dan yang kedua dibersihkan (jika Anda Anda dapat merujuk jawaban ini untuk mengetahui bagaimana bahkan kode yang tidak menggunakan goto dapat dibaca. Masalahnya bukan goto itu sendiri, tetapi penggunaannya yang buruk. Saya dapat menulis seluruh program tanpa menggunakan Tapi masalahnya bukan Hal suka Ini tahun 2011: saatnya untuk memahami bahwa Goto aneh di sini atau di sana, selama itu lokal untuk suatu fungsi, jarang secara signifikan merusak keterbacaan. Seringkali manfaat dengan menarik perhatian pada fakta bahwa ada sesuatu yang tidak biasa terjadi dalam kode ini yang memerlukan penggunaan struktur kontrol yang agak tidak biasa. Jika goto (lokal) secara signifikan merusak keterbacaan, maka itu biasanya merupakan tanda bahwa fungsi yang mengandung goto menjadi terlalu kompleks. Goto terakhir yang saya masukkan ke dalam sepotong kode C adalah membangun sepasang loop yang saling terkait. Ini tidak sesuai dengan definisi normal penggunaan goto "dapat diterima", tetapi fungsi tersebut berakhir secara signifikan lebih kecil dan lebih jelas. Untuk menghindari kebotakan akan membutuhkan pelanggaran DRY yang sangat berantakan. Saya pikir seluruh masalah ini adalah kasus menggonggong pohon yang salah. GOTO seperti itu tampaknya tidak bermasalah bagi saya, tetapi itu lebih sering merupakan gejala dari dosa yang sebenarnya: kode spaghetti. Jika GOTO menyebabkan persimpangan besar garis kontrol aliran maka itu buruk, titik. Jika tidak ada garis kontrol aliran, itu tidak berbahaya. Di zona abu-abu di antara kami memiliki hal-hal seperti bailout lingkaran, masih ada beberapa bahasa yang belum menambahkan konstruksi yang mencakup semua kasus abu-abu yang sah. Satu-satunya kasus saya menemukan diri saya benar-benar menggunakannya dalam beberapa tahun adalah kasus loop di mana titik keputusan berada di tengah-tengah loop. Anda memiliki kode duplikat, bendera, atau GOTO. Saya menemukan solusi GOTO yang terbaik dari ketiganya. Tidak ada persimpangan jalur kontrol aliran di sini, tidak berbahaya. Ya, goto dapat digunakan untuk memberi manfaat pada pengalaman pengembang: http://adamjonrichardson.com/2012/02/06/long-live-the-goto-statement/ Namun, seperti halnya alat yang ampuh (pointer, multiple inheritance, dll.), Seseorang harus disiplin menggunakannya. Contoh yang disediakan dalam tautan menggunakan PHP, yang membatasi penggunaan konstruksi goto ke fungsi / metode yang sama dan menonaktifkan kemampuan untuk melompat ke blok kontrol baru (misalnya, loop, pernyataan switch, dll.) Tergantung pada bahasanya. Ini masih banyak digunakan dalam pemrograman Cobol, misalnya. Saya juga bekerja pada perangkat Barionet 50, yang bahasa pemrograman firmware-nya adalah dialek BASIC awal yang tentu saja mengharuskan Anda untuk menggunakan Goto. Saya akan mengatakan tidak. Jika Anda merasa perlu menggunakan GOTO, saya berani bertaruh bahwa ada kebutuhan untuk mendesain ulang kode.
Saya berpendapat tidak. Mereka harus selalu diganti dengan alat yang lebih spesifik untuk masalah goto sedang digunakan untuk menyelesaikan (kecuali itu tidak tersedia dalam bahasa Anda). Sebagai contoh, break statemen dan pengecualian memecahkan masalah yang sebelumnya diselesaikan dengan kebohongan loop melarikan diri dan penanganan kesalahan. |