Ada hal-hal baik untuk dikatakan tentang memiliki satu titik keluar, sama seperti ada hal-hal buruk untuk dikatakan tentang pemrograman "panah" yang tak terhindarkan yang dihasilkan.
Jika menggunakan beberapa titik keluar selama validasi input atau alokasi sumber daya, saya mencoba menempatkan semua 'kesalahan-keluar' dengan sangat jelas di bagian atas fungsi.
Baik artikel Pemrograman Spartan dari "SSDSLPedia" dan artikel titik keluar fungsi tunggal dari "Portland Pattern Repository's Wiki" memiliki beberapa argumen mendalam tentang hal ini. Juga, tentu saja, ada posting ini untuk dipertimbangkan.
Jika Anda benar-benar ingin satu titik keluar (dalam bahasa apa pun yang tidak diaktifkan) sebagai contoh untuk melepaskan sumber daya di satu tempat, saya menemukan aplikasi goto yang cermat menjadi baik; lihat misalnya ini contoh yang agak dibuat-buat (dikompresi untuk menyimpan layar real-estate):
int f(int y) {
int value = -1;
void *data = NULL;
if (y < 0)
goto clean;
if ((data = malloc(123)) == NULL)
goto clean;
/* More code */
value = 1;
clean:
free(data);
return value;
}
Secara pribadi saya, secara umum, tidak suka pemrograman panah lebih dari saya tidak suka beberapa titik keluar, meskipun keduanya berguna ketika diterapkan dengan benar. Yang terbaik, tentu saja, adalah menyusun program Anda untuk tidak membutuhkan keduanya. Memecah fungsi Anda menjadi beberapa bagian biasanya membantu :)
Meskipun ketika melakukan itu, saya menemukan saya akhirnya memiliki beberapa titik keluar seperti dalam contoh ini, di mana beberapa fungsi yang lebih besar telah dipecah menjadi beberapa fungsi yang lebih kecil:
int g(int y) {
value = 0;
if ((value = g0(y, value)) == -1)
return -1;
if ((value = g1(y, value)) == -1)
return -1;
return g2(y, value);
}
Bergantung pada proyek atau pedoman pengkodean, sebagian besar kode pelat-ketel dapat diganti dengan makro. Sebagai catatan, memecahnya dengan cara ini membuat fungsi g0, g1, g2 sangat mudah untuk diuji secara individual.
Jelas, dalam bahasa OO dan bahasa yang diaktifkan pengecualian, saya tidak akan menggunakan pernyataan if seperti itu (atau sama sekali, jika saya bisa lolos dengan sedikit usaha), dan kodenya akan jauh lebih sederhana. Dan tidak panah. Dan sebagian besar pengembalian non-final mungkin akan menjadi pengecualian.
Pendeknya;
- Beberapa pengembalian lebih baik daripada banyak pengembalian
- Lebih dari satu pengembalian lebih baik daripada panah besar, dan menjaga klausa biasanya ok.
- Pengecualian bisa / harus mungkin menggantikan sebagian besar 'klausa penjagaan' bila memungkinkan.