Ninja programcıların eskiden bu kurnazlıkları yaparak kodu tekrardan düzenleyenleri aÄlatırlardı. Kod guruları bu kodları anca test yazarak kontrol edebilirdi. Yeni kod yazmaya baÅlayanlar bazen daha iyi kullanabilirler.
Dikkatlice oku ve hangisisin bul bakalım â ninja, çaylak, veya kod eleÅtirmeni.
Bu kodlar kötü yazıma örnektirler.!!!
Ãzlük aklın ruhudur!
Kodunuzu olabildiÄince kısa tutmalısınız. Bu sizin ne kadar zeki olduÄunuzu gösterir!
ÃrneÄin aÅaÄıdaki '?' kullanımına bakın:
// meÅhur bir javascript kütüphanesinden.
i = i ? i < 0 ? Math.max(0, len + i) : i : 0;
Harika deÄil mi? EÄer böyle yazarsanız, daha sonra gelen programcı bu satıra bakar ve i nin ne olduÄunu ve ne yapmaya çalıÅtıÄınızı anlamak için uÄraÅır. Sonra size cevap almaya gelir.
Ona kısa yazmanın her zaman daha iyi olduÄunu söyleyin. Sizin yolunuza yani Ninja yoluna çekmeye çalıÅın!
Tek harf deÄiÅkenler
Dao kelimesizlikte saklıdır. Sadece Dao doÄru baÅlamıÅtır ve doÄru biter.
DiÄer bir Åekilde daha hızlı ( ve daha beter!) kod yazma yöntemi de tek-harfli deÄiÅkenler kullanmaktır. ÃrneÄin a,b ve c gibi.
Kısa deÄiÅken isimleri kodun içerisinde aynen bir ninjanın ormanda kaybolduÄu gibi kaybolurlar. Kimse onları âarayarakâ bulamaz. Hatta birisi bulsa bile ne olduÄunu çözemez
â¦. Fakat bir istisna var. Gerçek ninja hiçbir zaman for döngüsünde sayaç için i kullanmaz. Her yerde kullanır ama orada kullanmaz. Biraz kurcalayın daha çok garip harf var. ÃrneÄin x veya y gibi.
Garip deÄiÅkenler eÄer döngü gövdesi 1-2 sayfaysa daha harika olurlar. ( olabildiÄince uzun olsun). EÄer birisi daha derinlemesine bakarsa, kolayca x in döngü sayacı olduÄunu anlayamasın.
Kısaltmalar kullan
EÄer takım tek karakter veya garip kelimeler kullanmanızı engelliyorsa sizde kısaltmalar kullanın
örneÄin:
listâlst.userAgentâua.browserâbrsr.- â¦etc
Sadece gerçekten iyi sezgilere sahip olanlar ne demek istediÄinizi anlayacaklar. Her Åeyi kısaltın. Sadece sizi anlayabilen insanlar sizin kodunuzu geliÅtirmeye layıktırlar.
Yükseklere çıkın, soyutlaÅın.
Mükemmel karenin köÅeleri yoktur
Mükemmel gemi en son inÅa edilendir,
Harika nota karmaÅık olandır,
Harika görselin belirli bir formu yoktur.
Bir isim seçerken en soyut kelimeyi kullanmaya çalıÅın. obj, data, value, item, elem gibi.
-
Kusursuz deÄiÅken ismi
datanerede isterseniz kullanın. Gerçekten de tüm deÄiÅkenler data tutmuyorlar zaten, deÄil mi?â¦Fakat ya
datadaha önce alındıysa?valuekullanabilirsiniz. O da genel bir tanım. En nihayetinde tüm deÄiÅkenler bir value alır deÄil mi? -
DeÄiÅkeni tipi ile tanımlayın:
str,num⦠Bir defa deneyin. Genç ninjanın aÄzı açık kalsın â böyle isimler gerçekten de kodu kötü mü yapar? Evet!Bir taraftan deÄiÅken isimleri hala bir Åey ifade ediyor. DeÄiÅkenin içinde ne var bunu söylüyor: karakter, sayı veya baÅka bir Åey. Fakat dıÅından baÅkası kodu anlamaya çalıÅtıÄında, ÅaÅıracak ve aslında hiçbir bilgi olmadıÄını anlayacak
Gerçekten de deÄerin tipi hata ayıklarken kolayca bulunabilir. Fakat ya anlamı? Hangi karakter veya sayıyı tutuyor? Bu sorunun cevabı anca iyi bir meditasyon ile bulunabilir!
-
â¦Peki artık bu deÄiÅkenlerden kalmadıysa? Tabii ki yanlarına sayı ekleyebilirsiniz:
data1, item2, elem5gibi.
Dikkat testi
Sadece gerçekten dikkatli programcılar kodu anlayabilmeli. Fakat bunu nasıl kontrol edebilirsiniz?
Bunlardan biri â benzer deÄiÅken isimleri kullanın date ve data gibi.
OlabildiÄince birbiri ile karıÅtırın.
KarıÅtırın ki kodu okuyan kiÅi kolayca okuyamasın. EÄer bir yazım hatası falan varsa, uzun bir süre takılmıÅsan, bir çay arası versin.
Zekice eŠanlamlı sözler kullanmak
Hepsinden zoru karanlık odada kara kediyi bulmak, hele bir de odada kedi yoksa.
Aynı Åeyler için birbirine yakın Åeyler kullanmak hayatı daha ilginç kılar ve sizin yaratıcılıÄınız topluma gösterme açısından iyi bir fırsattır.
ÃrneÄin, fonksiyon öneklerini kullanın. EÄer bir fonksiyon ekrana çıktı veriyorsa display_ ön eki ile baÅlayın. ÃrneÄin displayMessage. Sonrasında baÅka bir fonksiyonda ekrana yine bir Åey yazdırmak isterseniz bu defa show_ kullanın. ÃrneÄin showName
Bu fonksiyonlar için hiçbir farklılık olmasa da sanki farklılık varmıŠhissi yaratın.
DiÄer ninjalarla birleÅip: EÄer Ahmet ekranda yazı gösteren fonksiyona display.. ile baÅlıyorsa, Mehmet render.. ile baÅlasın, Mehtapta paint.. kullansın gibi kararlar verebilirsiniz. DüÅünün kod ne kadar da ilginç ve çeÅitli olur.
⦠ve Åimdi hatrick!!!
birbirinden farklı olan iki önemli fonksiyonu aynı önek ile kullanın.
ÃrneÄin, fonksiyon printPage(page) yazıcıyı kullansın. printText(text) ise ekrana yazdırsın. Diyelim ki sizin kodunuza aÅina olmayan bir okur bu iki fonksiyonun birbirine yakın isimleri olduÄundan karıÅtırabilir. printMessage âMesajı nereye yazdırmaktadır? Ekrana mı yoksa yazıcıya mı?â Daha da iÅi çıkmaza götürmek ve ustalıÄınızı belli etmek için printMessage(mesaj) kullanabilirsiniz. Bu da mesajı yeni pencerede göstersin.
İsimleri tekrar kullanın
Bütün taksim edildiÄinde, her
birinin isme ihtiyacı var.
Yeteri kadar isim var.
KiÅi ne zaman duracaÄını bilmeli.
Sadece çok gerekli olduÄunda yeni deÄiÅken ekleyin.
Bunun yerine, var olanı kullanın. Ona yeni deÄerler atayın
Fonksiyonda sadece paslanan deÄeri kullanmaya çalıÅın.
Bu gerçekten o deÄiÅkenin içinde Åu anda ne olduÄunu ve nereden geldiÄini anlamayı zor kılar. Az dikkatli birisi hepsinin üzerinden satır satır geçmeli ve her kod dalındaki deÄiÅikliÄi takip etmelidir.
Daha geliÅmiÅ bir yaklaÅım ise gizlice(!) bir döngü veya fonksiyon içindeki deÄiÅkenin deÄerini aynısı ile deÄiÅtirmek
ÃrneÄin:
function ninjaFonksiyonu(elem) {
// 20 satır elem ile çalıÅır
elem = clone(elem);
// sonraki 20 satır elemin klonuyla çalıÅır.
}
elem ile çalıÅmak isteyen yazılımcı dostunuz fonksiyonun ikinci bölümünde ÅaÅıracaktır. Sadece hata ayıklarken bunun farkına varabilir. Sonrasında bir de bakar ki aslında klonuyla çalıÅıyormuÅ
Ãlümcül derecede etkin bir yoldur. Hatta usta ninjalar bile bu olay karÅısında ÅaÅkınlık yaÅayabilirler.
EÄlence için alttan çizgi kullanmak.
DeÄiÅken isimlerinden önce alttan çizgi kullanın _, __ gibi. ÃrneÄin _isim veya __deger gibi. Bunun anlamını sadece siz biliyorsanız harika olur. Veya, daha iyisi, bunları eÄlencesine ekleyin. hiçbir anlamı olmasın. Farklı yerlerde farklı anlamlara gelsin.
Bir taÅla iki kuÅ vurdunuz. Ãnce kodu daha uzun ve daha az okunabilir yaptınız, ikinci olarak, yazılımcı dostunuzu tongaya düÅürerek alttan çizginin ne anlama geldiÄini bulması için uzunca bir süre uÄraÅmasını saÄladınız.
Zeki bir ninja bir yerde alttan çizgi kullanır, baÅka bir yerde kullanmaz. Böylece ileride kodu hataya hazır hale getirir.
AÅkınızı gösterin
Herkese varlıklarınızın (entity) ne kadar mükemmel olduÄunu gösterin. ÃrneÄin harikaElement, guzelAlert, cokAkilliNinja gibi isimlendirmeler kodunuzu okuyanları aydınlatacaktır.
Gerçekten de bir yandan super..., harika..., mega... gibi kullanmıŠfakat diÄer yandan hiçbir detay vermemiÅ olursunuz. Okuyucunun bunun altında yatan anlamı bulması için birkaç saat meditasyon yapıp hayatını sorgulaması gerekmektedir.
Global deÄiÅkenlerin veya dıÅtaki deÄiÅkenlerin üzerine baÅka deÄer yazın
IÅıktayken karanlıktaki hiçbir Åey görünmez
Karanlıktayken, aydınlıktaki her Åey görünür.
Fonksiyonun içinde ve dıÅında aynı deÄiÅken isimleri kullanın. Basit, fazladan efora hiç gerek yok!
let kullanici = kullaniciBilgisi();
function yaz() {
let kullanici = farkliBirFonksiyon();
...
...bir sürü satır...
...
... // <-- bir yazılımcı kullanici deÄiÅkeniyle çalıÅmak istiyor...
...
}
yaz fonksiyonunun içine bakan bir programcı muhtemelen, global kullanici deÄiÅkeninin üzerine yazan yerel bir kullanici deÄiÅkeni olduÄunu göremeyecektir.
Sonrasında dıÅta bulunan kullanici deÄiÅkenine bakacak ve kullaniciBilgisi fonksiyonunda bir yanlıŠolduÄu kanaatine varacak. Ver elini hata ayıklama!
Her yerde yan etki!
Bazı fonksiyonlar hiçbir Åey deÄiÅtirmiyormuÅ gibi görünür. ÃrneÄin hazirMi(), izinKontrol(), tagbul() gibi. Hesaplamaları yapıp veriyi geri döndürdüÄü ve bunun dıÅında bir deÄiÅiklik yapılmadıÄı tahmin edilsin. DiÄer bir deyiÅle âyan etkisiâ olmadıÄı.
En güzel kurnazlık bunlara kendi görevleri dıÅında âiÅe yararâ bir eylem yaptırın
İŠarkadaÅınızın yüzündeki ÅaÅkınlıÄı düÅünebiliyor musunuz? hazirMi,kontrolEt, bul... gibi fonksiyonlar bir Åeyleri deÄiÅtiriyor. Gerçekten de sınırları zorlayan bir yöntem.
Yine bir baÅka ÅaÅkınlık yaratacak yöntem ise standart olmayan bir sonuç döndürmek
Gerçekten ne düÅündüÄünüzü gösterin! izinKontrol mesela true/false dönmesin de daha karmaÅık bir obje dönsün.
Her kim ki if(checkPermission(..)) yazarsa neden çalıÅmadıÄını anlayamasın. Onlara âDökümantasyonu okuâ diyebilirsiniz. Sonra bu dosyayı ona verin.
Güçlü fonksiyonlar!
Büyük Tao her yerden akar,
saÄa ve sola.
Fonksiyonu ismiyle sınırlı tutmayın! Daha geniŠtutun.
ÃrneÄin, emailDogruluga(email) diye bir fonksiyon sadece bu emailâin doÄruluÄunu söylemesin, hata versin ve tekrardan email girilmesi gerektiÄini söylesin.
Ek eylemler fonksiyonun isminde kesinlikle belirtilmesin. Gerçek bir ninja programcı, kodda da bunları açık bir Åekilde belirtmeyecektir.
Birçok eylemi bir fonksiyona yazın ki kodun tekrardan kullanılmasını engelleyin
DüÅünün ki, diÄer yazılımcı sadece emailâi kontrol etmek istiyor ve ekrana çıktı vermek istemiyor. Sizin fonksiyonunuz emailDogrula(email) ve hem doÄruluk kontrolü yapıyor hem de ekrana hata çıktısı veriyor. Bundan dolayı size bu yazılımcının soracaÄı bir Åey olamaz. Siz zaten ikisini de yapmıÅsınız.
Ãzet
Yukarıda bulunan tavsiyeler gerçek kodlardan alınmıÅtır. Bazıları deneyimli geliÅtiriciler tarafından yazılmıÅtır. Belki de sizden bile deneyimli programcılardan ;)
- Tavsiyelerden bazılarını uygularsanız kodunuz tamamen sürprizlerle dolar.
- ÃoÄunu uygularsanız, kodunuz gerçekten de sadece size ait olur. Kimse deÄiÅtiremez.
- Hepsini uygularsanız aydınlanma arayıÅında olan genç geliÅtiricilere iyi bir ders vermiÅ olursunuz.
Yorumlar
<code>kullanınız, birkaç satır eklemek için ise<pre>kullanın. EÄer 10 satırdan fazla kod ekleyecekseniz plnkr kullanabilirsiniz)