Haruskah saya kembali dari fungsi lebih awal atau menggunakan pernyataan if? [Tutup]

304

Saya sering menulis fungsi semacam ini di kedua format, dan saya bertanya-tanya apakah satu format lebih disukai daripada yang lain, dan mengapa.

public void SomeFunction(bool someCondition)
{
    if (someCondition)
    {
        // Do Something
    }
}

atau

public void SomeFunction(bool someCondition)
{
    if (!someCondition)
        return;

    // Do Something
}

Saya biasanya kode dengan yang pertama karena itu adalah cara otak saya bekerja saat coding, meskipun saya pikir saya lebih suka yang ke-2 karena menangani penanganan kesalahan segera dan saya merasa lebih mudah untuk membaca

Rachel
sumber
9
Saya agak terlambat untuk diskusi ini sehingga saya tidak akan menjawabnya; Saya juga memikirkan hal ini dua tahun lalu: lecterror.com/articles/view/code-formatting-and-readability Saya menemukan yang kedua lebih mudah untuk dibaca, dimodifikasi, dirawat, dan didebug. Tapi mungkin itu hanya aku :)
dr Hannibal Lecter
4
sekarang pertanyaan ini adalah contoh yang baik dari pertanyaan berbasis opini
Rudolf Olah
2
jadi bagaimana jika tidak ada bukti absolut dalam satu atau arah lain? Ketika argumentasi yang cukup diberikan dalam satu dan arah lain dan ada suara jika jawabannya benar - itu membuatnya sangat berguna. Saya menemukan pertanyaan penutup seperti ini akan merusak nilai situs ini.
GSF
9
Dan saya suka pertanyaan dan jawaban berdasarkan pendapat. Mereka memberi tahu saya apa yang lebih disukai mayoritas dan yang memungkinkan saya menulis kode untuk dibaca orang lain.
Zygimantas

Jawaban:

402

Saya lebih suka gaya kedua. Dapatkan kasus yang tidak valid terlebih dahulu, baik hanya keluar atau menaikkan pengecualian yang sesuai, masukkan garis kosong di sana, lalu tambahkan tubuh "nyata" metode ini. Saya merasa lebih mudah dibaca.

Mason Wheeler
sumber
7
Smalltalk menyebut ini "klausa penjaga". Setidaknya itulah yang disebut Kent Beck dalam Pola Praktek Terbaik Smalltalk; Saya tidak tahu apakah itu bahasa biasa.
Frank Shearar
154
Keluar lebih awal memungkinkan Anda membuang hal-hal dari tumpukan mental terbatas Anda. :)
Joren
50
Saya sebelumnya pernah mendengar ini disebut sebagai "Pola Bouncer" - singkirkan kasus-kasus buruk sebelum mereka masuk.
RevBingo
14
Saya bahkan melangkah lebih jauh dan mengatakan ini pasti HANYA hal yang benar untuk dilakukan.
Oliver Weiler
38
Plus Anda tidak terus menambahkan indentasi jika Anda menyingkirkan kasing di awal.
doppelgreener
170

Jelas yang terakhir. Yang pertama tidak terlihat buruk sekarang, tetapi ketika Anda mendapatkan kode yang lebih kompleks, saya tidak bisa membayangkan ada orang yang berpikir seperti ini:

public int SomeFunction(bool cond1, string name, int value, AuthInfo perms)
{
    int retval = SUCCESS;
    if (someCondition)
    {
        if (name != null && name != "")
        {
            if (value != 0)
            {
                if (perms.allow(name)
                {
                    // Do Something
                }
                else
                {
                    reval = PERM_DENY;
                }
            }
            else
            {
                retval = BAD_VALUE;
            }
        }
        else
        {
            retval = BAD_NAME;
        }
    }
    else
    {
        retval = BAD_COND;
    }
    return retval;
}

lebih mudah dibaca daripada

public int SomeFunction(bool cond1, string name, int value, AuthInfo perms)
{
    if (!someCondition)
        return BAD_COND;

    if (name == null || name == "")
        return BAD_NAME;

    if (value == 0)
        return BAD_VALUE;

    if (!perms.allow(name))
        return PERM_DENY;

    // Do something
    return SUCCESS;
}

Saya sepenuhnya mengakui bahwa saya tidak pernah mengerti keuntungan dari titik keluar tunggal.

Jason Viers
sumber
20
Keuntungan dari satu titik keluar adalah ... ada satu titik keluar! Dengan contoh Anda, ada beberapa poin yang bisa kembali. Dengan fungsi yang lebih kompleks, itu bisa berubah menjadi titik perburuan saat format nilai pengembalian berubah. Tentu saja, ada kalanya memaksa satu titik keluar tidak masuk akal.
JohnL
71
@JohnL fungsi besar adalah masalahnya, bukan beberapa titik keluar. Kecuali jika Anda bekerja dalam konteks di mana pemanggilan fungsi tambahan akan sangat memperlambat kode Anda, tentu saja ...
Dan Rosenstark
4
@ Yar: Benar, tetapi intinya tetap. Saya tidak akan mencoba dan mengubah siapa pun, dan saya baru saja menunjukkan keuntungan pergi untuk poin keluar sesedikit mungkin (dan contoh Jason adalah jenis pria jerami). Lain kali saat Anda mencabut rambut Anda sambil mencoba mencari tahu mengapa SomeFunction kadang-kadang mengembalikan nilai aneh, mungkin Anda akan berharap Anda bisa menambahkan panggilan logging tepat sebelum pengembalian. Jauh lebih mudah untuk di-debug jika hanya ada satu pengacau! :)
JohnL
76
@ Jason Viers Seakan ada yang return value;membantu!?! Maka seseorang harus berburu setengah lusin value = ..., dengan kerugian bahwa Anda tidak pernah yakin bahwa nilai tidak akan berubah antara tugas ini dan pengembalian akhir. Setidaknya pengembalian segera jelas bahwa tidak ada yang akan mengubah hasilnya lagi.
Sjoerd
5
@Sjoed: Saya yang kedua Sjoerd di sini. Jika Anda ingin mencatat hasilnya, Anda dapat login di situs pemanggil. Jika Anda ingin tahu alasannya, Anda harus masuk di setiap titik keluar / penugasan sehingga keduanya identik dalam aspek ini.
Matthieu M.
32

Itu tergantung - Secara umum saya tidak akan keluar dari cara saya untuk mencoba dan memindahkan banyak kode untuk keluar dari fungsi awal - kompiler umumnya akan mengurus itu untuk saya. Walaupun begitu, jika ada beberapa parameter dasar di bagian atas yang saya butuhkan dan tidak dapat dilanjutkan, saya akan breakout lebih awal. Demikian juga, jika suatu kondisi menghasilkan ifblok raksasa dalam fungsi saya akan menerobosnya lebih awal sebagai akibatnya juga.

Meskipun demikian, jika suatu fungsi memerlukan beberapa data saat dipanggil, saya biasanya akan melempar pengecualian (lihat contoh) sebagai lawan dari hanya kembali.

public int myFunction(string parameterOne, string parameterTwo) {
  // Can't work without a value
  if (string.IsNullOrEmpty(parameterOne)) {
    throw new ArgumentNullException("parameterOne");
  } 
  if (string.IsNullOrEmpty(parameterTwo)) {
    throw new ArgumentNullException("parameterTwo");
  }

  // ...      
  // Do some work
  // ...

  return value;
}
rjzii
sumber
9
Dan jika hasil akhirnya dapat dipertahankan, siapa yang peduli gaya mana yang dipilih?
Jeff Siver
3
@ Jeff Siver - Jadi mengapa ini cenderung menjadi pertanyaan gaya "perang suci", pada akhirnya itu tergantung pada preferensi pribadi dan apa pun yang dikatakan oleh panduan gaya internal.
rjzii
1
Kuncinya dibawa pulang di sini adalah bahwa dia melemparkan pengecualian daripada kembali lebih awal. Nilai pengembalian tidak boleh ditujukan kembali untuk pemeriksaan validitas. Bagaimana jika Anda memiliki berbagai kondisi dan ingin membiarkan kode menggunakan metode ini tahu mengapa gagal? Tiba-tiba Anda dapat mengembalikan data bisnis aktual, tidak ada (hasil kosong) atau banyak string, kode, angka, ... dari satu metode tunggal. Hanya untuk menggambarkan mengapa itu gagal. Tidak, terima kasih.
DanMan
bagaimana dengan kompleksitas siklomatik seperti yang disarankan oleh kompiler saya? bukankah lebih baik tidak membuat kode sarang jika ada yang bisa membantu?
l --''''''--------- '' '' '' '' '' ''
24

Saya lebih suka pengembalian awal.

Jika Anda memiliki satu titik masuk dan satu titik keluar maka Anda harus selalu melacak seluruh kode di kepala Anda sampai ke titik keluar (Anda tidak pernah tahu jika ada bagian kode lainnya di bawah melakukan sesuatu yang lain pada hasilnya, sehingga Anda harus melacaknya sampai ada). Anda melakukan itu tanpa masalah cabang mana yang menentukan hasil akhir. Ini sulit diikuti.

Dengan satu entri dan beberapa ada, Anda kembali ketika Anda memiliki hasil Anda dan tidak repot-repot melacak semuanya untuk melihat bahwa tidak ada yang melakukan hal lain untuk itu (karena tidak akan ada hal lain sejak Anda kembali). Ini seperti memiliki tubuh metode yang dipecah menjadi lebih banyak langkah, yang setiap langkah dengan kemungkinan untuk mengembalikan hasilnya atau membiarkan langkah berikutnya mencoba peruntungannya.

user7197
sumber
13

Dalam pemrograman C di mana Anda harus membersihkan secara manual ada banyak yang bisa dikatakan untuk pengembalian satu poin. Sekalipun saat ini tidak perlu untuk membersihkan sesuatu, seseorang mungkin mengedit fungsi Anda, mengalokasikan sesuatu dan perlu membersihkannya sebelum kembali. Jika itu terjadi, itu akan menjadi pekerjaan mimpi buruk melihat semua pernyataan kembali.

Dalam pemrograman C ++ Anda memiliki destruktor dan bahkan sekarang pelindung ruang-keluar. Semua ini harus ada di sini untuk memastikan kode tersebut aman dari awal, sehingga kode dijaga dengan baik terhadap keluar awal dan oleh karena itu melakukannya tidak memiliki kelemahan logis dan murni masalah gaya.

Saya tidak cukup berpengetahuan tentang Java, apakah "akhirnya" kode blok akan dipanggil dan apakah finalizers dapat menangani situasi yang diperlukan untuk memastikan sesuatu terjadi.

C # Saya tentu tidak bisa menjawab.

D-bahasa memberi Anda penjaga ruang keluar yang tepat dan karena itu dipersiapkan dengan baik untuk keluar awal dan oleh karena itu tidak boleh menghadirkan masalah selain gaya.

Fungsi tentu saja tidak boleh terlalu lama di tempat pertama, dan jika Anda memiliki pernyataan beralih besar kode Anda mungkin juga sangat diperhitungkan.

Uang tunai
sumber
1
C ++ memungkinkan sesuatu yang disebut optmization nilai kembali yang memungkinkan kompiler untuk dasarnya menghilangkan operasi salin yang biasanya terjadi ketika Anda mengembalikan nilai. Namun, dalam berbagai kondisi yang sulit dilakukan, dan beberapa nilai pengembalian adalah salah satu kasus tersebut. Dengan kata lain, menggunakan beberapa nilai balik dalam C ++ sebenarnya dapat membuat kode Anda lebih lambat. Ini tentu saja berpegang pada MSC, dan mengingat bahwa itu akan sangat sulit (jika bukan tidak mungkin) untuk mengimplementasikan RVO dengan beberapa nilai pengembalian yang mungkin, kemungkinan masalah di semua kompiler.
Eamon Nerbonne
1
Dalam C, cukup gunakan gotodan, mungkin, pengembalian dua poin. Contoh (pemformatan kode tidak dimungkinkan dalam komentar):foo() { init(); if (bad) goto err; bar(); if (bad) goto err; baz(); return 0; err: cleanup(); return 1; }
mirabilos
1
Alih-alih goto saya lebih suka "Ekstrak Metode". Ketika Anda berpikir Anda perlu menerapkan variabel nilai balik atau kebalikannya, dalam upaya untuk memastikan kode pembersihan Anda selalu dipanggil, itu adalah Bau yang Anda butuhkan untuk memecahnya menjadi beberapa fungsi. Ini memungkinkan Anda untuk menyederhanakan kode kondisional kompleks Anda menggunakan Klausa Penjaga dan teknik pengembalian awal lainnya, sambil tetap memastikan kode pembersihan Anda selalu berjalan.
BrandonLWhite
"Seseorang mungkin mengedit fungsi Anda" - ini adalah penjelasan yang konyol untuk pengambilan keputusan. Siapa pun dapat melakukan apa pun di masa depan. Itu tidak berarti bahwa Anda harus melakukan sesuatu yang spesifik hari ini untuk mencegah seseorang dari melanggar hal-hal di masa depan.
Victor Yarema
Disebut membuat kode Anda terpelihara. Dalam kode dunia nyata ditulis untuk tujuan bisnis dan kadang-kadang pengembang nantinya perlu mengubahnya. Pada saat itu saya menulis jawaban itu meskipun saya telah menambal CURL untuk memperkenalkan caching dan mengingat kekacauan spageti bahwa itu benar-benar membutuhkan penulisan ulang yang tepat dalam C ++ modern
CashCow
9

Pengembalian awal untuk-menang. Mereka bisa terlihat jelek, tetapi jauh lebih jelek daripada ifpembungkus besar , terutama jika ada beberapa kondisi untuk diperiksa.

STW
sumber
9

Saya menggunakan keduanya.

Jika DoSomething3-5 baris kode maka kode tersebut terlihat cantik menggunakan metode pemformatan pertama.

Tetapi jika memiliki lebih banyak baris dari itu, maka saya lebih suka format kedua. Saya tidak suka ketika kurung buka dan tutup tidak di layar yang sama.

azheglov
sumber
2
Cantik, tidak mungkin! Terlalu banyak lekukan!
JimmyKane
@JimmyKane Hanya ada begitu banyak lekukan yang dapat terjadi dalam 3-5 baris, terutama karena Anda membutuhkan 2 (?) Baris per level yang indentasi: satu untuk struktur kontrol dan mulai dari blok, satu untuk ujung blok.
Deduplicator
8

Alasan klasik untuk single-entry-single-exit adalah bahwa jika semantik formal menjadi sangat buruk (alasan yang sama GOTO dianggap berbahaya).

Dengan kata lain, lebih mudah untuk mempertimbangkan kapan perangkat lunak Anda akan keluar dari rutin jika Anda hanya memiliki 1 pengembalian. Yang juga merupakan argumen terhadap pengecualian.

Biasanya saya meminimalkan pendekatan pengembalian awal.

Paul Nathan
sumber
tetapi untuk alat analisis formal, Anda dapat mensintesis fungsi luar dengan semantik yang dibutuhkan alat, dan menjaga agar kode tetap dapat dibaca manusia.
Tim Williscroft
@Tim. Itu tergantung pada seberapa banyak pencabutan yang ingin Anda lakukan dan apa yang Anda analisis. Saya menemukan SESE cukup mudah dibaca jika pembuat kode waras tentang hal-hal.
Paul Nathan
Sikap saya terhadap analisis dibentuk oleh optimisasi dari proyek Mandiri. 99% panggilan metode dinamis dapat diselesaikan dan dihilangkan secara statis. jadi Anda dapat menganalisis beberapa kode garis lurus. Sebagai programmer yang bekerja, saya dapat dengan andal mengasumsikan sebagian besar kode yang akan saya kerjakan ditulis oleh programmer rata-rata. Jadi mereka tidak akan menulis kode yang sangat bagus.
Tim Williscroft
@ Tim: Cukup adil. Meskipun saya merasa harus menunjukkan bahwa bahasa statis masih memiliki banyak permainan.
Paul Nathan
Alasan yang tidak berlaku di hadapan pengecualian. Itulah mengapa single-exit bagus di C, tetapi tidak membelikan Anda apa pun di C ++.
peterchen
7

Secara pribadi, saya lebih suka melakukan pemeriksaan kondisi lulus / gagal di awal. Itu memungkinkan saya untuk mengelompokkan sebagian besar kegagalan paling umum di bagian atas fungsi dengan sisa logika untuk diikuti.

nathan
sumber
6

Tergantung.

Pengembalian lebih awal jika ada beberapa kondisi jalan buntu yang jelas untuk memeriksa segera yang akan membuat menjalankan seluruh fungsi menjadi sia-sia. *

Atur Retval + pengembalian tunggal jika fungsinya lebih kompleks dan bisa memiliki beberapa titik keluar jika tidak (masalah keterbacaan).

* Ini sering dapat menunjukkan masalah desain. Jika Anda menemukan bahwa banyak metode Anda perlu memeriksa beberapa keadaan eksternal / paramater atau semacamnya sebelum menjalankan sisa kode, itu mungkin sesuatu yang harus ditangani oleh penelepon.

Tabel Bobby
sumber
6
Ketika saya menulis kode yang dapat dibagikan, mantra saya adalah "Asumsikan Tidak Ada. Percayai Tak seorang pun." Anda harus selalu memvalidasi input Anda dan setiap kondisi eksternal yang Anda andalkan. Lebih baik melempar pengecualian daripada merusak sesuatu karena seseorang memberi Anda data buruk.
TMN
@ TMN: Poin bagus.
Bobby Tables
2
Poin kunci di sini adalah bahwa dalam OO Anda melempar pengecualian , bukan kembali . Beberapa pengembalian bisa menjadi buruk, beberapa pengecualian melempar tidak selalu bau kode.
Michael K
2
@MichaelK: Suatu metode harus pengecualian jika kondisi pasca tidak dapat dipenuhi. Dalam beberapa kasus, suatu metode harus keluar lebih awal karena post-kondisi telah dicapai bahkan sebelum fungsi dimulai. Misalnya, jika seseorang memanggil metode "Set label kontrol" untuk mengubah label kontrol, label Fredjendela sudah Fred, dan pengaturan nama kontrol ke keadaan sekarang akan memaksa redraw (yang, meskipun berpotensi berguna dalam beberapa kasus, akan menjadi menjengkelkan dalam satu di tangan), itu akan sangat masuk akal untuk memiliki metode set-nama awal-keluar jika nama lama dan baru cocok.
supercat
3

Gunakan If

Dalam buku Don Knuth tentang GOTO, saya membacanya memberikan alasan untuk selalu memiliki kondisi yang paling mungkin didahulukan dalam pernyataan if. Di bawah asumsi bahwa ini masih merupakan ide yang masuk akal (dan bukan satu-satunya pertimbangan murni untuk kecepatan era). Saya akan mengatakan pengembalian awal bukan praktik pemrograman yang baik, terutama mengingat fakta bahwa mereka lebih sering daripada tidak digunakan untuk penanganan kesalahan, kecuali kode Anda lebih cenderung gagal daripada tidak gagal :-)

Jika Anda mengikuti saran di atas, Anda harus meletakkan pengembalian itu di bagian bawah fungsi, dan Anda mungkin bahkan tidak menyebutnya pengembalian di sana, cukup atur kode kesalahan dan kembalikan dua baris karenanya. Dengan demikian mencapai 1 entri 1 keluar ideal.

Delphi Tertentu ...

Saya berpikir bahwa ini adalah praktik pemrograman yang baik untuk programmer Delphi, meskipun saya tidak punya bukti. Pra-D2009, kami tidak memiliki cara atom untuk mengembalikan nilai, kami memiliki exit;dan result := foo;atau kami bisa saja melemparkan pengecualian.

Jika Anda harus menggantinya

if (true) {
 return foo;
} 

untuk

if true then 
begin
  result := foo; 
  exit; 
end;

Anda mungkin bosan melihat bahwa di atas setiap fungsi Anda dan lebih suka

if false then 
begin
  result := bar;

   ... 
end
else
   result := foo;

dan hindari exitsama sekali.

Peter Turner
sumber
2
Dengan Delphis baru, itu bisa disingkat if true then Exit(foo);sering saya gunakan teknik ini untuk pertama menginisialisasi resultke nilatau FALSEmasing-masing, kemudian memeriksa semua kondisi kesalahan dan hanya Exit;jika salah satu terpenuhi. Kasus sukses resultkemudian (biasanya) diatur di suatu tempat di akhir metode.
JensG
ya, saya suka fitur baru itu meskipun sepertinya itu hanya permen untuk menenangkan programmer Java, hal berikutnya yang Anda tahu mereka akan membiarkan kami mendefinisikan variabel kami di dalam prosedur.
Peter Turner
Dan programmer C #. Ya, sejujurnya, saya akan menemukan bahwa memang bermanfaat karena mengurangi jumlah garis antara deklarasi dan penggunaan (IIRC bahkan ada beberapa metrik untuk itu, lupa namanya).
JensG
2

Saya setuju dengan pernyataan berikut:

Saya pribadi penggemar klausa penjaga (contoh kedua) karena mengurangi lekukan fungsi. Beberapa orang tidak menyukainya karena ini menghasilkan beberapa titik pengembalian dari fungsi, tetapi saya pikir itu lebih jelas dengan mereka.

Diambil dari pertanyaan ini di stackoverflow .

Toto
sumber
+1 Untuk klausa penjaga. Saya juga lebih suka penjaga yang berorientasi positif misalnya: jika (kondisi = salah) kembali sebagai lawan jika (! Kondisi) kembali
JustinC
1

Saya menggunakan pengembalian awal hampir secara eksklusif hari ini, ke ekstrem. Saya menulis ini

self = [super init];

if (self != nil)
{
    // your code here
}

return self;

sebagai

self = [super init];
if (!self)
    return;

// your code here

return self;

tapi itu benar-benar tidak masalah. Jika Anda memiliki lebih dari satu atau dua tingkat sarang dalam fungsi Anda, mereka perlu rusak.

Dan Rosenstark
sumber
Saya setuju. Lekukan inilah yang menyebabkan kesulitan dalam membaca. Semakin sedikit lekukan, semakin baik. Contoh sederhana Anda memiliki tingkat lekukan yang sama tetapi contoh pertama itu pasti akan tumbuh menjadi lebih banyak lekukan yang membutuhkan lebih banyak kekuatan otak.
user441521
1

Saya lebih suka menulis:

if(someCondition)
{
    SomeFunction();
}
Josh K
sumber
2
baru Apakah itu pra-validasi? Atau apakah itu dalam mehtod khusus validasi DoSomeFunctionIfSomeCondition?
STW
Bagaimana hal ini membuat keprihatinan Anda terpisah?
justkt
2
Anda melanggar enkapsulasi dengan membuat implementasi fungsi (logika ketergantungannya) eksternal.
TMN
1
Jika ini dijalankan dalam metode publik dan SomeFunction () adalah metode pribadi di kelas yang sama, bisa ok. Tetapi jika ada orang lain yang memanggil SomeFunction () Anda harus menggandakan cek di sana. Saya merasa lebih baik untuk membuat setiap metode mengurus apa yang perlu dilakukan, tidak ada orang lain yang harus mengetahuinya.
Per Wiklander
2
Ini jelas merupakan gaya yang diusulkan oleh Robert C. Martin dalam "Clean Code". Suatu fungsi seharusnya hanya melakukan satu hal. Namun dalam "Pola Implementasi", Kent Beck menyarankan, dari dua opsi yang diusulkan dalam OP, yang kedua lebih baik.
Scott Whitlock
1

Seperti Anda, saya biasanya menulis yang pertama, tetapi lebih suka yang terakhir. Jika saya memiliki banyak pemeriksaan bersarang saya biasanya refactor ke metode kedua.

Saya tidak suka bagaimana penanganan kesalahan dipindahkan dari cek.

if not error A
  if not error B
    if not error C
      // do something
    else handle error C
  else handle error B
else handle error A

Saya lebih memilih ini:

if error A
  handle error A; return
if error B
  handle error B; return
if error C
  handle error C; return

// do something
sentakan
sumber
0

Kondisi di atas disebut "prasyarat". Dengan meletakkan if(!precond) return;, Anda secara visual mendaftar semua prasyarat.

Menggunakan blok "jika-lain" yang besar dapat meningkatkan indent overhead (saya lupa kutipan tentang indentasi 3-level).

Ming-Tang
sumber
2
Apa? Anda tidak dapat melakukan pengembalian awal di Jawa? C #, VB (.NET dan 6), dan tampaknya Java (yang saya asumsikan demikian, tetapi harus mencari karena saya belum menggunakan bahasa dalam 15 tahun) semua memungkinkan pengembalian lebih awal. jadi jangan menuduh 'bahasa yang sangat diketik' tidak memiliki fitur. stackoverflow.com/questions/884429/…
ps2goat
-1

Saya lebih suka menyimpan jika pernyataan kecil.

Jadi, memilih di antara:

if condition:
   line1
   line2
    ...
   line-n

dan

if not condition: return

line1
line2
 ...
line-n

Saya akan memilih apa yang Anda gambarkan sebagai "pengembalian awal".

Pikiran Anda, saya tidak peduli tentang pengembalian awal atau apa pun, saya hanya ingin menyederhanakan kode, mempersingkat badan jika pernyataan, dll.

Bersarang jika dan untuk dan sementara itu mengerikan , hindari mereka di semua biaya.

hasen
sumber
-2

Seperti yang orang lain katakan, itu tergantung. Untuk sedikit fungsi yang mengembalikan nilai, saya dapat mengkode pengembalian lebih awal. Tetapi untuk fungsi yang cukup besar, saya ingin selalu mendapat tempat dalam kode di mana saya tahu saya bisa meletakkan sesuatu yang akan dieksekusi sebelum kembali.

Mike Dunlavey
sumber
-2

Saya berlatih gagal-cepat di tingkat fungsi. Itu membuat kode konsisten dan bersih (bagi saya dan mereka yang pernah bekerja dengan saya). Karena itu saya selalu kembali lebih awal.

Untuk beberapa kondisi yang sering diperiksa, Anda dapat menerapkan aspek-aspek untuk pemeriksaan tersebut jika Anda menggunakan AOP.

Steven Evers
sumber