27 Eylül 2022

Ninja Kodları

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.

İroni tespit edildi!

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.

Laozi (Tao Te Ching)

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:

  • listlst.
  • userAgentua.
  • browserbrsr.
  • …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.

Laozi (Tao Te Ching)

Bir isim seçerken en soyut kelimeyi kullanmaya çalışın. obj, data, value, item, elem gibi.

  • Kusursuz değişken ismi data nerede isterseniz kullanın. Gerçekten de tüm değişkenler data tutmuyorlar zaten, değil mi?

    …Fakat ya data daha önce alındıysa? value kullanabilirsiniz. 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, elem5 gibi.

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.

Confucius

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.

Laozi (Tao Te Ching)

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.

Guan Yin Zi

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.

Laozi (Tao Te Ching)

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.
Eğitim haritası