Info:structure bobidan maâlum boâlganidek, sharhlar bitta satrli // va koâp satrli: / * ... * / boâlishi mumkin.
Odatda ularni kod qanday va nima uchun ishlashini tavsiflash uchun ishlatamiz.
Birinchi qarashdanoq, izohlar oson va aniq tuyulishi mumkin, ammo boshlangâich dasturchilar odatda uni notoâgâri qabul qilishadi.
Yomon izohlar
Boshlangâich dasturchilar âkodda nima boâlayotganiniâ tushuntirish uchun izohlardan foydalanadilar. Shunga oâxshash:
// Ushbu kod bu narsani (...) va (...) shu narsani qiladi
// ...va yana kim biladi nimani...
juda;
murakkab;
kod;
Ammo yaxshi kodda bunday âtushuntirishâ izohlarni miqdori minimal boâlishi kerak. Jiddiy ravishda, ularsiz kodni tushunish oson boâlishi kerak.
Bu borada ajoyib qoida mavjud: âagar kod shunchalik noaniq boâlib, u izohni talab qiladigan boâlsa, ehtimol uning oârniga uni qayta yozish kerakâ.
Yoânalish: kodni funktsiyaga kiriting
Baâzan kod qismini funktsiya bilan almashtirish foydali boâladi, masalan:
function showPrimes(n) {
nextPrime:
for (let i = 2; i < n; i++) {
// i bosh son ekanligini tekshiring
for (let j = 2; j < i; j++) {
if (i % j == 0) continue nextPrime;
}
alert(i);
}
}
Eng yaxshi variant â alohida isPrime funksiyasidan foydalanish:
function showPrimes(n) {
for (let i = 2; i < n; i++) {
if (!isPrime(i)) continue;
alert(i);
}
}
function isPrime(n) {
for (let i = 2; i < n; i++) {
if (n % i == 0) return false;
}
return true;
}
Endi biz kodni osongina tushunamiz. Funktsiyaning oâzi izohga aylanadi. Bunday kod oâzini oâzi tavsiflovchi deb nomlanadi.
Yoânalish: funksiyalarni yaratish
Va agar bizda shunday uzun âkod oqimiâ boâlsa:
// bu erda biz viski qo'shamiz
for (let i = 0; i < 10; i++) {
let drop = getWhiskey();
smell(drop);
add(drop, glass);
}
// bu erda biz sharbat qo'shamiz
for (let t = 0; t < 3; t++) {
let tomato = getTomato();
examine(tomato);
let juice = press(tomato);
add(juice, glass);
}
// ...
Bu funksiyalar yordamida uni qayta yozish yaxshiroq boâladi:
addWhiskey(glass);
addJuice(glass);
function addWhiskey(container) {
for (let i = 0; i < 10; i++) {
let drop = getWhiskey();
//...
}
}
function addJuice(container) {
for (let t = 0; t < 3; t++) {
let tomato = getTomato();
//...
}
}
Bu erda sharhlar ham kerak emas: funktsiyalar oâzlari nima qilishlarini aytishadi (agar siz ingliz tilini tushunsangiz). Va shuningdek, kod tuzilishi boâlinganda yaxshiroqdir. Har bir funktsiya nimani bajarishi, nimani talab qilishi va nimani qaytarishi aniq.
Aslida biz âtushuntirishâ izohlaridan butunlay qochib qutula olmaymiz. Murakkab algoritmlar mavjud. Va optimallashtirish uchun aqlli âtweaksâ lar mavjud. Ammo, odatda, biz kodni sodda va oâz-oâzini tavsiflovchi qilishga harakat qilishimiz kerak.
Yaxshi izohlar
Shunday qilib, tushuntirish izohlari odatda yomon. Qaysi izohlar yaxshi?
- Arxitekturasini tavsiflang
-
Komponentlarning yuqori darajadagi sharhini, ular qanday taâsir oâtkazayotganini, turli vaziyatlarda nazorat oqimining nima ekanligini⦠agar qisqacha boâlsa, qushning koâzidan kodni koârib chiqing. Kod arxitekturasini tushuntiruvchi diagrammalarni yaratish uchun maxsus UML tili mavjud. Bu, albatta, oârganishga arziydi.
- Funktsiyadan foydalanishni hujjatlashtiring
-
Funktsiyani hujjatlashtirish uchun JSDoc maxsus sintaksis mavjud: foydalanish, parametrlar, qaytarilgan qiymat.
Masalan:
/** * n-darajaga ko'tarilgan x ni qaytaradi. * * @param {number} x Ko'payishi kerak bo'lgan raqam. * @param {number} n Daraja, tabiiy son bo'lishi kerak. * @return {number} x n-darajaga ko'tarildi. */ function pow(x, n) { ... }Bunday izohlar funktsiya maqsadini tushunmasdan va uning kodiga qaramasdan uni toâgâri ishlatishga imkon beradi.
Aytgancha, WebStorm kabi koâplab tahrirlovchilar ularni ham tushunishlari mumkin va ularni avtomatik toâldirish va baâzi bir avtomatik kodlarni tekshirish uchun ishlatishlari mumkin.
Shuningdek, [JSDoc 3] (https://github.com/jsdoc3/jsdoc) kabi vositalar mavjud, ular izohlardan HTML-hujjatlarni yaratishlari mumkin. JSDoc haqida koâproq maâlumotni http://usejsdoc.org/ sahifasida oâqishingiz mumkin.
- Nima uchun vazifa shu tarzda hal qilinadi?
-
Yozilgan kod muhim. Ammo nima yozilganini tushunish uchun yozilmagan narsalar yanada muhimroq boâlishi mumkin. Nima uchun vazifa aynan shu tarzda hal qilinadi? Kod hech qanday javob bermaydi.
Agar vazifani hal qilishning bir necha yoâli mavjud boâlsa, unda nima uchun buni tanladingiz? Ayniqsa, sizning usulingiz eng aniq boâlmasa.
Izohlarsiz quyidagi holatlar sodir boâlishi mumkin:
- Siz (yoki sizning hamkasbingiz) bir muncha vaqt oldin yozilgan kodni ochasiz va uning âsuboptimalâ ekanligini koârasiz.
- Siz shunday deb oâylaysiz: âMen oâsha paytda qanday ahmoq edim va hozir qanchalik aqlliroqmanâ va âaniqroq va toâgâriâ variantidan foydalanib qayta yozasiz.
- â¦Qayta yozish istagi yaxshi edi. Ammo bu jarayonda âaniqroqâ yechim aslida yetishmayotganini koârasiz. Siz hatto nima uchun unday boâlganini xira eslaysiz, chunki siz buni allaqachon sinab koârgansiz. Siz toâgâri variantga qaytdingiz, ammo vaqt behuda ketdi.
Yechimni tushuntiradigan izohlar juda muhimdir. Ular rivojlanishni toâgâri yoâlda davom ettirishga yordam beradi.
- Kodning nozik xususiyatlari bormi? Ular qayerda ishlatiladi?
-
Agar kodda nozik va qarshi intuitiv narsa boâlsa, albatta izoh berishga arziydi.
Xulosa
Yaxshi dasturchining muhim belgisi bu izohlar: ularning mavjudligi va hatto yoâqligi.
Yaxshi sharhlar bizga kodni yaxshi saqlashga imkon beradi, vaqt oâtgach keyin unga qaytamiz va undan samarali foydalanamiz.
Bunga izoh bering:
- Umumiy arxitektura, yuqori darajadagi koârinish.
- Function usage.
- Muhim yechimlar, ayniqsa darhol aniq boâlmaganda.
Izohlashdan saqlaning:
- Bu âkod qanday ishlaydiâ va âu nima qiladiâ.
- Ularni faqat oddiy va oâzini oâzi tavsiflovchi kodni bajarish mumkin boâlmagan hollarda foydalaning, bu izohni talab qilmaydi.
Izohlar JSDoc3 kabi avtomatik hujjatlashtirish vositalari uchun ham qoâllaniladi: ularni oâqiydilar va HTML-hujjatlarni (yoki boshqa formatdagi hujjatlarni) yaratadilar.
Izohlar
<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â¦)