Pertanyaan Apakah praktik buruk untuk menggunakan kembali dalam metode void?


Bayangkan kode berikut:

void DoThis()
{
    if (!isValid) return;

    DoThat();
}

void DoThat() {
    Console.WriteLine("DoThat()");
}

Apakah boleh digunakan kembali dalam metode void? Apakah ada penalti kinerja? Atau akan lebih baik untuk menulis kode seperti ini:

void DoThis()
{
    if (isValid)
    {
        DoThat();
    }
}

75
2017-08-16 02:05


asal


Jawaban:


Pengembalian dalam metode void tidak buruk, adalah praktik umum untuk membalikkan if pernyataan untuk mengurangi nesting.

Dan kurang bersarang pada metode Anda meningkatkan pembacaan dan pemeliharaan kode.

Sebenarnya jika Anda memiliki metode void tanpa pernyataan kembali, compiler akan selalu menghasilkan instruksi ret di ujungnya.


153
2017-08-16 02:11



Ada alasan bagus lain untuk menggunakan penjaga (bukan kode bertingkat): Jika programmer lain menambahkan kode ke fungsi Anda, mereka bekerja di lingkungan yang lebih aman.

Mempertimbangkan:

void MyFunc(object obj)
{
    if (obj != null)
    {
        obj.DoSomething();
    }
}

melawan:

void MyFunc(object obj)
{
    if (obj == null)
        return;

    obj.DoSomething();
}

Sekarang, bayangkan programmer lain menambahkan baris: obj.DoSomethingElse ();

void MyFunc(object obj)
{
    if (obj != null)
    {
        obj.DoSomething();
    }

    obj.DoSomethingElse();
}

void MyFunc(object obj)
{
    if (obj == null)
        return;

    obj.DoSomething();
    obj.DoSomethingElse();
}

Jelas ini adalah kasus sederhana, tetapi programmer telah menambahkan crash ke program dalam contoh pertama (nested code). Pada contoh kedua (awal-keluar dengan penjaga), setelah Anda melewati penjaga, kode Anda aman dari penggunaan referensi null yang tidak disengaja.

Tentu, programmer hebat tidak membuat kesalahan seperti ini (sering). Tetapi pencegahan lebih baik daripada mengobati - kita dapat menulis kode dengan cara yang menghilangkan potensi sumber kesalahan ini sepenuhnya. Bersarang menambah kerumitan, sehingga praktik terbaik merekomendasikan refactoring kode untuk mengurangi penumpukan.


26
2017-08-16 06:52



Kebiasaan buruk ??? Tidak mungkin. Bahkan, selalu lebih baik untuk menangani validasi dengan kembali dari metode paling awal jika validasi gagal. Lain itu akan menghasilkan sejumlah besar ifs & elses. Penghentian awal meningkatkan keterbacaan kode.

Periksa juga tanggapan pada pertanyaan serupa: Haruskah saya menggunakan pernyataan return / continue, dan bukan if-else?


17
2017-08-16 03:36



Ini bukan praktik buruk (karena semua alasan sudah disebutkan). Namun, semakin banyak pengembalian yang Anda miliki dalam suatu metode, semakin besar kemungkinan itu harus dibagi menjadi metode logis yang lebih kecil.


6
2017-08-16 04:35



Contoh pertama adalah menggunakan pernyataan penjaga. Dari Wikipedia:

Dalam pemrograman komputer, seorang penjaga adalah seorang   Ekspresi boolean yang harus dievaluasi   true jika eksekusi programnya adalah   lanjutkan di cabang yang bersangkutan.

Saya pikir memiliki banyak penjaga di bagian atas metode adalah cara yang sangat mudah dimengerti untuk program. Pada dasarnya mengatakan "jangan menjalankan metode ini jika ada yang benar".

Jadi secara umum akan seperti ini:

void DoThis()
{
  if (guard1) return;
  if (guard2) return;
  ...
  if (guardN) return;

  DoThat();
}

Saya pikir itu lebih mudah dibaca kemudian:

void DoThis()
{
  if (guard1 && guard2 && guard3)
  {
    DoThat();
  }
}

4
2017-08-16 06:07



Tidak ada penalti kinerja, namun potongan kode kedua lebih mudah dibaca dan karenanya lebih mudah dipelihara.


2
2017-08-16 02:08



Ini baik-baik saja dan tidak ada 'penalti kinerja', tetapi tidak pernah menulis pernyataan 'jika' tanpa tanda kurung.

Selalu

if( foo ){
    return;
}

Ini lebih mudah dibaca; dan Anda tidak akan pernah berasumsi bahwa beberapa bagian kode berada dalam pernyataan itu ketika tidak.


2
2017-08-16 02:16



Dalam kasus ini, contoh kedua Anda adalah kode yang lebih baik, tetapi itu tidak ada hubungannya dengan kembali dari fungsi kosong, itu hanya karena kode kedua lebih langsung. Tetapi kembali dari fungsi kosong sama sekali baik.


1
2017-08-16 04:22