Belirtildiği gibi, bu konuda iki düşünce ekolü vardır.
1) Yıl 1987 olduğu için her şeyi işlevlerin başında ilan edin.
2) İlk kullanıma en yakın şekilde ve mümkün olan en küçük kapsamda beyan edin.
Buna cevabım İKİSİNİ YAPIN! Açıklamama izin ver:
Uzun işlevler için, 1) yeniden düzenlemeyi çok zorlaştırır. Geliştiricilerin alt yordamlar fikrine karşı olduğu bir kod tabanında çalışıyorsanız, işlevin başlangıcında 50 değişken bildiriminiz olur ve bunlardan bazıları, bir for-döngü için yalnızca bir "i" olabilir. işlevin altında.
Bu yüzden bundan en üstte TSSB beyanı geliştirdim ve 2. seçeneği dini olarak yapmaya çalıştım.
Bir şey yüzünden birinci seçeneğe geri döndüm: kısa işlevler. İşlevleriniz yeterince kısaysa, o zaman birkaç yerel değişkene sahip olursunuz ve işlev kısa olduğu için, onları işlevin en üstüne koyarsanız, yine de ilk kullanıma yakın olurlar.
Ayrıca, en üstte bildirmek istediğinizde ancak başlatma için gerekli bazı hesaplamaları yapmadığınızda "bildirmek ve NULL olarak ayarlamak" karşıt kalıbı çözülür çünkü başlatmanız gereken şeyler büyük olasılıkla argüman olarak alınacaktır.
Yani şimdi benim düşüncem, işlevlerin en üstünde ve ilk kullanıma mümkün olduğunca yakın beyan etmeniz gerektiğidir. Yani HER İKİSİ de! Ve bunu yapmanın yolu iyi bölünmüş alt yordamlardır.
Ancak uzun bir işlev üzerinde çalışıyorsanız, o zaman ilk kullanıma en yakın şeyleri koyun, çünkü bu şekilde yöntemleri çıkarmak daha kolay olacaktır.
Tarifim bu. Tüm yerel değişkenler için, değişkeni alın ve bildirimini en alta taşıyın, derleyin, ardından bildirimi derleme hatasından hemen öncesine taşıyın. Bu ilk kullanım. Bunu tüm yerel değişkenler için yapın.
int foo = 0;
<code that uses foo>
int bar = 1;
<code that uses bar>
<code that uses foo>
Şimdi, bildirimden önce başlayan ve program derlenene kadar sonu hareket ettiren bir kapsam bloğu tanımlayın
{
int foo = 0;
<code that uses foo>
}
int bar = 1;
<code that uses bar>
>>> First compilation error here
<code that uses foo>
Bu derlenmez çünkü foo kullanan daha fazla kod vardır. Derleyicinin foo kullanmadığı için bar kullanan kodun içinden geçebildiğini fark edebiliriz. Bu noktada iki seçenek var. Mekanik olan, derlenene kadar "}" karakterini aşağı doğru hareket ettirmek, diğer seçenek ise kodu incelemek ve sıranın şu şekilde değiştirilip değiştirilemeyeceğini belirlemektir:
{
int foo = 0;
<code that uses foo>
}
<code that uses foo>
int bar = 1;
<code that uses bar>
Sıra değiştirilebilirse, muhtemelen istediğiniz şey budur çünkü geçici değerlerin ömrünü kısaltır.
Unutulmaması gereken bir diğer husus, foo'nun değerinin onu kullanan kod blokları arasında korunması mı gerekir, yoksa her ikisinde de farklı bir foo olabilir mi? Örneğin
int i;
for(i = 0; i < 8; ++i){
...
}
<some stuff>
for(i = 3; i < 32; ++i){
...
}
Bu durumların benim prosedürümden daha fazlasına ihtiyacı var. Geliştiricinin ne yapacağını belirlemek için kodu analiz etmesi gerekecektir.
Ancak ilk adım, ilk kullanımı bulmaktır. Bunu görsel olarak yapabilirsiniz, ancak bazen bildirimi silmek, derlemeye çalışmak ve ilk kullanımın üzerine geri koymak daha kolaydır. Bu ilk kullanım bir if ifadesinin içindeyse, oraya koyun ve derlenip derlenmediğini kontrol edin. Derleyici daha sonra diğer kullanımları belirleyecektir. Her iki kullanımı da kapsayan bir kapsam bloğu oluşturmaya çalışın.
Bu mekanik kısım yapıldıktan sonra verilerin nerede olduğunu analiz etmek kolaylaşır. Bir değişken büyük bir kapsam bloğunda kullanılıyorsa, durumu analiz edin ve aynı değişkeni iki farklı şey için kullanıp kullanmadığınızı görün (döngüler için iki kişi için kullanılan bir "i" gibi). Kullanımlar ilgisiz ise, bu ilgisiz kullanımların her biri için yeni değişkenler oluşturun.