Apa kerugian yang mungkin terjadi dari menempatkan deklarasi di blok dalam, bukan di awal fungsi?

9

Di tempat saya bekerja, ada pedoman eksplisit untuk penempatan deklarasi variabel. Menurut itu, diperlukan untuk menempatkan mereka di tingkat global dan / atau di awal fungsi, dan bukan di blok dalam (seperti for loop). Karena mereka telah ditentukan oleh orang-orang yang lebih berpengalaman daripada saya, saya yakin pasti ada alasan yang bagus untuk itu, tetapi saya tidak tahu apa itu. Akan lebih baik untuk mengetahui apakah ada waktu kompilasi / keuntungan waktu menjalankan karena dideklarasikan pada lingkup yang lebih besar.

TCSGrad
sumber

Jawaban:

8

Saya melihat dua keuntungan utama:

  • Penggunaan kembali nama variabel dengan tipe yang berbeda dicegah.
  • Menjadi jelas pada waktu sebelumnya bahwa suatu rutinitas perlu di refactored. Variabel di atas menjadi kekacauan besar cukup cepat, dan kekacauan ini mudah dikenali.

Kompiler mana pun yang bernilai garamnya akan mengoptimalkan ruang lingkup variabel, jadi itu murni masalah format.

Untuk dua sen saya, saya masih lebih suka deklarasi terdalam dari variabel untuk mengangkut maksud ruang lingkup ke kompiler. Jika Anda bermaksud memiliki variabel yang hanya diakses dalam satu loop, Anda dapat menangkap referensi selanjutnya pada waktu kompilasi ketika Anda mendeklarasikan variabel dalam loop.

thiton
sumber
3

Satu-satunya keuntungan yang saya temukan sejauh ini adalah kesederhanaan kode. Anda selalu tahu di mana mencari deklarasi variabel dan semua orang di tim mengadopsi gaya pengkodean yang sama. Hal-hal ini membuat pemeliharaan kode lebih mudah tetapi saya tidak yakin mereka membuat penulisan kode yang lebih baik menjadi lebih mudah. Saya tidak bermaksud bahwa Anda menulis kode yang lebih buruk hanya kadang-kadang lebih sulit untuk menulis kode dengan baik. Namun demikian, jika tim pengembangan besar atau anggotanya sering berubah menggunakan standar kode sangat membantu.

Gus
sumber
3

Ini terdengar seperti keputusan untuk menjaga konsistensi. Ini juga mencegah penggunaan nama yang sama untuk variabel yang berbeda di lingkup tetangga dan meningkatkan keterbacaan. Seperti yang ditunjukkan Gus, Anda juga akan tahu di mana mencari variabel. Saya pikir prinsip lingkup tersempit lebih baik karena mencegah kekacauan variabel di atas. Deklarasi terluar mirip dengan mendeklarasikan anggota pribadi dari kelas IMO pertama.

perreal
sumber
3

Setiap bahasa mungkin berbeda dalam preferensi gaya dan praktik. Berikut ini dari JSF-AV-rules , yang Stroustrup tunjuk sebagai standar pengkodean yang ia sukai.

Aturan AV 136
Declarations should be at the smallest feasible scope

Alasan untuk ini digambarkan sebagai

This rule attempts to minimize the number of live variables that must be simultaneously considered. Furthermore, variable declarations should be postponed until enough information is available for full initialization

Jika Anda berada di C ++, menyatakan variabel saat Anda membutuhkannya lebih disukai.

Clark Gable
sumber
3

Tidak yakin apakah Anda dapat menyebut ini sebagai praktik terbaik. Ketika saya mengatur pedoman untuk proyek C baru, saya selalu menyatakan bahwa lebih baik mendeklarasikan variabel yang dekat dengan tempat mereka digunakan. Karena dua alasan, itu membuatnya lebih mudah untuk refactor kode nanti (yaitu ketika mengekstraksi suatu metode). Ini juga membantu kompiler untuk melakukan optimasi yang lebih baik.

Saya tidak sendirian dengan pendapat ini. Berikut pertanyaan yang menangani masalah yang sama: /software/56585/where-do-you-declare-variables-the-top-of-a-method-or-when-you-need -mereka Jawabannya di sini adalah untuk menyatakan di mana Anda menggunakannya. Praktek yang sama dijelaskan dalam buku 'Kode Bersih' oleh Robert C. Martin.

Namun, jika Anda menggunakan standar-C yang lebih lama (C-89), Anda harus mendefinisikan variabel lokal di bagian atas fungsi. Jadi mungkin pedomannya adalah sisa dari waktu ketika C-89 digunakan? Mungkin lebih baik untuk bertanya kepada orang yang menulis pedoman mengapa aturan itu masih ada.

Johan
sumber
2

Jika deklarasi berada dalam klausa if yang jarang (jika pernah) dijalankan, tetapi membutuhkan banyak memori, jejak memori Anda lebih kecil (sebagian besar waktu) daripada jika Anda mengalokasikan semuanya di awal fungsi.

Jika berada dalam satu loop maka Anda harus merealokasi memori berulang kali, ini bisa mahal dalam hal kinerja.

Ada alasan untuk melakukan hal-hal dengan dua cara.

NWS
sumber
1

Standar-C lama 1989 hanya memungkinkan deklarasi variabel di awal blok.

Hanya sejak deklarasi C99 diizinkan di mana saja. Mungkin tempat Anda belum beralih ke C99.

Patrick
sumber
Kami menggunakan C99 - tetapi yang lebih penting, saya mencari apa implikasi dari mendeklarasikannya di blok terdalam, daripada di awal fungsi. Mungkin, saya tidak cukup jelas ...
TCSGrad 11/11
1

Sepertinya orang-orang yang membuat keputusan ini digunakan pada saat menempatkan deklarasi di atas adalah norma dan memilih untuk tidak beralih ke preferensi untuk menyatakan lebih dekat ke tempat itu digunakan.

Saya tidak yakin seberapa kuat tingkat konsistensi ini. Beberapa IDE mungkin membuat menemukan hal-hal lebih mudah daripada yang lain. Untuk variabel global ini masuk akal, tetapi jika fungsi Anda terlalu lama membuat sulit untuk menemukan deklarasi variabel, Anda memiliki masalah yang lebih besar.

JeffO
sumber