Seperti telah dicatat, ada dua aliran pemikiran tentang ini.
1) Nyatakan semuanya di atas fungsi karena tahun 1987.
2) Deklarasikan paling dekat dengan penggunaan pertama dan dalam ruang lingkup sekecil mungkin.
Jawaban saya untuk ini adalah DO KEDUA! Biarkan saya jelaskan:
Untuk fungsi yang panjang, 1) membuat refactoring sangat sulit. Jika Anda bekerja dalam basis kode di mana pengembang menentang gagasan subrutin, maka Anda akan memiliki 50 deklarasi variabel di awal fungsi dan beberapa dari mereka mungkin hanya menjadi "i" untuk for-loop yang sangat bagian bawah fungsi.
Karena itu saya mengembangkan deklarasi-at-the-top-PTSD dari ini dan mencoba melakukan opsi 2) secara agama.
Saya kembali ke opsi satu karena satu hal: fungsi pendek. Jika fungsi Anda cukup pendek, maka Anda akan memiliki beberapa variabel lokal dan karena fungsi ini pendek, jika Anda menempatkannya di bagian atas fungsi, mereka akan tetap dekat dengan penggunaan pertama.
Juga, anti-pola "menyatakan dan mengatur ke NULL" ketika Anda ingin mendeklarasikan di atas tetapi Anda belum membuat beberapa perhitungan yang diperlukan untuk inisialisasi diselesaikan karena hal-hal yang perlu Anda inisialisasi kemungkinan akan diterima sebagai argumen.
Jadi sekarang pemikiran saya adalah bahwa Anda harus mendeklarasikan di bagian atas fungsi dan sedekat mungkin dengan penggunaan pertama. Jadi KEDUA! Dan cara untuk melakukannya adalah dengan subrutin yang dibagi dengan baik.
Tetapi jika Anda sedang mengerjakan fungsi yang panjang, maka letakkan hal-hal yang paling dekat dengan penggunaan pertama karena dengan cara itu akan lebih mudah untuk mengekstrak metode.
Resep saya adalah ini. Untuk semua variabel lokal, ambil variabel dan pindahkan deklarasi ke bawah, kompilasi, lalu pindahkan deklarasi ke sesaat sebelum kesalahan kompilasi. Itu penggunaan pertama. Lakukan ini untuk semua variabel lokal.
int foo = 0;
<code that uses foo>
int bar = 1;
<code that uses bar>
<code that uses foo>
Sekarang, tentukan blok lingkup yang dimulai sebelum deklarasi dan pindahkan ujungnya hingga program dikompilasi
{
int foo = 0;
<code that uses foo>
}
int bar = 1;
<code that uses bar>
>>> First compilation error here
<code that uses foo>
Ini tidak dikompilasi karena ada beberapa kode lagi yang menggunakan foo. Kita dapat melihat bahwa kompiler dapat melalui kode yang menggunakan bilah karena tidak menggunakan foo. Pada titik ini, ada dua pilihan. Yang mekanis adalah dengan hanya memindahkan "}" ke bawah hingga kompilasi, dan pilihan lainnya adalah memeriksa kode dan menentukan apakah urutannya dapat diubah menjadi:
{
int foo = 0;
<code that uses foo>
}
<code that uses foo>
int bar = 1;
<code that uses bar>
Jika pesanan dapat diaktifkan, itu mungkin yang Anda inginkan karena mempersingkat masa pakai nilai sementara.
Hal lain yang perlu diperhatikan, apakah nilai foo perlu dipertahankan antara blok kode yang menggunakannya, atau mungkinkah itu hanya foo yang berbeda di keduanya. Sebagai contoh
int i;
for(i = 0; i < 8; ++i){
...
}
<some stuff>
for(i = 3; i < 32; ++i){
...
}
Situasi ini membutuhkan lebih dari prosedur saya. Pengembang harus menganalisis kode untuk menentukan apa yang harus dilakukan.
Tetapi langkah pertama adalah menemukan penggunaan pertama. Anda dapat melakukannya secara visual tetapi kadang-kadang, itu hanya lebih mudah untuk menghapus deklarasi, mencoba untuk mengkompilasi dan hanya meletakkannya kembali di atas penggunaan pertama. Jika penggunaan pertama itu di dalam pernyataan if, letakkan di sana dan periksa apakah kompilasi. Kompiler kemudian akan mengidentifikasi kegunaan lain. Cobalah untuk membuat blok lingkup yang mencakup kedua kegunaan.
Setelah bagian mekanik ini dilakukan, maka menjadi lebih mudah untuk menganalisis di mana data berada. Jika variabel digunakan dalam blok lingkup besar, analisis situasi dan lihat apakah Anda hanya menggunakan variabel yang sama untuk dua hal yang berbeda (seperti "i" yang digunakan untuk dua untuk loop). Jika penggunaannya tidak terkait, buat variabel baru untuk masing-masing penggunaan yang tidak terkait ini.