Apakah praktik yang buruk untuk membuat blok kode?

12

Dalam C ++, apakah itu praktik buruk membuat blok kode di dalam beberapa fungsi, seperti berikut ini:

    bool f()
    {
       {
           double test = 0;

           test = // some other variable outside this function, for example.

           if (test == // some value)
             return true;
       }

       {
           double test = 0;

           test = // some variable outside this function, different from the last one.

           if (test == // some value)
             return true;
       }

       return false;

    }

Tujuan melakukan ini adalah menggunakan nama variabel yang sama dari "tes" beberapa kali, untuk jenis prosedur yang sama. Dalam proyek saya yang sebenarnya, saya memiliki beberapa variabel dan sedang melakukan beberapa tes. Saya tidak benar-benar ingin terus membuat variabel baru dengan nama yang berbeda untuk setiap tes, mengingat betapa tesnya sangat mirip.

Apakah praktik yang buruk untuk menyisipkan blok kode sehingga variabel keluar dari ruang lingkup setelah setiap tes, dan kemudian saya dapat menggunakan nama mereka lagi? Atau haruskah saya mencari solusi lain? Perlu dicatat bahwa saya mempertimbangkan untuk menggunakan set variabel yang sama untuk semua tes saya (dan hanya mengatur semuanya ke 0 setelah setiap tes selesai), tetapi saya mendapat kesan bahwa ini mungkin praktik yang buruk.

Ketidaktahuan inersia
sumber
19
Jika saya mengungkapkan kode ini, saya akan memberitahu Anda untuk memisahkan masing-masing tes ini menjadi metode individual ... Sebagai konsekuensinya Anda tidak perlu menggunakan blok kode untuk mengaturnya secara terpisah.
Maybe_Factor
1
@ Maybe_Factor - Saya setuju. Manfaat metode terpisah adalah Anda dapat memberi nama setiap blok, memberikan kode yang lebih mudah dibaca.
mouviciel
@mouviciel Bukan hanya kode yang lebih mudah dibaca, tetapi lebih banyak laporan pengujian yang dapat dibaca!
Maybe_Factor
@Maybe_Factor Saya tidak setuju. Memindahkan berbagai hal ke fungsi yang terpisah memiliki efek negatif membuatnya tampak seperti sedikit fungsionalitas yang dapat digunakan kembali. Menyimpan semua logika untuk suatu fungsi di satu tempat itu bagus.
Miles Rout
1
@MilesRout Ini bukan satu fungsi logis, ini adalah beberapa tes unit untuk semua fungsi yang dijejalkan ke dalam satu fungsi tes. Blok kode vs fungsi dalam kode normal adalah diskusi lain sepenuhnya.
Maybe_Factor

Jawaban:

22

Blok sangat masuk akal jika Anda menggunakannya untuk lingkup sumber daya. File, koneksi jaringan, alokasi memori, transaksi basis data, apa pun. Dalam kasus tersebut, blok sebenarnya adalah bagian dari struktur logis dari kode: Anda menelurkan sumber daya, itu ada untuk beberapa periode waktu, dan kemudian hilang pada waktu yang ditentukan.

Tetapi jika semua yang Anda lakukan adalah pelingkupan nama , maka saya akan mengatakan bahwa itu adalah praktik yang buruk. Secara umum, tentu saja; keadaan khusus dapat berlaku.

Misalnya, jika fungsi ini dihasilkan oleh beberapa sistem pembuatan kode, kerangka pengujian, atau sejenisnya, maka blok demi pelingkupan nama adalah hal yang wajar. Tetapi Anda akan berbicara tentang kode yang ditulis untuk tujuan mesin, bukan manusia.

Jika seorang manusia sedang menulis kode di mana mereka perlu menggunakan kembali nama dalam fungsi yang sama, saya akan mengatakan bahwa blok-blok itu mungkin perlu fungsi yang terpisah. Terutama jika nama-nama itu digunakan dengan berbagai jenis dan / atau makna di dalam blok-blok itu.

Nicol Bolas
sumber
10

Bukan praktik yang buruk untuk membuat blok seperti ini. Begitulah cara kerja lingkup.

Biasanya ini dilakukan ketika menggunakan RAII (Akuisisi Sumber Daya adalah Inisialisasi) dan Anda ingin mengontrol ketika destruktor dipanggil.

Jika terlalu lama, saya akan mempertimbangkan untuk memindahkan kode itu ke fungsinya sendiri.

Menurut pendapat saya hanya menggunakannya untuk mendaur ulang nama variabel bukanlah ide yang baik. Tapi saya bisa melihatnya berguna dalam kasus dengan memori rendah

Robert Andrzantai
sumber
Penggunaan kembali nama variabel lokal tidak berpengaruh pada penggunaan memori.
kevin cline
1
Tidakkah Anda berpikir bahwa pengoptimal pintar dapat menggunakan 1 lokasi memori untuk 2 variabel?
Robert Andrzantai
3
Iya. Tapi itu juga bisa melakukan itu jika mereka berada dalam ruang lingkup yang sama, jika mereka tidak memiliki destruktor.
Sebastian Redl