Tek harfli değişkenlerin kullanımı teşvik ediliyor mu? [kapalı]


13

Java'da tek harfli değişkenlerin kullanımı teşvik ediliyor mu? Kod snippet'lerinde veya eğitimlerinde genellikle bunları görürsünüz. Onları kullanmayı hayal edemiyorum çünkü kodun okunmasını nispeten zorlaştırıyor ve diğer programlama dillerinde kullanıldığını asla görmüyorum!


3
Evet ve hayır. Tamamen duruma bağlıdır.
Zavior




1
Her zaman kodun okunmasını zorlaştırmaz. Örneğin, matematiksel denklemlere dayalı kod uygularken, genellikle denklemlerde kullanılan değişken isimlerinin kullanılması mantıklıdır. (Yorumlar, orijinal denklemlerin bulunacağı kâğıda / metne işaret eder veya benden hoşlanıyorsanız, bazen onlar için LaTeX kodunu
eklersiniz

Yanıtlar:


32

Bir şeyleri uygun şekilde adlandırmak zordur. Çok zor. Buna başka bir şekilde bakarsanız, bunu uygun şekilde adlandırılmış şeylerin önemli olduğu anlamına da getirebilirsiniz. (Aksi halde, adlandırma çabasını neden harcadınız?)

Ancak, bazen, şeylerin isimleri önemli değildir . Bu yüzden anonim işlevler ("lambdas") gibi şeylerimiz var, örneğin: çünkü bazen bir şeyleri adlandırmaya değmez.

Tek harfli (veya çok kısa) değişken adlarının uygun olduğu birçok örnek vardır:

  • i, j, k, lHalka indeksleri için
  • kve vbir haritadaki anahtar ve değer için
  • nbir numara için (örneğin içinde Math.abs(n))
  • a, b, cİsteğe bağlı nesneler için (örn max(a, b))
  • egenel for eachdöngüdeki öğe için
  • f daha üst düzey bir fonksiyondaki fonksiyon için
  • p bir filtrede yüklem işlevi için
  • T, T1, T2, ... tipi değişkenler için
  • E koleksiyonun öğe türünü temsil eden tür değişkenleri için
  • R bir işlevin sonuç türünü temsil eden bir tür değişkeni için
  • exbir catchmaddede istisna için
  • op bir harita veya kattaki işlem için
  • harfi ekleyerek sbir koleksiyon yani çoğul işaret (örneğin üzere nsnumaralarının toplanması için, xsve ysjenerik nesnelerin iki keyfi koleksiyonları)

Diğer programlama dillerinde kullanıldıklarını hiç görmüyorum!

Onlar bildiğim her dilde çok yaygın (ve muhtemelen bilmediğim dillerde de). Haskell, F #, ML, Ruby, Python, Perl, PHP, C #, Java, Scala, Groovy, Boo, Nemerle, D, Go, C ++, C, adını siz koyun.


5
-1 1 harfli değişken isimlerini kullanmak tembel programlamadır. Bazen tembel olmak sorun değil, ama kadar alıyorsanız kve lçok uzak döngü endeksleri, içinde (genel olarak başlangıçta birçok iç içe döngüler olmamalıdır; işlevlere özü onları) . Şahsen ben işlevi başına bir 1 harfli değişkeni daha kullanmak, ama asla ben ateş 0. için
BlueRaja - Dany Pflughoeft

Ayrıca, lveya lenbir uzunluk ve arrbir dizi için kullanılır (örneğin:) for(var i=0; l=arr.length; i<l; i++). Ayrıca, bir işleve başvurduğunuzda fnbunun yerine kullanılabilir f.
Ismael Miguel

4
@ BlueRaja-DannyPflughoeft Bunu verimli bir programlama olarak düşünmeyi tercih ediyorum. Jorg muhtemelen tek harfler uygun olduğunda genişleyebilirdi, sadece nerede değil, dürüst olmak gerekirse çoğu programcının çizgiyi farklı çizdiğini hayal ediyorum. Döngü indekslerine gelince, indekslerin anlamsal değeri olan isimlere ihtiyaç duymadığı herhangi bir kodun, gereksiz çıkarma üzerinde çok seviyeli iç içe geçmeyi haklı çıkaracak kadar basit olduğunu iddia edebilirim. Nelson'ın getirdiği olası kapsam sorunlarından kaçınmak için ayrı döngülerde de kullanılabilirler .
Lilienthal

2
@Lilienthal: Kodun okunması verimli olmalı, yazılması verimli olmamalıdır. Genellikle bunlar aynı şeydir, ancak her zaman değil, bu durumda olduğu gibi.
BlueRaja - Danny Pflughoeft

@ BlueRaja-DannyPflughoeft Tüm programlarda hayır, ama Jorg'in önerileriyle ilgili yanlış bir şey görmüyorum. As Killian koydu: "Daha uzun bir şey belki semantik daha açık hale ama okumak için çok daha uzun sürer olamaz." Ancak bu muhtemelen büyük ölçüde kişisel tercih ve stil meselesidir.
Lilienthal

20

Döngünüz saymak için bir değişken kullanmaktan başka bir şey yapmıyorsa

  for(int i = 0; i < 10; i++) {
     System.out.println("Stop it! I really mean it!!");
  }

o zaman evet, bu kullanabileceğiniz en iyi isim. Artık hiçbir şey anlambilimi daha açık hale getiremez, ancak okunması daha uzun sürer.

Değişken döngü içinde kullanılırsa , anlamlı bir ad yararlı olabilir.

for(int door = 0; door < 3; door++) {
  int reward = gauge(door);
  if(reward > max) {
    max = reward;
    best = door;
  }
}

Değişkeniniz yöntem genelinde kullanılıyorsa, adı daha uzun olmalıdır; sınıf çapında kullanılıyorsa, adı tamamen açıklayıcı olsa iyi olur, aksi takdirde kodunuzun netliğini neredeyse kesinlikle azaltacaktır.

Kısacası, değişkenin kapsamı ne kadar büyük olursa adı da o kadar uzun olmalıdır.


Dürüst olmak gerekirse, bir karakter değişkeni ismi, nokta kullanamayacağım noktaya geldim. Sayaçlar için bile kullanımı heceleyecek isimler kullanmaya çalışıyorum. Genellikle indexbir dizi üzerinden yineleme yaparken adlı bir değişken kullanırdım, örneğin.
Michael

13
@Michael: Bence, Programlama Jargon kendi dilidir, İngilizce'ye uygun değildir. Ve bu dilde, itam olarak tanımlanmış bir anlamı olan "dizin hakkında çok fazla endişelenmenize gerek yok" anlamına gelen uygun bir kelimedir. Ama sanırım bu bir aşinalık meselesi. Eğer Haskell çok okursanız okumaya alışık hale edeceğiz mkadar monad , fyanı funktor , xsıra bazı nesne , xsolarak listesi xs vb.
Jörg W Mittag

2
Sadece çok büyük bir uyarı. Tek harfli değişken adları, yalnızca dilin değişken değişken kapsamı varsa Tamamdır. Açıkçası 'Hangi dilde uygun kapsam bulunmuyor?' Diye soracaksınız. JavaScript'in bir FOR döngüsünde değişkenleri kapsamadığını öğrenmek üç saatimi aldı. Aynı değişken adını kullanarak for döngüsü içinde bir for döngüsü ile deneyin. Aklını başınızdan alacak.
Nelson

@ Nelson: Bu soru ve bu cevap Java ile ilgili. Açıkçası, farklı diller biraz farklı hususlara sahip olabilir. (JavaScript Java ile aynı dil değildir.)
ruakh

Ben en anlamlı ne zaman hepsi tek harfli değişken isimleri için değilim, ama isadece sayma için bir değişken kullanan bir döngü için "kullanabileceğiniz en iyi isim" olduğunu kabul etmiyorum . Bu durumda, countdeğişken adı olarak kullanılmasını tercih ederim : anında anlaşılabilir. for (int count = 0; count < 10; count++)veya while (count--).
Todd Lehman

4

Kilian'ın cevabındaki kodu okuduğumda, "bir döngü var ve bir değişken var ve int türü var ve bir adı var ve adı i ve 0 olarak başlatıldı. .. ". Ben sadece üç noktanın düşündüğüm önemsiz ayrıntıları temsil ettiği "döngü ..." diye düşünüyorum. Programcımın zihninde, bu değişken gerçekten mevcut değil, sadece bir döngü yapan for (;;) {} gibi yazmam gereken bir eser.

Bu değişken aklımda bile mevcut olmadığından, neden kesinlikle gerekli olanın ötesinde bir isim vereyim?


Bunu bu tür bir yapıda eklemeliyim ki, çoğu zaman bile ideğil _, açıkça anlamsız değişken için kullanmak isterim . Ancak herkes Prolog'a aşina değildir ve muhtemelen kaldırdığından daha fazla dikkat yaratacaktır.
Kilian Foth

Ayrıca, değişkenin yalnızca başlıkta değil, döngü içinde nasıl kullanıldığını da düşünmeniz gerekir for (...).

@KilianFoth: Haskell, ML, F # ve Scala'da da bu şekilde kullanılıyor, inanıyorum. Ve Ruby, olsa _da diğerleri gibi yasal bir tanımlayıcı olan, kullanılmayan lokal değişkenler adında bir son değişikliği oldu _(veya ile başlayan _) do not Yakut normalde onlar hakkında uyarır rağmen bir "kullanılmayan yerel değişkeni" uyarısı oluşturur.
Jörg W Mittag

-1

Bir döngü içindeki indeksler olarak i, j, k harflerinden bahsediyorsanız, bu Java ve diğer programlama dillerinde yaygın olarak kullanılan bir uygulamadır. Her stil döngüsü için bir kullanmak muhtemelen daha iyi olsa da,

for(User user: users) {
  doSomethingWithTheUser(user);
}

onun yerine

for(int i=0; i<users.size(); i++) {
  doSomethingWithTheUser(users.get(i));
}

Java'da bu döngü tarzı sadece son zamanlarda tanıtıldı. Bu nedenle, bir dizi veya liste üzerinde döngü oluşturmanın en yaygın yolu olarak kullanılan dizinler üzerinde döngü oluşturması nedeniyle Java için daha fazla fark ediyorsunuz olabilir.

N, x veya y gibi tek harflerin zaten ortak olabileceği matematiksel bir fonksiyonun uygulanması gibi, tek harflerin uygun olabileceği birkaç durum daha vardır. Ama genel olarak, hayır, değişkenlerinize anlamlı bir ad verin.


5
“Java'da bu döngü tarzı sadece son zamanlarda oldukça tanıtıldı” ... on yıl önce olduğu gibi? ( Java 5 2004'te piyasaya sürüldü )
Meriton

1
Evet bu oldukça yeni. Hayır ben yaşlı değilim. Kapa çeneni. Lanet çocuklar çimlerimden iniyor. Java 5 öncesi hala çok sayıda eski Java uygulaması var. Ve Java 1.4'de dili öğrenen ve işleri nasıl yaptıklarını güncellemeyi reddeden daha fazla Java programcısı. Ve o tarihte 2000'lerin başlarına kadar çevrimiçi olan daha fazla kod örneği (evet, o zamanlar internete sahiptik; sadece Web 2.0 olarak adlandırdık).
Nick
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.