25 август 2025

Ninja kodi

O’ylamasdan o’rganish mehnatni yo’qotadi; o’rganmasdan o’ylash xavfli.

Konfutsiy

O’tmishdagi dasturchi ninjalar ushbu hiyla-nayranglardan foydalanib, kod saqlovchilarning ongini charxlashdi.

Ishga qabul qilish uchun dastruchi gurusi test topshiriqlarida ulardan foydalanishni diqqat bilan izlaydi.

Boshlang’ich dasturchilar ba’zan ularni dasturchi ninjalardan ham yaxshiroq foydalanadilar.

Ularni diqqat bilan o’qing va kimligingizni bilib oling – ninja, boshlang’ich dasturchi yoki kod gurusi?

Ironiya aniqlandi

Ko’pchilik ninja yo’llaridan yurishga harakat qiladi. Muvaffaqiyatli bo’lganlar oz.

Qisqalik aqlning ruhidir

Kodni iloji boricha qisqa qiling. O’zingizni qanchalik aqlli ekanligingizni ko’rsating.

Nozik til xususiyatlari sizga yo’l bo’lsin.

Masalan; misol uchun, uchlik operatorga, bir ko’z tashlang '?':

// taniqli javascript kutubxonasidan olingan
i = i ? (i < 0 ? Math.max(0, len + i) : i) : 0;

Ajoyib, to’g’rimi? Agar siz shunday yozsangiz, ushbu satrga duch kelgan va i ning qiymati nima ekanligini tushunishga harakat qilgan dastruchi quvnoq vaqt o’tkazishini aytadi. Keyin javob izlab huzuringizga keladi.

Qisqasi har doim yaxshiroq ekanligini ularga ayting. Ularni ninja yo’llariga boshlang.

Bir harfli o’zgaruvchanlar

Kim biladi – gapirmaydi. Kim aytadi – bilmaydi.

Laozi (Tao Te Ching)

Tezroq kodlashning yana bir usuli – hamma joyda bitta harfli o’zgaruvchan nomlardan foydalanish. a, b yoki c kabi.

Qisqa o’zgaruvchi kodda o’rmondagi haqiqiy ninja singari yo’qoladi. Hech kim uni muharrirning “qidiruvi” yordamida topa olmaydi. Va hatto kimdir buni tushungan taqdirda ham, u a yoki b ismlari nimani anglatishini “hal qila olmaydi”.

…Ammo istisno mavjud. Haqiqiy ninja hech qachon i ni hisoblagich sifatida for tsiklda foydalanmaydi. Har qanday joyda, lekin bu yerda emas. Atrofga nazar sol, yana ko’plab ekzotik harflar bor. Masalan, x yoki y.

Ekzotik hisoblagich sifatida ekzotik o’zgaruvchan ayniqsa ajoyib bo’ladi (agar iloji bo’lsa, uni uzoqroq qiling), agar tsikl tanasi 1-2 sahifani tashkil etsa. Agar kimdir tsiklning ichiga chuqur qarasa, u tezda x nomli o’zgaruvchanning tsikl hisoblagichi ekanligini aniqlay olmaydi.

Qisqartmalardan foydalaning

Agar jamoa qoidalari bitta harfli va noaniq nomlardan foydalanishni taqiqlasa – ularni qisqartiring, qisqartirishlardan foydalaning.

Shunday:

  • listlst.
  • userAgentua.
  • browserbrsr.
  • …va h.k

Bunday nomlarni chindan ham yaxshi sezgi egasi anglay oladi. Hamma narsani qisqartirishga harakat qiling. Faqatgina munosib odam sizning kodingizni ishlab chiqishni qo’llab-quvvatlashi kerak.

Ismni tanlashda mavhum bo’ling.

Buyuk kvadrat burchaksiz
Eng yaxshi vaza butun hayot shakllantiriladdi,
Baland musiqani eshitish mumkin emas,
Buyuk tasvirning shakli yo’q.

Laozi (Tao Te Ching)

Ism tanlashda eng mavhum so’zdan foydalanishga harakat qiling. obj, data, value, itrem, elem va boshqalar.

  • O’zgaruvchan uchun ideal nom bu data. Uni iloji boricha hamma joyda ishlating. Darhaqiqat, har bir o’zgaruvchanlarda ma’lumotlar saqlanadi, to’g’rimi?

    …Agar data allaqachon olingan bo’lsa, nima qilish kerak? value ni sinab ko’ring, u ham universaldir. Axir o’zgaruvchan oxir oqibat qiymat oladi.

  • O’zgaruvchani turiga qarab nomlang: str, num

    Ularni sinab ko’ring. Yosh tashabbuskor hayron bo’lishi mumkin – bunday nomlar ninja uchun haqiqatan ham foydalimi? Albatta!

    Albatta, o’zgaruvchanning nomi hali ham nimanidirni anglatadi. Bu o’zgaruvchanning ichida nima borligini aytadi: matn, raqam yoki boshqa narsa. Tashqaridan kelgan kishi kodni tushunishga harakat qilganda, aslida umuman ma’lumot yo’qligini ko’rib hayron bo’ladi! Va oxir-oqibat sizning yaxshi o’ylangan kodingizni o’zgartira olmaydi.

    Koddagi nosozliklarni tuzatuvchi orqali qiymat turini topish oson. Ammo o’zgaruvchanning ma’nosi nima? U qaysi matni/raqamni saqlaydi?

    Kod ustida uzoq meditatsiya qilmasdan, bu kodni chuna ololmaysiz!

  • …Ammo endi bunday nomlar qolmasa nima bo’ladi? Raqam qo’shing: data1, item2, elem5

Diqqatlik testi

Sizning kodingizni faqat chindan ham diqqatli dasturchi tushunishi kerak. Ammo buni qanday tekshirish kerak?

Ulardan biri – date va data kabi o’xshash o’zgaruvchanlar nomlaridan foydalaning.

Imkoningiz bor joyda ularni aralashtiring.

Bunday kodni tez o’qish imkonsiz bo’lib qoladi. Xato bo’lsa … Ummm … Biz uzoq vaqtga tiqilib qoldik, choy tayyorlasayam bo’ladi.

Aqlli sinonimlar

Eng qiyin narsa – qorong’i xonada qora mushukni topishdir, ayniqsa agar u yerda mushuk bo’lmasa.

Konfutsiy

Bir xil narsalarga o’xshash nomlardan foydalanish hayotni yanada qiziqarli qiladi va jamoatchilikka ijodingizni namoyish etadi.

Masalan, funktsiya prefikslarini ko’rib chiqing. Agar funktsiya ekranda xabarni ko’rsatsa – uni displayMessage kabi display... bilan boshlang. Va agar boshqa funktsiya ekranda foydalanuvchi nomi kabi yana bir narsani ko’rsatsa, uni show... bilan boshlang (showName kabi).

Bunday funktsiyalar o’rtasida juda katta farq borligini tasavvur qiling, ammo farq yo’q bo’lsa.

Jamoadagi boshqa ninjalar bilan shartnoma tuzing: agar Elbek o’z kodida display... bilan funktsiyalarni “ko’rsatishni” boshlasa, unda Oybek render... va Aziza – paint... ni ishlatishi mumkin. Kod qanchalik qiziqarli va xilma-xil bo’lganiga e’tibor bering.

…Va endi xet-trik!

Muhim farqlarga ega ikkita funktsiya uchun – bir xil prefiksdan foydalaning!

Masalan, printPage(page) funktsiyasi printerdan foydalanadi. Va printText(text) funktsiyasi matnni ekranga chiqaradi. Noma’lum o’quvchi shu kabi nomlangan printMessage funktsiyasi haqida o’ylab ko’rsin: “Bu xabarni qayerga chiqaradi? Printerda yoki ekranda?”. Buni chindan ham porlashi uchun printMessage(message) uni yangi oynada chiqarishi kerak!

Nomlarni qayta ishlatish

Butun , qismlarga bo’linganda
nomlar kerak.
Nomlar allaqachon yetarli.
Qachon to’xtashni bilish kerak.

Laozi (Tao Te Ching)

Yangi o’zgaruvchanni faqat o’ta zarurat bo’lganda qo’shing.

Buning o’rniga mavjud nomlarni qayta ishlating. Ularga faqat yangi qiymatlarni yozing.

Funksiyada faqat parametr sifatida berilgan o’zgaruvchanlardan foydalanishga harakat qiling.

Bu o’zgaruvchanda hozir nima borligini aniqlashni qiyinlashtirishi mumkin. Va bu qayerdan kelib chiqqanligi. Intuitivligi zaif odam kodni satrma-bosqich tahlil qilishi va har bir kod bo’limi orqali o’zgarishlarni kuzatishi kerak boladi.

Yondashuvning ilg’or varianti – bu qiymatni tsikl yoki funktsiya o’rtasida yashirin ravishda (!) almashtirish.

Masalan:

function ninjaFunction(elem) {
  // elem bilan ishlaydigan 20 ta kod satri

  elem = clone(elem);

  // yana 20 ta qator, endi elem kloni bilan ishlaydi!
}

Funktsiyaning ikkinchi yarmida elem bilan ishlashni istagan boshqa dasturchi hayron qoladi … Faqat koddagi nosozliklarni tuzatish paytida, kodni o’rganib chiqib, ular klon bilan ishlashayotganini bilib olishadi!

Ushbu texnikani muntazam ravishda kodda ko’rdik. Tajribali ninjaga qarshi ham samarali.

O’yin-kulgi uchun pastki chiziqlar

O’zgaruvchan nomlardan oldin _ va __ pastki chiziqlarini qo’ying. _name yoki __value kabi. Agar faqat siz ularning ma’nosini bilsangiz juda yaxshi bo’lar edi. Yoki yaxshiroq, ularni faqat o’yin-kulgi uchun qo’shing, umuman ma’lum ma’noga ega bo’lmasdan. Yoki turli joylarda turli xil ma’nolar sifatida qo’shing.

Siz bitta o’q bilan ikkita quyonni o’ldirasiz. Birinchidan, kod uzunroq va qiyin o’qiladigan bo’lib qoladi, ikkinchidan, boshqa dasturchi pastki chiziqlar nimani anglatishini aniqlash uchun uzoq vaqt sarf qilishi mumkin.

Aqlli ninja pastki chiziqlarni kodning bir joyiga qo’yadi va boshqa joylarda qo’shishdan qochadi. Bu kodni yanada nozik qiladi va kelajakdagi xatolar ehtimolini oshiradi.

Sevgingizni ko’rsating

Hamma sizning subyektlaringiz qanchalik ajoyibligini ko’rsin! superElement, megaFrame va niceItem kabi nomlar o’quvchini ravshanlashtiradi.

Darhaqiqat, bir tomondan, bir narsa yozilgan: super..., mega..., nice.... Ammo boshqa tomondan – bu tafsilotlarni keltirib chiqarmaydi. O’quvchi yashirin ma’no izlashga qaror qilishi va bir-ikki soat davomida mulohaza yuritishi mumkin.

Tashqi o’zgaruvchanlarni bir-biriga bog’lab qo’ying

Nurda bo’lganingizda, zulmatda hech narsa ko’rmaysiz.
Zulmatda bo’lganingizda, hamma narsani nurda ko’rishingiz mumkin.

Guan Yin Zi

Funktsiya ichidagi va tashqarisidagi o’zgaruvchanlar uchun bir xil nomlardan foydalaning. Oddiy. Hech qanday harakat talab etilmaydi.

let user = authenticateUser();

function render() {
  let user = anotherValue();
  ...
  ...bir nechta satrlar...
  ...
  ... // <-- dasturchi bu yerda foydalanuvchi bilan ishlashni xohlaydi va ...
  ...
}

render ichiga sakrab tushgan dasturchi, ehtimol tashqi foydalanuvchini soya qilingan ichki user mavjudligini sezmaydi.

Keyin ular tashqi o’zgaruvchanni, authenticateUser() natijasini hisobga olib, user bilan ishlashga harakat qilishadi… Tuzoq paydo bo’ldi! Salom, koddagi nosozliklarni tuzatuvchi…

Hamma joyda yon ta’sir mavjud!

Hech narsani o’zgartirmaydiganga o’xshash funktsiyalar mavjud. IsReady(), checkPermission(), findTags() … Ular hisob-kitoblarni amalga oshirishlari, ma’lumotlarni topishlari va ulardan tashqarida hech narsa o’zgartirmasdan qaytarishlari kerak. Boshqacha qilib aytganda, “yon ta’sirlarsiz”.

Haqiqatan ham ajoyib hiyla – bu ularga asosiy vazifadan tashqari, “foydali” harakatlarni qo’shishdir.

Funktsiya is.., check.. yoki find... deb nomlangan bo’lib, ijro etganda biror qiymatni o’zgartirsa, sizning hamkasbingizning dunyo qarashi juda kengayadi!

Ajablanishning yana bir usuli – nostandart natijani qaytarish.

O’zingizning asl fikringizni ko’rsating! checkPermission chaqiruvi true/false emas, balki tekshirish natijalarini murakkab obyektga qaytaring.

If(checkPermission(..)) yozishga urinayotgan dasturchilar, nima uchun u ishlamayapti, deb hayron bo’lishadi. Ularga ayting: “Hujjatlarni o’qing!”. Va ushbu maqolani bering.

Kuchli funktsiyalar!

Dao hamma joyda va hamma narsada,
ham chapda, ham o’ngda.

Laozi (Tao Te Ching)

Funktsiyani uning nomiga yozilgan narsalar bilan cheklamang. Kengroq bo’ling.

Masalan, validateEmail(email) funktsiyasi (elektron pochtani to’g’riligini tekshirishdan tashqari) xato xabari ko’rsatishi va elektron pochtani qayta kiritishni so’rashi mumkin.

Qo’shimcha harakatlar funktsiya nomidan aniq bo’lmasligi kerak. Haqiqiy ninja kodlovchi ularni koddan ham ko’rinmas qiladi.

Bir nechta amallarni birlashtirish sizning kodingizni qayta ishlatishdan himoya qiladi.

Tasavvur qiling, boshqa dasturchi faqat elektron pochtani tekshirishni istaydi va hech qanday xabar chiqarmashini. Sizning funktsiyangiz validateEmail(email) ikkalasini ham qiladigan ularga mos kelmaydi. Shunday qilib, ular bu haqda hech narsa so’rab, sizning meditatsiyangizni buzmaydi.

Xulosa

Yuqoridagi barcha “maslahatlar” haqiqiy koddan olingan … Ba’zan tajribali dasturchilar tomonidan yoziladi. Ehtimol sizdan ham tajribali ;)

  • Ulardan ba’zilariga amal qiling, shunda kodingiz kutilmagan hodisalarga boy bo’ladi.
  • Ularning ko’pchiligiga amal qiling, shunda kodingiz sizniki bo’ladi, hech kim uni o’zgartirishni xohlamaydi.
  • Barchasini amal qiling, shunda sizning kodingiz ma’rifatni izlayotgan yosh dasturchilar uchun qimmatli dars bo’ladi.
O'quv qo'llanma xaritasi

Izohlar

izoh berishdan oldin buni o'qing…
  • Agar sizda nimani yaxshilash kerakligi haqida takliflaringiz bo'lsa - iltimos, GitHub muammosini yuboring yoki izoh berish o'rniga so'rov yuboring.
  • Agar siz maqolada biror narsani tushunolmasangiz - iltimos, batafsilroq ma'lumot bering.
  • Bir nechta so'z so'zlarini kiritish uchun <code> yorlig'ini ishlating, bir nechta satrlar uchun - ularni <pre> yorlig'i bilan o'rab qo'ying, 10 satrdan ortiq bo'lsa - sandbox (plnkr, jsbin, codepen…)