Neden değişkenleri kullanıldıkları yere yakın bildirmeliyiz?


10

İnsanların değişkenlerin kullanımlarına olabildiğince yakın beyan edilmesi gerektiğini söylediklerini duydum . Bunu anlamıyorum.

Örneğin, bu politika şunu yapmamı önerir:

foreach (var item in veryLongList) {
  int whereShouldIBeDeclared = item.Id;
  //...
}

Ancak elbette bu int, her yinelemede yeni bir yaratma yükünün oluştuğu anlamına gelir . Kullanmak daha iyi olmaz mıydı:

int whereShouldIBeDeclared;
foreach (var item in veryLongList) {
  whereShouldIBeDeclared = item.Id;
  //...
}

Lütfen biri açıklayabilir mi?


3
Bu iki davayı farklı şekilde ele alan oldukça lanet bir fakir dil olurdu.
Paul Tomblin

5
Yanlış bir öncülden bir başlangıç. Lütfen bu soruya verdiğim cevaba bakın: stackoverflow.com/questions/6919655/…
CesarGon

8
Böyle düşünüyorsanız, genel olarak performans etkilerini optimize etmek ve hatta dikkate almak için uygun değilsiniz. Dil uygulamaları akıllıdır ve olmadığını düşünüyorsanız, tarafsız, gerçekçi ölçütlerle elde edilen sert verilerle kanıtlayın.

4
Eğer iki kod örnekleri anlamlı semantik fark var, o zaman farklı şeyler yapmak. Yapmak istediklerinizi yapanı kullanmalısınız. Değişkenleri nerede bildirdiğinizle ilgili kural, yalnızca anlamsal bir fark oluşturmadığı durumlar için geçerlidir.
David Schwartz

4
Ölçeğin karşı ucunu düşünün - her şey küresel bir değişken. Şüphesiz 'kullanıma yakın ilan edilmiş' bu yelpazenin daha iyi sonu mu?
JBRWilkinson

Yanıtlar:


27

Bu, birçoğu arasında bir stil kuralıdır ve mutlaka aklınıza gelebilecek tüm olası kuralların en önemli kuralı değildir. Örneğiniz, bir int içerdiğinden, süper zorlayıcı değildir, ancak bu döngü içinde kesinlikle pahalı bir yapıya sahip bir nesneye ve belki de nesneyi döngü dışında oluşturmak için iyi bir argümana sahip olabilirsiniz. Bununla birlikte, bu ilk önce bu kurala karşı iyi bir argüman yapmaz, bir döngüde pahalı nesneler inşa etmeyi içermeyen tonlarca başka yer vardır ve ikincisi iyi bir optimize edici (ve C #, böylece iyi bir optimizer var) döngü dışında başlatma vinç olabilir.

Bu kuralın gerçek nedeni, bunun neden bir kural olduğunu görmemenizin nedenidir. İnsanlar yüzlerce hatta binlerce satır uzunluğundaki işlevleri yazıyorlardı ve Visual Studio'nun sağladığı destek olmadan düz metin editörlerine (Not Defteri) yazıyorlardı. Bu ortamda, kullanıldığı yerden yüzlerce satır değişkenlik bildirilmesi, okuyan kişinin

if (flag) limit += factor;

Bayrağın, limitin ve faktörün ne olduğu hakkında çok fazla ipucu yoktu. Buna yardımcı olmak için Macarca gösterim gibi adlandırma kuralları kabul edildi ve kullanılan yerlere yakın şeyleri bildirmek gibi kurallar da kabul edildi. Tabii ki, bu günlerde, her şey yeniden düzenleme ile ilgilidir ve işlevler genellikle bir sayfadan daha azdır, bu da bildirilen yerler ile kullanıldığı yerler arasında çok fazla mesafe almayı zorlaştırır. 0-20 aralığında çalışıyorsunuz ve bu örnekte 7'nin iyi olduğunu tartışıyorsunuz, kuralı yapan kişi 7 satır almayı SEVDİ ve 700'den biriyle konuşmaya çalışıyordu. Bunun da ötesinde, Visual Studio'da herhangi bir şeyin üzerine fareyi getirebilir ve türünü görebilirsiniz, üye bir değişken olup olmadığı vb. Bu, hattın azaltıldığını görme gereğinin azaldığı anlamına gelir.

Bu hala oldukça iyi bir kural, bugünlerde kırılması oldukça zor olan ve hiç kimsenin yavaş kod yazmanın bir nedeni olarak savunulamadığı bir kural. Her şeyden önce mantıklı olun.


Cevabınız için teşekkürler. Ancak veri türünden bağımsız olarak, her yinelemede hangi şekilde yaparsam yapayım yeni bir örnek oluşturulur? Sadece ikinci durumda her seferinde yeni bir bellek referansı istemiyoruz. Yoksa noktayı kaçırdım mı? Ve yine de derleme C # optimize edici kodumu otomatik olarak artıracak diyorsun? Bunu bilmiyordum!
James

2
Bir int oluşturmanın yükü küçüktür. Karmaşık bir şey inşa etseydiniz, yükü daha büyük olurdu.
Kate Gregory

17
Bu sadece türünü ve benzerlerini görebilme meselesi değil. Aynı zamanda bir ömür meselesi. "Wibble" değişkeni ilk kullanımdan 30 satır önce bildirilirse, "wibble" ın yanlış kullanımının hataya neden olabileceği 30 satır vardır. Kullanılmadan hemen önce bildirilirse, önceki 30 satırda "wibble" kullanılması hataya neden olmaz. Bunun yerine derleyici hatasına neden olur.
Mike Sherrill 'Cat Recall'

Bu durumda, yeni bir örneği olduğunu değil , her döngü yarattı. Her bir yineleme için tek bir üst düzey değişken oluşturulur ve kullanılır (IL'ye bakın). Ama bu bir uygulama detayı.
thecoop

"Visual Studio'da, herhangi bir şeyin üzerine fare ile gidip görebilirsiniz" vb. Ayrıca F12, vazgeçilmez kısayolu olan tanımlamaya git de vardır .
StuperUser

15

Döngünün içindeki değişkeni tanımlamak, onu yalnızca o döngü için yerel olarak görünür kılar. Bunun okuyucu için en az 3 avantajı vardır:

  1. Değişken tanımı ve ilgili yorumların bulunması kolaydır
  2. Okuyucu, bu değişkenin hiçbir zaman başka yerde kullanılmadığını bilir (beklemek için bağımlılık yoktur)
  3. Kod yazıldığında veya düzenlendiğinde, bu değişkene başvurmak için döngü dışında aynı değişken adını kullanma şansınız yoktur, aksi takdirde hata alabilirsiniz.

Verimlilik bitine gelince, derleyici üretilen optimize edilmiş kodda döngü dışında tanım üretmek için akıllıdır. Değişken her döngü yinelemesinde oluşturulmaz.


4

İnsanlar kullanımlarına olabildiğince yakın diyorlar , bunu her zaman yapmanız gerektiğini söylemiyorlar, çünkü değişkenleri en az kapsamda beyan eden bazı durumlar yüke neden olacak. yapabileceğiniz en küçük kapsam.


4

Okunabilirliğe yardımcı olmasına rağmen, okunabilirlik bu durumda birincil husus değildir ve modern IDE'ler bu kurala olan ihtiyacı ortadan kaldırmaz.

Birincil endişe başlatılmamış değişkenlerdir. Bir değişkeni başlatılmasından çok uzakta bildirirseniz, sizi her türlü potansiyel soruna açar. Kendinizi daha önce RAM'de olanlarla veya işlevde daha yüksek bir hesaplamadan veya birisinin derleyicinin şikayet etmesini önlemek için koyduğu bir kukla başlatma (0 gibi) sonucu ile yanlışlıkla çalıştığını görebilirsiniz. Kullanıcılar, bu değişken için örtük ön koşullarınızın farkında olmadan bildiriminizle kullanımınız arasına kod ekleyecektir. En kötü durumlarda, bu kullanım sadece testlerinizde işe yarayacak, ancak sahada başarısız olacaktır.

Değişkenlerinizi olabildiğince küçük bir kapsamda beyan etmek ve bunları beyan noktasında uygun bir değere başlatmak, birçok bakım baş ağrısından kaçınacaktır. Geliştirilmiş okunabilirliği zorladığı gerçeği sadece hoş bir yan etkidir.


1

Bu bir "zorunluluk" değildir. Bu sadece bir fikir, bir şey yapmanın yolu. Örneğin, yöntemin ilk satırlarındaki tüm değişkenleri bildirmeyi seviyorum, böylece bu değişkenlerle ne yapacağımı yorumlayabiliyorum (tabii ki sayaç olmadıkça). Diğer insanlar, duyduğunuz gibi, kullanımlarına mümkün olduğunca yakın yerleştirmeyi sever (yazdığınız ikinci örnekte olduğu gibi). Her neyse, sağladığınız ilk örnek kesinlikle bir "hata" dır (anladığınız gibi bir ek yüke neden olacağı anlamında).

Sadece yolunuzu seçmeli ve takip etmelisiniz.


2
Bu sadece bir fikir değil , değil mi? Yazılım mühendisliği araştırması, en azından 1980'lerden beri canlı zaman ve hata sayısı arasındaki ilişkiyi belgelemedi mi?
Mike Sherrill 'Cat Recall'

1

İki örneğiniz işlevsel olarak farklı kodlardır, birbirinin yerine kullanılamaz. (Sökülen örnekleriniz, farkı olmayan bir ayrım bırakır, ancak önemsiz olmayan kodda fark yaratır). Sitenizdeki kural her zaman "... mümkün olduğunca" ile gösterildiği gibi kapsam belirleme hususlarına tabidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.