Boshqalar

Qanday qilib yaxshi kod yozish mumkin? Yangi mutaxassislar uchun tez natija beradigan 10 ta qulay usul

Boshlangʻich darajadagi dasturchi uchun kod yozish koʻnikmasini rivojlantirish eng yuqori darajadagi maqsad boʻlsa kerak. Lekin ishni nimadan boshlagan yaxshi? Hozirgi paytdagi bunday katta axborot oqimi bilan qanday texnikalarni oʻrganish afzalligi va ulardan qaysi biri chindan yaxshi kod yozishingizga yordam berishini bilish ham qiyin.

Ushbu blog postda yangi dasturchilar uchun hoziroq yaxshi kod yozishga yordam beradigan 10 ta qulay metod bilan boʻlishamiz.

 

Muhim xulosalar

  • Oldindan rejalashtiring: dasturlashga kirishishdan avval yondashuvingizni rejalashtirish uchun vaqt ajrating. Muammoni tushunish, uning kiruvchi va chiquvchi maʼlumotlari, shuningdek, ehtimoliy salbiy holatlarni tushunib olish anchagina vaqtingizni tejashi, kod sifatini yaxshilashi mumkin.
  • Aniq nomlash va modullikdan foydalaning: kodni oʻqish va tushunish yaxshiroq boʻlishi uchun oʻzgaruvchilar va funksiyalarni nomlashda aniq, tavsifiy nomlarni qoʻllang. Testdan oʻtkazish, debugging va keyinchalik qayta ishlatish oson boʻlishi uchun har kodni har bir faoliyatning alohida qismiga javob beradigan kichik modulli funksiyalarga boʻling.
  • Eng yaxshi tajribalardan foydalaning: takrorlanishlarning oldini olish uchun DRY prinsipiga amal qilish, maʼlumotlarning mos tizimlaridan foydalanish, murakkab mantiqiylikni tushuntirish uchun kodni izohlash, Git kabi versiyalarni nazorat qilish  va samarali hamkorlik tizimlaridan foydalanish kabi kodlashning tan olingan eng yaxshi tajribalarini qoʻllang. Bu metodlar nafaqat kod sifatini yaxshilaydi, balki barqarorlikni saqlab, jamoa ishini ham nazorat qilishni osonlashtiradi.

 

1. Rejadan boshlang

Yaxshi kod yozishning eng yaxshi usullaridan biri bu — ishni reja tuzishdan boshlash. Kod yozishni boshlashdan avval kod nima qilishi kerakligini oʻylash uchun bir necha daqiqa sarflang.

Nima qilishni bilaman deb oʻylayotganingiz uchun kod yozishni boshlab qoʻymang. Muammoning mohiyatini chindan ham tushunish uchun biroz vaqt ajrating.

  • Kirish va chiqishlar qanday boʻladi?
  • Qanday natija kutilyapti?
  • Birdan boshqasiga oʻtishda qanday qadamlar kerak boʻladi?
  • Qanday maʼlumotlar tuzilmasi kerak boʻladi?
  • Hisobga olinishi kerak boʻlgan holatlar mavjudmi?

Dasturlashga kirishishdan oldin bu savollarga javob berish sizni bir necha soat yoki kunlab boshi berk koʻchaga kirib qolishdan asraydi. Bu loyiha qanday ishlashi haqidagi xayoliy konsepsiyangizni mustahkamlash, oʻrinsiz xavotir gumonlarini tekshirish va ish jarayonida bajarganlaringizni testdan oʻtkazish namunalarini ishlab chiqish imkonini beradi.

Buni qilish qiziqarli (va koʻpincha jozibador) jarayonga aylanadi, lekin bu yondashuv qandaydir cheklovlar yoki koʻp vaqt sarflashni talab ham qilmaydi. Muharrirni ishga tushirishdan avval qogʻozga diagramma qoralamasini tushirishga sarflangan bir necha daqiqa katta dividendlarni olib kelishi mumkin.

Nima qilish kerakligini aniq bilish qobiliyatini shakllantirish gʻoyangizni aniq rejaga aylantirishga yoʻl ochadi. Siz ishlab chiqayotgan yuqori darajadagi dastur tuzilmasi ideal boʻlmasa ham (ichki perfeksionizmdan voz keching – hech nima mukammal boʻlmaydi), yuzaga kelgan kodni oʻqish yengilligi, kod kengaytmasining murakkabligini esa nazorat qilish mumkinligini sezasiz.

Agar kodingiz ancha tozalangan boʻlsa, reja tuzish va bir nechta yuzaga kelishi mumkin boʻlgan muammolardan qochish uchun sarflangan soatlardan maksimal tarzda foyda olasiz. Murakkabroq masalalarni yechish va koʻnikmalarni rivojlantirishga sarflangan oʻsha sanoqsiz soatlar sizga va karyerangizga foyda keltiradi.

Yuqori darajadagi reja tuzish uchun maslahatlar

  • Yechishga urinayotgan muammoyingizni toʻliq tushunib oling.
  • Dasturlashga kirishishdan avval yaratayotgan kodingiz  muammoni yechish uchun nima qilishi kerakligi haqida oʻylashga vaqt ajrating.
  • Dasturlashni boshlashdan avval psevdokod yozing. Psevdokod bu – hali haqiqiy boʻlmagan kod boʻlib, kodning detallarga ahamiyat qaratilmagan tuzilmasini qoralashda foydali boʻladi.
  • Diagramma chizing. Muammoni vizuallashtirish nima qilish kerakligi va turli qismlar bir-biriga qanchalik mos kelishini yaxshiroq tushunishda yordam beradi.
  • Ishingizni tekshiring. Reja yaratib olgach, uni sehrli fikrlashning har qanday ehtimolliklari bilan tekshiring va ularni amalga oshirish mumkinligiga ishonch hosil qiling.
  • Fikrlash jarayoningizni tushuntirish uchun tashqi izohlardan foydalaning. Kod yozish jarayonida nima qilayotganingiz va nega qilayotganingizni tushuntiradigan tashqi izohlovchilarni jalb qiling. Bu izohlar keyinchalik oʻzingiz yoki boshqa kimdir kodga qayta murojaat qilganda foydali boʻladi. Ayniqsa, boshqa birovni chalgʻitib yuboradigan murakkab masala ustida ishlayotgan boʻlsangiz."

2. Oʻzgaruvchilar va funksiyalar uchun maʼnoli nomlar yozing

Yaxshi yozilgan kod belgilaridan biri bu — kodni oʻqish va tushunishning osonligi. Kodni oʻqishni osonlashtiradigan qism esa oʻzgaruvchilar va funksiyalar uchun maʼnoli nomlardan foydalanishdir.

Narsalarga yaxshi nom qoʻyish qiyin. Lekin veb-dasturlashda ham bu juda muhim narsa sanaladi. Oʻzgaruvchilar va funksiyalar nomlari odatda kodingizni tushunishda eʼtibor qaratiladigan ilk narsa boʻladi.

Quyidagi misolni koʻrib chiqaylik:

let x, y, z;

function f() { 

// function

}

Bu kodni oʻqish oson emas. x, y va z nima maʼnoni bildiryapti? f() qanday vazifa bajaryapti?

Endi mana bu misolga eʼtibor qiling:

let firstName, lastName;

function printFullName(firstName, secondName) { 

// function

}

Bu kodni oʻqish ancha oson. Oʻzgaruvchilarning nomi informativ shaklda, funksiyalar nomi esa uning vazifasi haqida yaxshi tushuncha beryapti. 

Shuningdek, kodni tekshirishda xatolarni topish imkoniyatingiz ham koʻproq boʻladi. Nomlar tavsifiy xarakterga ega boʻlganda xatoni (masalan, funksiya sifatida qabul qilingan oʻzgaruvchini) topish ham yengillashadi. Aks holda bu oʻzgaruvchining nomini doimo xotirangizda saqlashingizga toʻgʻri keladi. 

Oʻzgaruvchini nega nomlaganimizni tushunib olish oson, ammo shifrlarni ishchi xotirada saqlash tez orada zʼga nom berguningizgacha ilojsiz narsaga aylanadi. Bu uddalashingiz mumkin boʻlgan murakkablik koʻlamini jiddiy tarzda cheklaydigan kognitiv zaif nuqtaga aylanadi.

Shuningdek, nomlarning yagona barqaror shaklini tanlashingiz kerak boʻladi. Dasturlash jarayonidagi nomlar boʻyicha kelishuv haqida gapirilganda, odatda kodni oʻqishni osonlashtirish uchun bosh harflar va boʻluvchi belgilardan foydalanishni nazarda tutishadi.

Quyida esa dasturlashda eng koʻp uchratadigan nomlar borasidagi kelishuvlarni keltirib oʻtamiz:

  • Camel registri: oʻzgaruvchilarning nomlari bir-biriga qoʻshilgan soʻzlar koʻrinishida yoziladi, bunda birinchi soʻzdan tashqari qolgan barchasi bosh harf bilan boshladi. Masalan: firstName, lastName, printFullName(). Camel registri JavaScriptʼda juda keng tarqalgan.
  • Pascal registri: Pascal registri ham Camel registriga oʻxshaydi, ammo bunda birinchi soʻz ham bosh harf bilan yoziladi. Masalan, FirstName, LastName, PrintFullName().
  • Snake registri: bu registrda faqat kichik harflardan va soʻzlarni ajratishda pastki chiziqdan foydalaniladi. Masalan, first_name, last_name, print_full_name().
  • Kebab registri: bu registr Snake registriga oʻxshaydi, ammo pastki chiziq oʻrnida defis (chiziqcha) dan foydalaniladi. Masalan, first-name, last-name, print-full-name().

Nomlash borasida bitta qarorga kelgach, uni davom ettirishda davomiy boʻlish talab etiladi. 

Masalan, oʻzgaruvchilar nomlari uchun Camel registridan (firstName), funksiyalar uchun Snake registridan (print_full_name()) foydalanishga qaror qildingiz. Bu holatda turli kelishuvlardan foydalanish kodni oʻqishda barqarorlikni saqlashning ahamiyatini yanada oshiradi. Chunki siz nomlar borasidagi har bir kelishuv oʻz ahamiyatiga egaligini nazarda tutgan boʻlasiz.

Agar bular tasodifiy tarzda oʻzgarsa, kodingizni talqin qiladigan kishining ishi sekinlashishi va u kodni notoʻgʻri tushunishi ehtimoli paydo boʻladi yoki u ishni sekinlashtirib, keragidan ortiq diqqat qilishga majbur boʻladi.

Tushunarli oʻzgaruvchilar nomlarini yozish borasida maslahatlar

Oʻzgaruvchi va funksiyalar nomlari quyidagicha boʻlishi kerak:

  • Tavsifiy;
  • Eslab qolish va talaffuzga oson boʻlishi;
  • Koddagi boshqa ismlarga ham mos kelishi.

Bunga erishish uchun quyidagilarni bajarishingiz kerak:

  • Tavsifiy nomlardan foydalaning. Oʻzgaruvchi yoki funksiya nomi uning maqsadini taʼriflashi kerak.
  • Bitta harfdan iborat nomlardan qoching (agar uning maʼnosi kontekstdan anglashilmaydigan boʻlsa). Masalan, i belgisidan for sikli indeksi sifatida foydalansa boʻladi, chunki bu umumiy konvensiya.
  • Sehrli sonlardan qoching. Sehrli son deb kodda maʼnosi aniq tushuntirilmagan raqamli ifodaga aytiladi.
  • Nomlar borasidagi kelishuvni aniqlashtirib oling va unga amal qiling. 
  • Doimgidek, kodni izohlab boring. Agar aniq nom yetarli boʻlmasa va original oʻzgaruvchi yoki funksiyani koʻrish zarurati tugʻilsa, izohlar xotirangizni yangilash imkonini beradi.

Narsalar uchun nom tanlaganda oʻzingizga quyidagi savollarni bering:

  • Bu oʻzgaruvchi yoki funksiya nima uchun kerak?
  • Uning nomi vazifasini taʼriflay olyaptimi?
  • Bu nomni eslab qolish va talaffuz qilish osonmi?
  • Bu nom koddagi boshqa nomlarga mos keladimi?

Agar bu savollarga oson javob bera olmasangiz, demak, boshqa nom tanlashingizga toʻgʻri keladi.

3. Kichik, modulli funksiyalar yozing

Funksiyalar dasturchining uskunalar toʻplamidagi eng qudratli vositalardan biri. Ular katta muammoni kichikroq, nazorat qilish oson qismlarga boʻlish imkonini beradi.

Kichikroq funksiyalarni testdan oʻtkazish, xatoliklarni tuzatish va qayta ishlatish osonroq boʻladi. Bundan tashqari, ular kodingizni oʻqishni ham osonlashtiradi, chunki har bir funksiyaning maqsadi aniq boʻladi.

Quyidagi misolga eʼtibor qarating:

function multiplySquaredNumbers(x, y) {
  let xSquared = x * x;
  let ySquared = y * y;
  return xSquared * ySquared;
}

console.log(multiplySquaredNumbers(5, 6)); // Output: 360

Koʻrib turganingizdek, bu funksiya ikkita argument qabul qiladi. U kirituvchi parametrlarni kvadratga koʻtarish natijalarini boshqarish uchun oʻzgaruvchilarni eʼlon qiladi, oʻzgaruvchilar esa oʻz navbatida keyingi qatorlarda ham ishlay oladi. Bu holatda jarayon bitta raqam chaqiriluvchiga qaytmasidan oldin oʻzgaruvchilar koʻpaytirilganda takrorlanadi.

Bu funksiyani soddalashtirishning boshqa usullari ham bor, ularni allaqachon sezgan boʻlsangiz kerak. Mana ulardan biri:

function multiplySquaredNumbers(num1, num2) {
    return Math.pow(num1, 2) * Math.pow(num2, 2);
}

console.log(multiplySquaredNumbers(2, 3));

Lekin modulli kodning foydasini koʻrsatish uchun sonlarni kvadratga oshirish jarayonini oʻz funksiyasiga yuboramiz.

function square(x) {
  return x * x;
}

function multiplySquaredNumbers(x, y) {
  return square(x) * square(y);
}

console.log(multiplySquaredNumbers(5, 6)); // Output: 360

Bir qarashda bu yondashuv yaxshiroq kod yozishga qanday yordam berishini tushunish uchun qiyinchilik tugʻdirishi mumkin. Bu misol kod qatorlarini kamaytirish uchun juda soddalik qiladi (va juda katta hajmli bazaviy operatorlarga asoslangan). Aslida esa biz bir necha qator qoʻshganmiz.

Qisqa kod har doim ortiqcha soʻzlardan iborat koddan afzalroq boʻlgan. Lekin siz kod yozishni tugata olmayotgan boʻlsangiz, uni ishonchli va oʻqish oson boʻlgan kod evaziga tugatmang.

Kod modulligi kodda minimalizmga erishishga boʻlgan ishtiyoq emasligini tushunish kerak. Bu yerda gap muammo yana qaytalangan taqdirda uni yechishga sarflanadigan vaqtdan maksimal tarzda foyda olishga erishishda. 

Endi kelajakda yana biror sonni kvadratga koʻtarishga toʻgʻri keladigan boʻlsa, buni amalga oshirish uchun hatto ikkita kvadrat sonni koʻpaytirish zarur boʻlmasa ham, modulli funksiyamizdan foydalana olamiz. Biz kompyuterga buni qanday amalga oshirish kerakligini aytib qoʻydik. Ana shuning oʻzidanoq foyda olishimiz mumkin boʻladi.

Agar asosiy misoldagi yondashuvdan foydalansak, keyingi operatsiya uchun sonlarni kvadratga koʻtarishni xohlaganimizda har gal interpretatorga nima qilish kerakligini xabar berishga toʻgʻri keladi.

Bu oddiy misol boʻlsa ham, funksiyalar yordamida katta muammoni kichikroq qismlarga boʻlish mumkinligini koʻrsatadi.

Bir necha marta yechishga toʻgʻri keladigan muammolar veb-dasturlashda yanada murakkablashadi. Masalan, API qoʻngʻiroqdan maʼlumotlar roʻyxatini shakllantirishingiz kerak boʻlsin. Bu vazifa ichiga maʼlumotlarni olish, ularni takrorlash va sahifadagi baʼzi maʼlumotlarni aks ettiradigan elementlarni dinamik tarzda yaratish kabilar kiradi.

Bu muammoni bir martada yechish zoʻr boʻladi, ammo sizga har bir API qoʻngʻiroq yoki maʼlumotlar roʻyxati yangilanganda buni qilishingizga toʻgʻri kelsa, koʻplab kodni nusxalashingizga toʻgʻri keladi. Tez orada esa, ayniqsa, bu roʻyxat aks ettiriladigan joylar soni ortishini ham hisobga olsak, jarayonni nazorat qila olmay qolasiz.

Buning oʻrniga biroz maʼlumot yigʻib, sahifada shu maʼlumotlarni aks ettirish uchun zarur elementlarni ortga qaytaradigan funksiyani yaratishingiz mumkin. Shu elementlarni yaratishga toʻgʻri kelganda esa funksiyani kerakli maʼlumotlar bilan birga chaqirib olasiz. Bu esa kodni DRY saqlash va takrorlanishlarga yoʻl qoʻymaslikka yordam beradi.

Modulli funksiya yozish boʻyicha maslahatlar

Modulli funksiya yozishda qoʻllash mumkin boʻlgan eng yaxshi namunalarni keltiramiz:

Funksiyalarni yagona vazifa bilan kichik holda saqlang

Funksiya yozayotganingizda u nima qilishi haqida oʻylang va shundan boshqa vazifa bajarmasligini taʼminlang.

Hamma narsani qamrab olgan, barchasini bittada bajaradigan katta funksiya yozishni istashingiz mumkin. Ammo bu kodni tahlil qilishni qiyinlashtiradi va xatoliklarga ham olib borishi mumkin.

Odatda har biri bir vazifani bajaradigan koʻplab kichik funksiyalar yozish yaxshiroq. Ularni testdan oʻtkazish ham oson boʻladi va kodning turli qismlarida qayta qoʻllanishi mumkin boʻladi.

Funksiyalaringizni tavsifiy tarzda nomlang

Oʻzingiz (va boshqa dasturchilar ham) kodni oʻqish jarayonida funksiya nima vazifa bajarishini oson tushunishingiz uchun ularning nomlari aniq va tavsifiy boʻlishi kerak. Biz nom qoʻyishni muhokama qildik, ammo bu kod bazasida bir necha marta takrorlanadigan funksiyalar uchun ham muhim. 

Nojoʻya (yon, tashqi) taʼsirlardan saqlaning

Funksiya oʻz harakat maydonidan tashqarida ham nimanidir oʻzgartiradigan boʻlsa, yon taʼsirga ega deb aytiladi. Masalan, massivni argument sifatida qabul qilib, saralaydigan funksiya yon taʼsirga ega deb qaraladi.

Yon taʼsirsiz funksiyalar toza funksiyalar deyiladi. Odatda ularning ishini oldindan bilish mumkinligi uchun toza funksiyalar afzal koʻriladi. 

Doimo yon taʼsirlarga yoʻl qoʻymaslik qiyin boʻlishi mumkin, ammo funksiya yozishda buni eʼtiborga olib qoʻyish foydadan xoli boʻlmaydi.

Argumentlarni donolik bilan ishlating

Funksiyaga qanday argumentlarni qoʻshishga qaror qilishdan avval ularning chindan ham kerakligini oʻylab koʻring. 

Argumentlar koʻpincha funksiyalarni turli holatlarda ham qoʻllashga moslash uchun ishlatiladi. Ammo juda koʻp argumentlar funksiyalarni tushunish va foydalanishni qiyinlashtirishi mumkin.

Odatda kamroq, lekin yaxshi tanlangan argumentlarni kiritish kam foyda beradigan, koʻp sonli argumentlardan yaxshiroq hisoblanadi."

4. Maʼlumotlar tuzilmasidan toʻgʻri foydalaning

Maʼlumotlar tuzilmasi ulardan samarali foydalanish imkonini beruvchi maʼlumotlarni tartiblash usulidir. Maʼlumotlar tuzilmasining har xil turlari mavjud, eng keng tarqalganlari esa massiv va obyektlar sanaladi.

Massivlar maʼlumotlar roʻyxatidan iborat boʻladi. Ularni istalgan turdagi maʼlumotlarni saqlash uchun qoʻllash mumkin, bunda massivdagi har bir element bir turda boʻlishi talab etiladi. Massivlar kvadrat qavslar ishlatilishi bilan ajratiladi.

const arr = ['a', 'b', 'c'];

Obyektlar kalit va qiymat juftliklari yordamida tartiblangan maʼlumotlar jamlanmasi hisoblanadi. Kalitlar istalgan turdagi maʼlumotlardan iborat boʻlishi mumkin boʻlgan qiymatga kirish uchun foydalaniladi. Obyektlar shaklli qavs bilan ajratiladi:

const obj = {
  key1: 'value1',
  key2: 'value2',
  key3: 'value3',
};

Kodni oʻqishni osonlashtirish va samarasini oshirish uchun maʼlumotlar tuzilmasidan oʻrinli foydalanish lozim. Masalan, sizda sahifada aks ettirilishi kerak boʻlgan maʼlumotlar roʻyxati boʻlsa, bunda obyektdan koʻra massivdan foydalanish yaxshiroq boʻladi. Buning sababi massivni takrorlash va maʼlumotlarni aks ettirish uchun zarur elementlarni yaratish osonroq boʻlishidadir.

Boshqa tomondan, agar sizda sahifada aks ettirilishi kerak boʻlgan maʼlumotlar jamlanmasi boʻlib, har bir maʼlumot qismida metamaʼlumotlar ham bogʻlangan boʻlsa, unday holda massivdan koʻra obyektdan foydalanish oʻrinliroq boʻladi. Buning sababi esa kalitlar yordamida maʼlumot va metamaʼlumotlarga kirish osonroq boʻlishidadir.

5. Kodingizni batafsil izohlang

Izohlar bu koddagi ishga tushmaydigan qatorlar boʻlib, ular dasturchi oʻzi va boshqalar uchun qaydlar qoldirishiga moʻljallangan. JavaScriptʼda odatda bir qatorli izohlarni // belgisi bilan, koʻp qatorli izohlarni /**/ tarzida ajratishadi.

// this is a single-line comment

/*

  this is
  a multi-line
  comment

*/

Izohlar kodning oʻqilishini yaxshilaydigan ajoyib usullardan hisoblanadi. Kodning vazifasi nimadan iboratligi va nega aynan shunday yoʻl tutganingizni tushuntirish uchun izohlardan foydalaning.

Izohlar ikkita asosiy sababga koʻra muhim: ular kodning vazifasi nimaligini eslab qolishga va boshqalarga esa kodingizni tushunishga yordam beradi. Kod yozish jarayonida uni izohlab ketish odatini shakllantirish muhim. Bu fikrlaringiz oqimini nazorat qilishga yordam beradi va boshqalarga kodingizni tushunishni yengillashtirib beradi.

Eng keng tarqalgan kelishuv bu oʻzingiz uchun nima qilish kerakligi haqida qayd qoldiradigan TODO izohlaridan foydalanish hisoblanadi.

// TODO: Implement login functionality

Yana bir keng tarqalgan kelishuv esa nimani toʻgʻrilash kerakligini bildiradigan FIXME izohlaridan foydalanish sanaladi.

// FIXME: This code is not working properly

Bu oʻzingiz va boshqalarga nima qilish kerakligini nazorat qilib turish imkonini beradigan ajoyib usul hisoblanadi.

Umuman olganda, nimanidir qanday qilishga amin boʻlmaganda yoki buning yaxshiroq yoʻli bor deb oʻylaganda — izoh qoldirish juda yaxshi gʻoya. Izohlardan asosan murakkab yoki noaniq kodlarni tushuntirishda foydalaniladi.

Izohlarni kodning oʻqilishini murakkablashtirish emas, aksincha osonlashirish uchun ishlatish kerakligini unutmaslik lozim. Koddan ham uzunroq izoh yozayotganingizni payqasangiz, bu kodni oʻqish qiyinlashgani va uni qayta tartiblashingiz kerakligini bildiradi.

Kodni izohlash boʻyicha maslahatlar

  • Izohlarni kod nimani bajarishi va nega aynan shunday qilganingizni tushuntirish uchun ishlating.
  • Izohlarni bajarilishi yoki toʻgʻrilanishi kerak boʻlgan narsalarni qayd qilish uchun qoʻllang.
  • Izohlarni murakkab yoki noaniq kodni tushuntirish uchun ishlating.
  • Izohlarni tayanch sifatida emas, balki kod oʻqilishini yaxshilash uchun qoʻllang.
  • Kodni yozish jarayonida izohlab boring, buni keyinga surmang.
  • Kodni ortiqcha izohlab yubormang. Tushuntirish talab etiladigan qismlarnigina izohlab keting.
  • Izohlarda aniq va qisqa tildan foydalaning.
  • Qisqartma va jargonlardan foydalanishdan tiyiling.
  • Izohlar kodga mos kelishini kuzatib boring. Kodni oʻzgartirganda izohlarni ham yangilang.
  • Eskirgan izohlarni oʻchirib yuboring.

6. Oʻqishni osonlashtirish uchun kodda abzaslar qoldiring

Abzaslar kodni oʻqishni osonlashtiradi va xatoliklarni topishga yordamlashadi. Koddagi abzaslar toʻgʻri qoʻyilgan boʻlsa, bu kodning tuzilmasini koʻrishni, har bir boʻlim qayerda boshlanib, qayerda tugayotganini bilishni osonlashtiradi. Bu kodni xatoliklardan tozalash va xatolarni izlashda foydali usul boʻlishi mumkin.

JavaScriptʼda standart abzas ikkita probeldan iborat boʻladi. Pythonʼda esa bu toʻrt probeldan iborat. Python kabi abzaslar muhim oʻrin tutadigan tillarda notoʻgʻri abzasdan foydalanish kod buzilishiga olib kelishi mumkin.

JavaScript kabi tilda abzaslar shunchaki koʻrinish uchun boʻlsada, ular boʻyicha ham kelishuv tuzilgani maʼqul. Kelishilmagan abzaslar kodni oʻqish va tushunishni qiyinlashtirishi mumkin.

Kodda abzaslardan foydalanishning asosiy sabablaridan biri kod oʻqilishini yaxshilashdir. Ammo kod abzaslari xatolarni topishingizga ham yordam berishi mumkin. Agar kodingizda abzaslar toʻgʻri boʻlsa, nimadir oʻz oʻrnida emasligini koʻrish ham osonroq boʻladi.

Misol uchun, quyidagi kod namunalariga qarang:

// Unindented code

function printHello() {
console.log("Hello, world!");
}
printHello();

// Indented code

function printHello() {
  console.log("Hello, world!");
}

printHello();

Abzaslari boʻlmagan kodda console.log() operatori printHello()funksiyasi ichida ekanini koʻrish qiyin. Abzasli kodda esa console.log() operatori printHello() funksiyasi ichidaligi koʻrinib turibdi. Bu xatolarni topishni osonlashtiradi, masalan, unutib qoldirilgan shaklli qavs kabi.

Kod abzaslari uslubga oid masala, ammo ular boʻyicha kelishuvga erishish muhim. Koʻplab dasturlash tillarida kodda abzasni qanday qoʻyish kerakli borasida kelishuvlar bor, shu sabab ularga amal qilish tavsiya qilinadi.

Umuman olganda, har yangi blok boshlanganda abzas qoʻyishingiz kerak. Blok bu – kodning birgalikda bajariladigan boʻlimlari sanaladi. Masalan, blok funksiya, if operatori yoki for siklidan iborat boʻlishi mumkin.

7. Kod yaxshi oʻqilishi uchun probellardan foydalaning

Kod yaxshi oʻqilishi uchun abzaslarga qoʻshimcha ravishda probellardan ham foydalansa boʻladi. Kod qatorlari orasiga qoʻshimcha interval qoʻshish orqali kodni osonroq koʻzdan kechirish va tushunish mumkin. Bu, ayniqsa, kodning katta bloklarini koʻzdan kechirayotganda yordam beradi. 

Masofa oʻqish nuqtasini kuzatishni xuddi tabiiy tillardagi abzaslar singari osonlashtiradi. Lekin probellar  kodning oʻzaro bogʻliq qatorlarini guruhlagani uchun ham kod oʻqishni osonlashtirishda eng zoʻr vosita sanaladi.

Bir funksiyaning tugash va keyingi funksiyaning boshlanish joyiga boʻsh qator ham odatiy amallardan sanaladi.

function printHello() {
       console.log("Hello, world!");
}

function printWelcome(name) {
      console.log("Hello, " + name);
}

Shunday boʻsh qatorni shartli operatorning gaplari orasiga ham qoʻyish mumkin.

function printWelcome(name) {

if (name === "John") {
     print("Welcome, John!");
} 

else {
     print("Welcome, stranger!");
}

Bundan tashqari, oʻzgaruvchilarni aks ettiradigan va shu oʻzgaruvchilardan foydalanadigan kod qatorlari orasiga ham boʻsh qator kiritish mumkin.

<?php
$name = "John";
$location = "Sydney";

echo "Welcome to $location, $name!";
?>

Probel va abzaslarning oʻz afzalliklari boʻlsa-da, har ikkisi birgalikda amallar oqimini oydinlashtiradigan vizual iyerarxiyani tashkil qiladi. Birlashgan qatorlarni guruhlash uchun probel va harakat maydonini bildirish uchun abzaslardan foydalanar ekansiz, kod va uni oʻqish osonlashgani eng foydali jihat boʻladi.

8. Samaradorlikni oshirish uchun massiv va sikllardan foydalaning

Massiv va sikllar yaxshi kod yozishga yordam beradigan asosiy kuchli vositalardandir. Dasturlashni oʻrgana boshlagan boʻlsangiz, allaqachon ular haqida bilsangiz kerak.

Massivlardan foydalangan holda maʼlumotlarni tartiblangan holda saqlashingiz mumkin. Bu kodingizni yanada samarali va oʻqish uchun oson qiladi. Boshqa tomondan esa sikllar takrorlanuvchi masalalarni avtomatlashtirishga yordam beradi.

Ulardan toʻgʻri foydalanishni oʻrganib olsangiz, vaqt va kuchingiz tejaladi. Masalan, ular koʻpincha murakkab ichki shartli bloklardan foydalanish zaruriyatini yoʻqotishi mumkin.

Ichki if operatorlarini oʻqish qiyin, chunki ular koʻplab kod qatorlaridan iborat boʻladi va mantiqiy oqimda koʻplab tarmoqlanishni qamrab oladi.

Quyida ichki if operatoriga misol keltiramiz:

if (x > 0) {
  if (x < 10) {
    print("x is between 0 and 10");
  } else {
    print("x is greater than 10");
  }
} else {
  print("x is less than or equal to 0");
}

Ayni shu mantiqni massiv va sikldan foydalanib ham yozish mumkin:

let numbers = [-5, 0, 5, 10, 15];

for (let i = 0; i < numbers.length; i++) {

  let x = numbers;

  if (x > 0 && < 10) {
    console.log(`x is between 0 and 10`);

  } else if  (x > 10) {
    console.log(`x is greater than 10`);

  } else {
    console.log(`x is less than or equal to 0`);
  }
}

Bu kodni oʻqish osonroq, chunki u ancha qisqa, mantiq oqimi esa chiziqli shaklda. For sikli massiv elementlarini saralaydi, if operatori esa ularning koʻrsatilgan shartga mosligini tekshiradi.

Koʻpincha aynan shu holat samarali boʻladi, chunki koʻplab shartli tekshiruvlarga hojat qolmaydi.

9. Iloji boricha oʻzini asoslaydigan kod yozing

Oʻzini asoslaydigan kod bu izohlarsiz ham oʻqish va tushunish oson boʻlgan kod hisoblanadi. Bu kod turi maqsadi aniq koʻrinadigan tarzda yoziladi.

Bu yaxshi izohlash odatining oʻrnini bosmaydi, ammo yuqori darajadagi dasturingizning tuzilmasini yodda saqlashga majburlaydi. Siz ancha tushunarli, yengil qoʻllab-quvvatlanadigan va kamroq xatoliklar uchraydigan kod yaratasiz.

Kodingizni oʻzini asoslaydigan qilishning koʻplab usullari bor. Ulardan baʼzilarini biz allaqachon koʻrib chiqdik:

  • Oʻzgaruvchi va funksiyalar uchun tushunarli hamda tavsifiy nomlardan foydalaning.
  • Faqat bir ishni bajaradigan va buni yaxshi qiladigan qisqa funksiyalar yozing.
  • Nomlangan konstantlardan foydalangan holda sehrli sonlar (muayyan maʼnoga ega boʻlmagan sonlar) dan qoching.
  • Kodni mantiqiy qismlarga boʻlish uchun probellardan foydalaning.
  • Kodlash borasida aniq va davomiy kelishuvlarni qoʻllang. Bu hatto sizning kod bazangiz bilan tanish boʻlmaganlar uchun ham kodingizni oʻqish va tushunishni osonlashtiradi.

Kodni oʻzini asoslaydigan darajaga keltirishning bir nechta usullari:

  • Keraksiz koddan qoching. Bu qatorga “oʻlik” kod (boshqa foydalanilmaydigan, ammo oʻchirilmagan kod) va aniq narsa haqida yozilgan izohlar kiradi.
  • Testdan oʻtkazish oson boʻlgan kod yozing. Bu sizning kodingiz modulli boʻlishi va aniq belgilangan interfeysga ega boʻlishi kerakligini anglatadi. Bundan tashqari, u xatolarni ham toʻgʻri va ketma-ketlikda qayta ishlashi kerak.
  • Kod bazangiz kichik boʻlsin. Bu izlaydigan narsangizni topishni va kod qanday ishlashini tushunishni osonlashtiradi.
  • Kodingizni tartibli holda saqlang. Bu barqaror kodlash uslubi va tuzilmasiga amal qilishni, shuningdek, murakkab kod uchun izohlardan foydalanishni bildiradi.
  • Hujjatlashtirish muhim jarayon, oʻzini asoslaydigan kod esa yanada yaxshiroq. Uni oʻqish, tushunish va foydalanish oson boʻladi. Shuning uchun kelgusida kod yozayotganda oʻzingizdan uni oʻzini asoslaydigan kodga aylantirish uchun nima qila olaman deb soʻrang.

Bular shunchaki bir necha misollar. Tajribangiz oshgani sayin, kodingizni oʻzini asoslaydigan qilishning yana koʻplab usullarini topasiz.

10. Oʻzingizni takrorlamang (DRY)

Yaxshi dasturlashning eng muhim tamoyillaridan biri bu DRY tamoyili hisoblanadi: Oʻzingizni takrorlamang.

Bu iloji boricha kodni nusxalashdan qochish kerakligini bildiradi. Nusxalangan kodni ishlatish ancha qiyin va u xatolarga koʻproq moyil boʻladi.

Kodni nusxalashdan qochish uchun ishlatsa boʻladigan bir qancha vositalar mavjud.

  • Funksiya va modullar. Funksiyalar qayta ishlatmoqchi boʻlayotgan kodingizni inkapsulyatsiyalashga imkon beradi (buni DRY tamoyilini birinchi marta eslaganda aytib oʻtgandik). Modullar esa oʻzaro bogʻliq funksiyalarni guruhlash imkonini beradi.
  • Maʼlumotlar tuzilmasi. Maʼlumotlar tuzilmasidan axborotni osonlik bilan olish va oʻzgartirish imkonini bergan holda saqlash uchun foydalansa boʻladi. Masalan, sizda ismlar roʻyxati mavjud boʻlsa, uni butun kod boʻylab funksiya chaqiruvlariga qattiq kodlashdan koʻra massivda saqlashingiz mumkin. 
  • Meros qoldirish. Nusxalashdan qochishning mukammallashgan yoʻli bu meros qoldirishdan foydalanish. Bu koddan sinflararo bir sinfdan boshqa sinfga meros qoldirish yoʻli bilan foydalanishni bildiradi. Bu yerda meros qoldirishga batafsil toʻxtalmaymiz, u kodni nusxalashdan qochishda yordam beradigan kuchli vosita ekanini aytish kifoya qiladi.
  • Kutubxonalar. Nihoyat siz uskuna va kutubxonalardan foydalangan holda nusxalashdan qochishingiz mumkin. Umumiy vazifalarni bajarishda ishlatish mumkin boʻlgan koʻplab ochiq manba kodiga ega kutubxonalar mavjud. Masalan, lodash kutubxonasi ishchi funksiyalarning keng namunalarini taqdim etadi.

DRY – yaxshi dasturlashning eng muhim tamoyillaridan biri. Imkoni boricha kodni nusxalashdan qochish kerak. Bu vaqtingizni tejaydi, chunki siz muammolarni bir marta yechasiz va boshqa omillar oʻzgarganda ham faqat bitta yechimni oʻzgartirishga toʻgʻri keladi.

Kod buzilganda faqat bitta yechimni toʻgʻrilash kerakligi uchun ham DRY kodini saqlash osonroq va u xatoliklardan ancha xoli boʻladi.

DRY kod yozish boʻyicha maslahatlar

  • Oʻzingizni takrorlashdan qochish uchun iloji boʻlganda kodni qayta ishlating. Kodning qaysidir nuqtasida shu ishni qayta qilishingizni bilsangiz, birinchi martasida kodni alohida obyekt sifatida yozib, qayta refaktoringdan qochishingiz mumkin.
  • Kodni qayta ishlatganda uni modullashtiring. Yechimni yangi joyga nusxalamang. Buning oʻrniga uni mos turdagi obyekt yoki maʼlumotlar tuzilmasiga koʻchiring, soʻng unga havola yarating.
  • Kodni DRY kod shaklida qayta yozishdan yaxshi foyda olish imkonini koʻrganingizda kodingizni qayta tahrirlang. Bu kod funksionalligini oʻzgartirmasdan uni qayta tuzishni bildiradi.
  • Refaktoring baʼzan ishni ortga surish uchun qopqon boʻlishi mumkin, lekin sizga funksiyaning katta qismi yana kerak boʻlishini tushunsangiz, shunday qilganingiz maʼqul.
  • Gʻildirakni qayta kashf qilmaslik uchun kutubxona va freymvorklardan foydalaning. Oʻzingizni takrorlamasligingiz kerak boʻlsa, nega yechilgan muammo uchun kod yozish kerak ekan?Sinflar orasida koddan foydalanish uchun meros qoldirishdan foydalaning.
  • Hujjatlashtirishda DRY tamoyiliga amal qiling – maʼlumotni zarurat boʻlmasa nusxalamang.
  • Funksiya va oʻzgaruvchilar uchun tushunarli nomlardan foydalaning hamda zarur oʻrinlarda kodni izohlab keting.

11. SOLID kod yozing

Dasturiy taʼminotni qanday yozishimiz haqida oʻylash imkonini beradigan mashhur freymvorklardan biri SOLID deb nomlanadi.

SOLID bu “Agile dasturiy taʼminotni ishlab chiqish manifesti” va “Toza kod” (Clean Code) kitobi muallifi Robert K. Martin tomonidan oʻylab topilgan dasturiy taʼminotni loyihalashtirishning besh kalit tamoyillari qisqartmasi hisoblanadi.

SOLIDʼning besh loyihalash tamoyillari quyidagilardan iborat:

  • Yagona masʼuliyat tamoyili (Single responsibility principle). Bu tamoyilga koʻra har bir sinf yoki modulning faqat va faqat bitta oʻzgartirish sababi boʻlishi kerak. Boshqacha aytganda, har bir sinf yoki modul faqat bir narsa uchun javobgar boʻla oladi.
  • Ochiq/yopiq tamoyil (Open/closed principle). Bu tamoyilga koʻra dasturiy taʼminot kengaytmalar uchun ochiq, lekin oʻzgartirishlar uchun yopiq boʻlishi kerak. Sizda sinf yoki modulning funksionalligini kodni oʻzgartirish zaruratisiz kengaytira olish imkoni boʻlishi kerak.
  • Liskovni almashtirish tamoyili (Liskov substitution principle). Bu tamoyilga koʻra subsinflar oʻz supersinflarining oʻrnini egallay olishi kerak, yaʼni subsinf hech qanday muammo keltirib chiqarmagan holda oʻz supersinfining oʻrnini egallash imkoniga ega boʻlishi kerak.
  • Interfeyslarni ajratish tamoyili (Interface segregation principle). Bu tamoyilga koʻra, mijozlarni oʻzi foydalanmaydigan metodlarga qaram boʻlib qolishga majburlamaslik kerak. Boshqacha aytganda, har bir interfeys kichik va muayyan maqsadga yoʻnalgan boʻlishi kerak.
  • Qaramlik inversiyasi tamoyili (Dependancy inversion principle). Bu tamoyilga koʻra oʻzaro qaramliklar inversiyaga uchrashi kerak, yaʼni yuqori darajadagi modullar quyi darajadagi modullarga qaram boʻlmasligi kerak. Buning oʻrniga ularning har ikkisi abstraksiyalarga bogʻliq boʻlishi lozim.

Bu tamoyillarning har birini eslab qolish shart emas, ammo ular haqida bilish zarar qilmaydi. Yanada sifatliroq kod yoza boshlaganda, tabiiy ravishda shu tamoyillarga amal qilayotganingizni sezasiz.

12. Gʻildirakni qayta kashf qilmang

Yaxshi dasturlashning eng muhim tamoyillaridan biri bu – gʻildirakni qayta kashf qilmaslik. Bu noldan kod yozmasdan, mavjud kutubxonalar, vosita va freymvorklardan foydalanishingiz kerakligini bildiradi.

Bu tamoyilga amal qilish kerakligining koʻplab sabablari bor. Birinchidan, bu vaqtingizni tejaydi. Allaqachon yozilgan kodni qayta yozishingiz shart boʻlmaydi. Ikkinchidan, bu siz qoʻllab-quvvatlashingiz shart boʻlgan kod hajmini kamaytiradi. Uchinchidan, bu yana kimdir mavjud koddagi xatoni topib, toʻgʻrilashi ehtimolini oshiradi.

Albatta, bu qoida uchun istisno holatlar ham mavjud. Agar ayni damda mavjud boʻlmagan narsa zarur boʻlsa, uni oʻzingiz yaratishingizga toʻgʻri keladi. Umuman olganda, iloji boricha mavjud kodlarni qayta ishlatgan maʼqul.

13. Versiyalarni nazorat qilish tizimidan foydalaning

Versiyalarni nazorat qilish tizimi bu kodingizda vaqt oʻtishi bilan yuz bergan oʻzgarishlarni kuzatib borish imkonini beradigan vosita.

Bu kodning avvalgi versiyalariga qaytish va kim, qachon kodga oʻzgartirish kiritganini bilishning foydali usuli boʻla oladi. Versiyalarni nazorat qilish tizimidan foydalanish hamkorlik ishlarini ham yaxshilashga yordam beradi, chunki bir necha kishi bir vaqtning oʻzida bitta kod bazasi ustida ishlay oladi.

Versiyalarni nazorat qilish tizimining bir qancha turlari bor, ulardan eng mashhurlari esa Git va Mercurial hisoblanadi.

Biz Git bilan ishlashni oʻrganishni tavsiya qilamiz, chunki kelajakda qoʻshiladigan jamoalaringiz aynan undan foydalanishini ishonch bilan taxmin qilishingiz mumkin.

GitHub – Git repozitoriylari uchun veb-interfeys taqdim qiladigan mashhur onlayn xizmat sanaladi. U Git asosida ishlab chiqilgan va hozirda dasturlash jamoalari tomonidan kod ustida birgalikda ishlash uchun foydalaniladigan eng mashhur tizimlardan sanaladi. Yangi mutaxassis sifatida ham allaqachon unga duch kelgan boʻlishingiz mumkin.

Xulosa

Yaxshi kod yozish har qanday dasturchi uchun muhim koʻnikma, ammo uni oʻzlashtirish uchun vaqt va mashq qilish talab qilinadi. 

Agar siz buni endi boshlagan boʻlsangiz, postdagi usullar yanada yaxshiroq kod yozishingizga yordam beradi. 

Koʻnikmalaringizni mukammallashtirib borar ekansiz, bu maslahatlarni yodda tuting va kerak vaqtda qayta murojaat qiling. Mashq qilish bilan tez orada juda yaxshi kod yozadigan boʻlasiz!

Manba: How to Write Good Code: 10 Beginner-friendly Techniques for Instant Results

#Coding
#maslahat
Mohirdev Telegram

Telegram kanalimizga obuna bo’lishni unutmang

Obuna bo'lish
sitepoint

sitepoint