Ayrılmış sözcüklerden kaçınmak için kasıtlı yazım hataları


45

Sık sık, daha iyi veya daha kötüsü için ayrılmış sözcükler haline gelen, genel kelimelerin kasıtlı yanlış hecelemelerini içeren bir kod görüyorum:

  • klassya clazziçin sınıfta :Class clazz = ThisClass.class
  • kountSQL'de sayım için :count(*) AS kount

Şahsen ben bu okunabilirliği azaltır buluyorum. Kendi uygulamamda daha iyi bir ismin kullanılamayacağı çok fazla dava bulamadım - itemClassya da recordTotal.

Class için JavaDocs'tan bir örnek bunu parametrelerde gösterir:

 public <U> Class<? extends U> asSubclass(Class<U> clazz)

Bu makul bir kullanım durumu gösteriyor mu?


9
Kayıt için: Python'da, clsgerçek sınıfları ( classanahtar kelimeyle açıkladığınız ve her şeyin bir örneği olan) değişkenler / argümanlar için ortak (aslında bir deyimsel) addır .

14
Beğenmedin typedef char íntmi
Jeff

14
@muntoo Haklısın. Ayrıca derleyici hataları alıyorum iñt. İşte dünya baskınlığı planım gidiyor.
Jeff

1
Bu kuralı çiğnedim ... ve şimdi utanıyorum.
jmq

3
Yapma Açıkçası bunu daha önce hiç görmediğimi söyleyebilirim ve eğer yaparsam hemen yeniden adlandırırım. Açıklayıcı olmayan bir değişken adı ( ) kullanmanız gerekiyorsa , sadece kısaltın Class c.
Cody Gray

Yanıtlar:


63

IMHO, bu çok kötü bir fikir. Ayrılmış kelimeler bir nedenle ayrılmıştır ve bunu yapmak okunabilirliği azaltır.

Ayrıca ikinci noktanıza tamamen katılıyorum. Bir değişken adlandırma class, bunu yapabileceğini bile bunu adlandırma kadar kötü olurdu tmpya a. Ne tür bir sınıf? Neyin sınıfı? İsimler açıklayıcı olmalıdır.


15
"Ayrılmış kelimeler bir nedenle ayrılmıştır" <- Bu. (Bu, yeterince ironik bir şekilde saklıdır.)
deneme

16
+1 çünkü haklısın. Ama eğer sınıf çizelgeleme yazılımı veya başka bir şey yazıyorsanız, sınıf meşru bir değişken veya sınıf adı olabilir ...
CaffGeek

8
Meh. " Ayrılmış kelimeler bir nedenle ayrılmıştır ", yani dil tasarımcıları tembeldir. Kelimelerin yalnızca kullanıldıkları belirli yerlerde saklı kaldığı oldukça az sayıda dil vardır. Fakat Ritchie bu eğilime C için hafif bir derleyiciye ihtiyaç duyduğunda başladı ve çoğu dil tasarımcısı oradan öğrendi.
Ross Patterson

14
Ross, çünkü programcıların (ve genel olarak okurların) makul derecede net olmayan bir anlama sahip olma beklentilerine sahip olmaları (bu nedenle yabancı dil öğrenmenin genellikle bu kadar zor olması, çifte anlamı olan her şey veya sizin yetiştirdiğiniz dilden farklı anlamı olması) Bu belirsizliklerin hiçbir zaman farkına varmadığınız çocukluğunuzdan beri, çünkü onlar kültürel mirasınızın bir parçasıdır).
Ocak'ta 13:13

3
@AlexanderMorou Nope ve çoğu dil tasarımcısı da yok, sadece başkalarının tasarımı ile başlıyorlar. Ancak Algol, Fortran, PL / I, Rexx ve C'ye dayalı olmayan diğer dillere bakın ve ayrılmış kelimeleri olmayan gramerlerin kesinlikle mümkün, sadece daha zor olduğunu göreceksiniz. Ritchie'nin iyi bir nedeni vardı - Unix milleti her tuş vuruşunun önemli olduğunu ve bir PDP-11'de her CPU döngüsünün önemli olduğunu düşünüyordu. Bugün? Çok değil.
Ross Patterson

21

Python'un Stil Rehberi bu sorunu özel olarak ortaya koyuyor ve şunları söylüyor:

Genel özellik adınız ayrılmış bir anahtar kelimeyle çakışıyorsa, özellik adınıza tek bir izleyen alt çizgi ekleyin. Bu bir kısaltma veya bozuk yazım için tercih edilir.

Bu, belirli bir dilin anlambilimiyle çelişmediği varsayılarak oldukça iyi bir genel kural gibi görünüyor.


7
Bunun bir stil rehberinden gerçekten çok kötü bir tavsiye olduğunu düşünüyorum. Özellik adınız bir anahtar kelimeye bu kadar yakınsa, daha iyi bir ad bulmalısınız. Basitçe sonuna bir alt çizgi koymak herhangi bir anlam katmaz ve kodu okuyan bir sonraki adamın kafasını karıştırması muhtemeldir.
Wayne Johnston

18
@Wayne: unionBir anahtar kelime olduğunda (s) ' de sendika operasyonunu sendika bulma yapısında nasıl adlandıracaksınız? Öyle foogörünmemesi için arayacak unionmısın?
Fred Foo

OTOH, clssınıf metodu için standart argüman adıdır. Ayrıca örneğin Django nesnelerinde .idelbette idyerleşik işlevle çakışan bir öznitelik vardır .
vartec

1
@GoloRoden Hiç kimsenin sendika hesaplanırken iki seti "birleştirdiğini" söylemediğini duymadım. Bu sadece lingonun bir parçası değil. "Birleştirme" daha iyi olurdu, ancak bir mergeyöntemin hala birliğin uygulandığını ve tamamen teknik nedenlerle yeniden adlandırıldığını belirten belgelere hala ihtiyacı olacaktı.
Fred Foo

2
@GoloRoden Merriam-Webster’a göre bu bir fiil değil, ama bu cevabı gör .
maaartinus

18

Kod kokusu.

string stringVariable = "";

Yukarıdaki kod, kullanım amacı olan değişkenler hakkında hiçbir şey söylemez.

class Klass

Aynı sorun

string UserNameString = "bmackey"

Yukarıdaki kod değişken adına eklenmiş anahtar kelime dizgisi gerektirmemelidir. Türleri değişken adına göre tanımlamaya ihtiyaç duyduğunuzda kodunuz çok uzun. Daralt'ı-refactor.


Size bir şey söylemiyor çünkü "kod" değil, yalıtılmış bir değişken bildirimi. Bir "sınıf" veya "klass" çok iyi bilmeniz gereken her şeyi söyleyebilir. Örneğin, genel bir yöntem bir Class<T>parametre alabilir ve bu mantıklı olabilir. Bu yüzden bir kod kokusu olduğunu kabul etmiyorum.
Andres F.

5

Şahsen, kod stiliniz için mükemmel bir seçenek olduğunu düşünüyorum.

Onlar ayrılmış kelimelerdir, bu nedenle derleyicinin dil-mekanik mi yoksa değişkeni mi istediğine karar vermesi gerekmez. Bunu akılda tutarak, insanların ayrılmış bir kelime gibi bir değişkene ihtiyaç duymalarını beklediklerini ima eder .

JDK 1.6 R21 ile gelen kaynağın içinden geçerken, 917 "clazz" oluşumunu buldum. Görünüşe göre kabul edilebilir bir tarz olduğunu düşünüyorlardı.

Ekibiniz bu konuda ne düşünüyor? Kötü olduğunu düşünüyorsanız, ancak ekibinizdeki diğer 9 kişi bunun iyi olduğunu düşünüyorsa, mermiyi ısırmanız ve kabul etmeniz gerekir. Neyin iyi neyin iyi olmadığı hakkında bir iletişim olduğu sürece ve onları gördüğünüz gibi gördüğünüz sorunları gündeme getirdiğiniz sürece, sorun değil.

Ekibinizin kod stili hakkında ne düşündüğü benim görüşümden veya bu yazıdaki başkasının görüşünden daha önemli . Bu ve sahip olabileceğiniz diğer kod tarzı kararları için de geçerlidir.


1
Doğru, ama sonunda takımın değişecek. Yolun aşağısında uzun yıllar, kodunuzda klasses ve küfürlerle dolu ve "WTF!" Diyen zavallı bir adam olacak.
MrFox

4
Her ikisini de kullanıyorsanız klassve clazzbu kötü bir şey. Tutarlı olmanız gerekiyor, bu yüzden sadece bir kez öğrenmek zorundalar. İdeal olarak da bu, takım stili kurallarında da belirtildiği için sürpriz değil.
corsiKa

Kod sadece ekibinizdeki insanlar için değil, dünyanın geri kalanının da okuması için yazılmıştır. Ekibiniz uçurumdan geçen bir otobüste olduğunda, başka biri kodu okumaya başlar. Değişkenin ne olduğunu tam ve kesin olarak tanımlayan, temsil ettiği şekli değil, adları kullanın.
Rob K,

1
Hayır, sadece hayır. Takımın uzak, üyelerini zaman içinde yavaşça döndürme olasılığı çok daha fazla. Bir kişinin otobüse çarpmasını planlayabilirsiniz, ancak tüm ekibinizin otobüse çarpmasını planlayamazsınız. Çoğu kod, kod incelemesi sırasında yarısı okuması gereken bir düzine insan için yazılmıştır.
corsiKa

4

Ayrılmış sözcüklerden kaçınmak için kasıtlı yanlış yazımlar kötü bir fikirdir.

  • Yazım hatalarını doğru yazımdan ayırt etmek zordur, bu nedenle kodu okumayı zorlaştırır.

  • Yazım hatalarını hatırlamak zordur, bu nedenle bazı tutarsız yazım hatalarının kod içinde rekabet etmesi muhtemeldir; bu da kod yazmayı zorlaştırır ve okumayı zorlaştırır.

  • Ayrılmış kelimeler, sorunu çözmek için kullanılan problemi değil, sorunu çözmek için kullanılan dili ifade eder. Bir değişken ismi, problemle ilgili bir kavramı işaret etmelidir.

Bu nedenle , ayrılmış kelimeyi aşağıdaki gibi nitelemek için alternatif, açıklayıcı bir isim seçmek veya tatmin edici bir alternatif yoksa, aşağıdakilerden daha iyidir :

public static Method findBenchmarkMethod(BenchmarkRecord benchmark) {
    Class<?> benchmarkedClass = ClassUtils.loadClass(benchmark.generatedClass());
    return findBenchmarkMethod(benchmarkedClass, benchmark.generatedMethod());
}

3

Class clazz"İyi bir isim bulmaya çalışmıyorum" gibi kokuyor. Bir değişken her zaman bir şeyi temsil eder ve iyi bir isim bunu açıklar. clazzÖrneğin, her koşulda mümkün olan en iyi isim olduğunu hayal etmeyi reddediyorum . Bir sınıfa başvuru mu -> class_reference, bir sınıf nesnesinin bir kopyasıdır -> class_copy, vs.

java.lang.SecurityManager.checkMemberAccess(Class<?> clazz, int which)
Parameters
    clazz -- the class that reflection is to be performed on.

Clazz, kontrolün gerçekleştirileceği hedef sınıftır.

checkMemberAccess(Class<?> target, int which)

parametrenin ne için kullanıldığını çok daha iyi tarif ederdi.


IMHO daha iyi değil, buna 'classToBeAccessed' veya her neyse diyebilirsiniz, ancak daha açıklayıcı bir ad açıkça görülür. Uzun isimleri ancak yararlı bilgiler sağlarlarsa severim.
maaartinus

1
classToBeAccessedgerçekten iyi bir isim ( classToBeCheckedbelki de daha iyi olurdu).
hlovdal,

1

Bir değişken için ayrılmış bir ad kullanıyorlarsa, kötü adlandırılmış bir değişkendir. Sınıf yazılımı için Sınıf gibi meşru bir isim olsa bile.

Kötü adlandırılmış değişkenler, kötü düşünülmüş veya geçici kodun bir işaretidir - koruduğunuz Yazılım Parçası'ndaki diğer sonuçlara dikkat edin.


0

Kasten yanlış yazımların veya kısaltmaların, dikkatli ve tutarlı bir şekilde kullanılması halinde iyi bir fikir olduğunu düşünüyorum .

Java'da düşünün:

class X { public X() { } }
X x = new X();
x.getClass;  // Wha?  How does "get" help anything?
x.class;     // Best, but requires more lexer/parser work
x.klass;     // At least as good as getClass
x.clazz;     // Same

Yazım yanlışlarını kullanmanın yeri, ayrılmış sözcüğün iş için en iyi kelime olduğu yerdir. İki yer vardır değil sen için cazip olabilir yazım hatalarını kullanmak.

  1. İyi bir isim düşünmek istemezsin
  2. Sen sadece sahte bir değişken istiyorsun ve tanımlayıcı bir isme ihtiyacı yok

İlk durumda, tembelliğin nadiren kalite kodu oluşturmak için iyi bir politika olduğu açıktır. İkinci durumda, gerçekten kısa bir değişken seçin. Matematikçiler her zaman böyle yaparlar ve programcılar endeksler için yaparlar. Eğer gerçekten sadece bir kukla değişken ise, bunu endeksler için yapmanızla sınırlamak için hiçbir neden yoktur:

boolean isMyName(String testName) { return myName.equals(testName); }
boolean isMyName(String s) { return myName.equals(s); }

Date nextMeeting(Klass klass) { return /* something */ }
Date nextMeeting(Klass k) { return /* something */ }

Kodun metodu veya yapısı size ne olması gerektiğini söylerken kısa değişken isimlerinde hiçbir şey kaybetmezsiniz.


2
Üzgünüm, aynı fikirdeyim. NextMeeting tam olarak nasıl çalışır? Mantık belirsiz. Kodunuzu her okuduğumda Klass'in tanımına bakmam için beni zorluyorsunuz çünkü isim anlamsız. Bunun yerine nextMeeting (MeetingRoom meetingRoom) 'a sahip olsaydınız, okumak ve dolayısıyla daha üretken olmak için daha az bir sınıf (klass? Clazz?) Tanımı olurdu. Kod yazılmışdan çok daha fazla okunur.
MrFox

@suslik - nextMeeting(MeetingRoom r)bol miktarda var. Ne var meetingRoomorada almak? Eğer ti nextMeeting(int meetingRoom)anlayabilseydim, ama amacım bu bilgiyi başka kaynaklardan zaten temin ettiğinde kısa değişken isimleri kullanmaktı .
Rex Kerr

Benim yazım Klass'in kod tabanında bulunması hakkında daha fazla şeydi. Bazen kısa değişken isimleri ile aynı fikirdeyim, ancak yöntemleriniz uzadıysa ve "r" nin bir MeetingRoom olduğundan emin olmak için sürekli çalışmaya devam etmem gerekiyor, o zaman bu da harika değil. Toplantı odasının olumsuz tarafının ne olduğunu merak ediyorum. Yatay alan? Yazmak için çok mu uzun?
MrFox

@suslik - Evet, uzun değişken isimleri ile yatay bağlamı kaybedersiniz. Dikey bağlamı uzun yöntemlerle kaybedersiniz, bu yüzden bunlardan kaçınmaya çalışmak en iyisidir (ancak yine de yaparsanız, muhtemelen değişken adlarınızın daha iyi hatırlatıcılar olmasını istersiniz). ayrılmış bir kelime olduğundaKlass bir alternatifti . Orijinal yazım olduğunda, yazım hatası yapmayı önermiyorum!
Rex Kerr

0

Class klassDüşüncelerinizi yaparken Classsınıfın bir örneği ile çalıştığınız meşru kullanımları gördüm .


2
Soru, bir örneğinizin olduğu herhangi bir durumun olup olmadığı değil, o hecelemeyi kullanmanız gerekip gerekmediği gibi, userClassveya başka bir seçenek gibi daha açıklayıcı bir isim olup olmadığıdır .
Nicole

2
Böyle bir durumda ben tercih ediyorum classInstanceüzerinde klass.
Konrad Morawski

2
@KonradMorawski: Ama birlikte çalıştığınız tüm nesneler örneklerdir, bu yüzden classInstancefazlalık olur. Dahası, bunun gibi bir şey hayal edebiliyorum class klass; Object classInstance = klass.newInstance;.
maaartinus

0

Sık sık, daha iyi veya daha kötüsü için ayrılmış sözcükler haline gelen, genel kelimelerin kasıtlı yanlış hecelemelerini içeren bir kod görüyorum:

klass veya clazz sınıfı için: Class clazz = ThisClass.class

SQL'de sayım için kount: count (*) AS kount

Şahsen ben bu okunabilirliği azaltır buluyorum. Kendi uygulamamda, daha iyi bir ismin kullanılamadığı pek fazla vaka bulamadım - itemClass veya recordTotal.

Ancak, yardım edemem o kadar yaygın ki tek kişi ben miyim acaba? Herkes bu uygulama hakkında saygı duyulan programcıların önerilerini ve hatta daha iyi alıntılarını yaptı mı?

Yerel değişkenler ve biçimsel argümanlar için önemli değil.

Herhangi bir isim, kasıtlı olarak yanıltıcı veya rahatsız edici şekilde rahatsız edici olmadığı sürece iyidir. Örnekte:

public static Method findBenchmarkMethod(BenchmarkRecord benchmark) {
    Class<?> clazz = ClassUtils.loadClass(benchmark.generatedClass());
    return findBenchmarkMethod(clazz, benchmark.generatedMethod());
}

Tek bir yerel değişkenin "clazz" veya "klass" veya "cls" veya basitçe "c" olup olmadığı önemli değildir. Muhtemelen sadece ifadenin satır içi olur:

return findBenchmarkMethod(ClassUtils.loadClass(benchmark.generatedClass()),
                           benchmark.generatedMethod());

Bir değişken adının uzunluğu değişkenin kapsamı ile ilgili olmalıdır. Kısa metodlardaki yerel değişkenler için (ve hepsi kısa olmalıdır), çok kısa isimler iyi.


satır içi yanlış görünüyor ClassUtils.loadClass(benchmark.generatedClass())=> benchmark.generatedClass()- ClassUtils.loadClassyol boyunca kaybolmuş
gnat

0

Yanlış yazımların her zaman kötü bir fikir olduğunu düşünüyorum. Sadece okuyucularınız için hoş değil. Birincisi, kelimeyi gördüğümde bir şeyleri özleyip özlemediğimi merak ediyorum klass. (Kast ettiler classmi, korsan mı demek istediler?) En azından benim için tanıdığım tüm yazım hataları rahatsız edici.

Rezerve edilen kelimenin gerçekten değişken hakkında bilinen tek önemli şey olduğu çok az durumda, aşağıdaki alternatifleri kullanırdım:

  • Eğer bir işlev argümanı ise, aClassyerine kullanın class.

  • Yerel veya üye bir değişkense, myClassyerine kullanın class.

  • Bir erişimci ise, getClass()yerine kullanın class().

Tabii ki, eklenen önek oldukça anlamsız ve sonuç olarak yalnızca son çare olarak kullanılmalıdır. Ancak en azından okuyucunuzun zihinsel ayrıştırıcısına müdahale etmiyor ve ayrılmış sözcüklerden kaçınmanın güvenli bir yoludur.


0

Yaratıcı yazımın bir yararı, daha iyi arama yeteneğidir. Benzersiz kodlar için tam kod araması yapmanın, sık sık yanlış şeyleri bulacağınız ortak kelimelerden ve 1000 tanesinden daha kolay olduğunu düşünüyorum. Örnek olarak, ben kzpg.com'un sahibiydim. Google şimdi ve sadece birkaç isabet göreceksiniz. Bu benzersiz ve bu nedenle çok kolay.

Ancak bir ölçüye göre bu sorunun maddeden ziyade bir görüş olduğunu düşünüyorum. Ben şahsen Forth'da büyüdüm, her şey sözlerle ilgiliydi ve birçoğu. Biri parmaklarını kurtarmak için çok yaratıcı olmayı öğrendi. Sonunda kaynak tabanımda az çok 640.000 karakter vardı. Yani kelimeleri kısa tutmak, işin yapılması için önemliydi.


Bu bağlantı şimdi bozuldu.
Peter Mortensen
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.