Dasturiy ta'minotni ishlab chiqishda o'qiluvchanlikni va qo'llab-quvvatlanuvchanlikni oshirish uchun toza kod tamoyillarini o'rganing. Bu global dasturchilar uchun foydalidir.
Toza Kod: Global Dasturchilar Hamjamiyati Uchun O'qiladigan Implementatsiya San'ati
Dasturiy ta'minotni ishlab chiqishning dinamik va o'zaro bog'langan dunyosida nafaqat funksional, balki boshqalar uchun ham oson tushunarli bo'lgan kod yozish qobiliyati juda muhimdir. Bu Toza Kodning mohiyatidir – dasturiy ta'minotni amalga oshirishda o'qiluvchanlik, qo'llab-quvvatlanuvchanlik va soddalikni ta'kidlaydigan tamoyillar va amaliyotlar to'plami. Global dasturchilar auditoriyasi uchun toza kodni qabul qilish shunchaki afzallik masalasi emas; bu samarali hamkorlik, tezroq ishlab chiqish sikllari va pirovardida mustahkam va kengaytiriladigan dasturiy yechimlarni yaratish uchun asosiy talabdir.
Nima Uchun Toza Kod Global Miqyosda Muhim?
Dasturiy ta'minotni ishlab chiqish guruhlari tobora ko'proq turli mamlakatlar, madaniyatlar va vaqt mintaqalariga tarqalmoqda. Bu global taqsimot kod bazasi ichida umumiy til va tushunchaga bo'lgan ehtiyojni kuchaytiradi. Kod toza bo'lganda, u universal loyiha sifatida ishlaydi, bu esa turli kelib chiqishga ega dasturchilarga uning maqsadini tezda tushunish, potentsial muammolarni aniqlash va keng ko'lamli o'rgatish yoki doimiy aniqlashtirishlarsiz samarali hissa qo'shish imkonini beradi.
Tasavvur qiling, ishlab chiqish guruhi Hindiston, Germaniya va Braziliyadagi muhandislardan iborat. Agar kod bazasi tartibsiz, nomuvofiq formatlangan va noaniq nomlash qoidalaridan foydalansa, umumiy funksiyani tuzatish jiddiy to'siqqa aylanishi mumkin. Har bir dasturchi kodni turlicha talqin qilishi, bu esa tushunmovchiliklar va kechikishlarga olib kelishi mumkin. Aksincha, o'zining ravshanligi va tuzilishi bilan ajralib turadigan toza kod bu noaniqliklarni minimallashtiradi va yanada jipslashgan va samarali jamoa muhitini yaratadi.
O'qiluvchanlik Uchun Toza Kodning Asosiy Ustunlari
Robert C. Martin (Bob amaki) tomonidan ommalashtirilgan toza kod tushunchasi bir nechta asosiy tamoyillarni o'z ichiga oladi. Keling, o'qiladigan implementatsiyaga erishish uchun eng muhimlarini ko'rib chiqaylik:
1. Ma'noli Nomlar: Birinchi Himoya Chizig'i
O'zgaruvchilar, funksiyalar, klasslar va fayllar uchun tanlagan nomlarimiz kodimizning maqsadini ifodalashning asosiy usulidir. Global kontekstda, ingliz tili ko'pincha umumiy til bo'lsa-da, hamma uchun ona tili bo'lmasligi mumkin, shuning uchun aniqlik yanada muhimroqdir.
- Maqsadni Ochib Beruvchi Bo'ling: Nomlar biror bir ob'ekt nima qilishini yoki nimani anglatishini aniq ko'rsatishi kerak. Masalan, kun uchun `d` o'rniga `elapsedDays` dan foydalaning. Murakkab operatsiya uchun `process()` o'rniga `processCustomerOrder()` yoki `calculateInvoiceTotal()` dan foydalaning.
- Kodlashlardan Qoching: Venger yozuvi kabi kontekstdan tushunish mumkin bo'lgan ma'lumotlarni qo'shmang (masalan, `strName`, `iCount`). Zamonaviy IDE'lar tur ma'lumotlarini taqdim etadi, bu ularni ortiqcha va ko'pincha chalkash qilib qo'yadi.
- Ma'noli Farqlarni Yarating: Juda o'xshash yoki faqat bitta belgi yoki tasodifiy raqam bilan farq qiladigan nomlardan foydalanishdan saqlaning. Masalan, `Product1`, `Product2` nomlari `ProductActive`, `ProductInactive` nomlariga qaraganda kamroq ma'lumot beradi.
- Talaffuz Qilinadigan Nomlardan Foydalaning: Garchi bu har doim ham yuqori texnik kontekstlarda mumkin bo'lmasa-da, talaffuz qilinadigan nomlar jamoaviy muhokamalar paytida og'zaki muloqotga yordam beradi.
- Qidiriladigan Nomlardan Foydalaning: Bitta harfli o'zgaruvchi nomlari yoki noaniq qisqartmalarni katta kod bazasida topish qiyin bo'lishi mumkin. Qidiruv funksiyalari yordamida topish oson bo'lgan tavsiflovchi nomlarni tanlang.
- Klass Nomlari: Ot yoki ot birikmalari bo'lishi kerak, ko'pincha tushuncha yoki ob'ektni ifodalaydi (masalan, `Customer`, `OrderProcessor`, `DatabaseConnection`).
- Metod Nomlari: Fe'l yoki fe'l birikmalari bo'lishi kerak, metod bajaradigan harakatni tasvirlaydi (masalan, `getUserDetails()`, `saveOrder()`, `validateInput()`).
Global Misol: Tasavvur qiling, bir jamoa elektron tijorat platformasi ustida ishlamoqda. `custInfo` deb nomlangan o'zgaruvchi noaniq bo'lishi mumkin. Bu mijoz ma'lumotimi, xarajatlar indeksimi yoki boshqa narsami? `customerDetails` yoki `shippingAddress` kabi batafsilroq nom dasturchining lingvistik bilimlaridan qat'i nazar, noto'g'ri talqin qilishga o'rin qoldirmaydi.
2. Funksiyalar: Kichik, Maqsadli va Yagona Vazifali
Funksiyalar har qanday dasturning qurilish bloklaridir. Toza funksiyalar qisqa bo'ladi, bitta ishni bajaradi va uni yaxshi bajaradi. Bu tamoyil ularni tushunish, sinab ko'rish va qayta ishlatishni osonlashtiradi.
- Kichik: Bir necha qatordan oshmaydigan funksiyalarni maqsad qiling. Agar funksiya o'sib ketsa, bu uning haddan tashqari ko'p ish qilayotganining belgisi bo'lishi va uni kichikroq, boshqarilishi osonroq birliklarga bo'lish mumkinligini anglatadi.
- Bitta Ishni Bajarish: Har bir funksiya yagona, aniq belgilangan maqsadga ega bo'lishi kerak. Agar funksiya bir nechta alohida vazifalarni bajarsa, uni alohida funksiyalarga refaktor qilish kerak.
- Tavsiflovchi Nomlar: Yuqorida aytib o'tilganidek, funksiya nomlari ularning maqsadini aniq ifodalashi kerak.
- Yon Ta'sirlarsiz: Funksiya ideal holda o'zining mo'ljallangan harakatini o'z doirasidan tashqaridagi holatni o'zgartirmasdan bajarishi kerak, agar bu uning aniq maqsadi bo'lmasa (masalan, setter metodi). Bu kodni oldindan aytib bo'ladigan va tahlil qilishni osonlashtiradi.
- Kamroq Argumentlarni Afzal Ko'ring: Ko'p argumentli funksiyalar noqulay bo'lib qolishi va ularni to'g'ri chaqirish qiyin bo'lishi mumkin. Agar kerak bo'lsa, bog'liq argumentlarni ob'ektlarga guruhlashni yoki quruvchi (builder) naqshidan foydalanishni ko'rib chiqing.
- Bayroqli Argumentlardan Qoching: Mantiqiy bayroqlar (boolean flags) ko'pincha funksiyaning juda ko'p narsalarni qilishga urinayotganini ko'rsatadi. Buning o'rniga har bir holat uchun alohida funksiyalar yaratishni ko'rib chiqing.
Global Misol: `calculateShippingAndTax(order)` funksiyasini ko'rib chiqing. Bu funksiya, ehtimol, ikkita alohida operatsiyani bajaradi. Uni `calculateShippingCost(order)` va `calculateTax(order)` ga refaktor qilish toza bo'lar edi, so'ngra ikkalasini ham chaqiradigan yuqori darajadagi funksiyaga ega bo'lish kerak.
3. Izohlar: So'zlar Ojiz Qolganda, Lekin Juda Ko'p Emas
Izohlar kodning nima qilayotganini emas, balki nima uchun shunday qilinganligini tushuntirish uchun ishlatilishi kerak, chunki kodning o'zi 'nima'ni tushuntirishi kerak. Haddan tashqari ko'p izohlar kodni chalkashtirishi va agar yangilanib turilmasa, texnik xizmat ko'rsatish yukiga aylanishi mumkin.
- Maqsadni Tushuntiring: Murakkab algoritmlar, biznes mantig'i yoki ma'lum bir dizayn tanlovi ortidagi sabablarni aniqlashtirish uchun izohlardan foydalaning.
- Ortiqcha Izohlardan Qoching: Kod nima qilayotganini shunchaki takrorlaydigan izohlar (masalan, `// hisoblagichni oshirish`) keraksizdir.
- Faqat Kodni Emas, Xatolarni Ham Izohlang: Ba'zan, tashqi cheklovlar tufayli ideal bo'lmagan kod yozishingizga to'g'ri kelishi mumkin. Buni tushuntiruvchi izoh bebaho bo'lishi mumkin.
- Izohlarni Yangilab Turing: Eskirgan izohlar umuman izoh yo'qligidan yomonroq, chunki ular dasturchilarni chalg'itishi mumkin.
Global Misol: Agar ma'lum bir kod qismi eskirgan tizim integratsiyasi tufayli standart xavfsizlik tekshiruvini chetlab o'tishi kerak bo'lsa, bu qarorni tushuntiruvchi izoh va tegishli muammo kuzatuvchisiga havola, keyinchalik u bilan duch keladigan har qanday dasturchi uchun, uning xavfsizlik bo'yicha bilimlaridan qat'i nazar, juda muhimdir.
4. Formatlash va Chekinish: Vizual Tuzilma
Izchil formatlash kodni vizual tarzda tartibli qiladi va ko'zdan kechirishni osonlashtiradi. Muayyan uslub qo'llanmalari til yoki jamoaga qarab farq qilishi mumkin bo'lsa-da, asosiy tamoyil bir xillikdir.
- Izchil Chekinish: Kod bloklarini belgilash uchun bo'shliqlar yoki tablardan izchil foydalaning. Ko'pgina zamonaviy IDE'larni buni majburiy qilish uchun sozlash mumkin.
- Bo'sh Joy: Funksiya ichidagi mantiqiy kod bloklarini ajratish uchun bo'sh joydan samarali foydalaning, bu esa uni o'qiluvchanroq qiladi.
- Qator Uzunligi: O'qish oqimini buzishi mumkin bo'lgan gorizontal aylantirishni oldini olish uchun qatorlarni oqilona qisqa tuting.
- Qavslar Uslubi: Jingalak qavslar uchun izchil uslubni tanlang (masalan, K&R yoki Allman) va unga rioya qiling.
Global Misol: Avtomatik formatlash vositalari va linterlar global jamoalarda bebaho hisoblanadi. Ular oldindan belgilangan uslub qo'llanmasini avtomatik ravishda amalga oshirib, individual imtiyozlar yoki mintaqaviy kodlash odatlaridan qat'i nazar, barcha hissalarda izchillikni ta'minlaydi. Prettier (JavaScript uchun), Black (Python uchun) yoki gofmt (Go uchun) kabi vositalar ajoyib misollardir.
5. Xatolarni Qayta Ishlash: Chiroyli va Ma'lumotli
Mustahkam xatolarni qayta ishlash ishonchli dasturiy ta'minotni yaratish uchun hayotiy ahamiyatga ega. Toza xatolarni qayta ishlash xatolarni aniq signal berishni va yechim uchun etarli kontekstni ta'minlashni o'z ichiga oladi.
- Istisnolardan To'g'ri Foydalaning: Ko'pgina tillarda xato kodlarini qaytarishdan ko'ra istisnolar afzalroqdir, chunki ular normal bajarilish oqimini xatolarni qayta ishlashdan aniq ajratib turadi.
- Kontekstni Ta'minlang: Xato xabarlari ma'lumotli bo'lishi, nima noto'g'ri ketganini va nima uchunligini tushuntirishi kerak, ammo maxfiy ichki tafsilotlarni oshkor qilmasligi kerak.
- Null Qaytarmang: `null` qaytarish NullPointerException xatolariga olib kelishi mumkin. Buning o'rniga bo'sh to'plamlarni qaytarishni yoki kerak bo'lganda ixtiyoriy turlardan foydalanishni ko'rib chiqing.
- Maxsus Istisno Turlari: Aniqroq xatolarni qayta ishlashga imkon berish uchun umumiy turlar o'rniga maxsus istisno turlaridan foydalaning.
Global Misol: Xalqaro to'lovlarni qayta ishlaydigan ilovada "To'lov amalga oshmadi" kabi xato xabari yetarli emas. "To'lov avtorizatsiyasi amalga oshmadi: XXXX bilan tugaydigan karta uchun yaroqlilik muddati noto'g'ri" kabi batafsilroq xabar foydalanuvchi yoki qo'llab-quvvatlash xodimlariga muammoni hal qilish uchun kerakli ma'lumotni taqdim etadi, ularning texnik bilimi yoki joylashuvidan qat'i nazar.
6. SOLID Tamoyillari: Qo'llab-quvvatlanadigan Tizimlarni Qurish
SOLID tamoyillari (Yagona Mas'uliyat, Ochiq/Yopiq, Liskovni Almashtirish, Interfeyslarni Ajratish, Bog'liqlik Inversiyasi) ko'pincha ob'ektga yo'naltirilgan dizayn bilan bog'liq bo'lsa-da, ularning ajratilgan, qo'llab-quvvatlanadigan va kengaytiriladigan kod yaratish ruhiyati universal tarzda qo'llaniladi.
- Yagona Mas'uliyat Tamoyili (SRP): Klass yoki modul o'zgarishi uchun faqat bitta sababga ega bo'lishi kerak. Bu funksiyalarning bitta ishni bajarish tamoyiliga mos keladi.
- Ochiq/Yopiq Tamoyili (OCP): Dasturiy ta'minot ob'ektlari (klasslar, modullar, funksiyalar va hk) kengaytirish uchun ochiq, lekin o'zgartirish uchun yopiq bo'lishi kerak. Bu regressiyalarni kiritmasdan kengaytirilishini ta'minlaydi.
- Liskovni Almashtirish Tamoyili (LSP): Subtiplar dasturning to'g'riligini o'zgartirmasdan o'zlarining asosiy tiplari o'rniga o'ta olishi kerak. Bu meros ierarxiyalarining to'g'ri ishlashini ta'minlaydi.
- Interfeyslarni Ajratish Tamoyili (ISP): Mijozlar o'zlari ishlatmaydigan interfeyslarga bog'liq bo'lishga majbur bo'lmasligi kerak. Kichikroq, aniqroq interfeyslarni afzal ko'ring.
- Bog'liqlik Inversiyasi Tamoyili (DIP): Yuqori darajadagi modullar past darajadagi modullarga bog'liq bo'lmasligi kerak. Ikkalasi ham abstraksiyalarga bog'liq bo'lishi kerak. Abstraksiyalar tafsilotlarga bog'liq bo'lmasligi kerak. Tafsilotlar abstraksiyalarga bog'liq bo'lishi kerak. Bu testlanuvchanlik va moslashuvchanlik uchun kalitdir.
Global Misol: Turli to'lov shlyuzlarini (masalan, Stripe, PayPal, Adyen) qo'llab-quvvatlashi kerak bo'lgan tizimni tasavvur qiling. OCP va DIPga rioya qilish, mavjud kodni o'zgartirish o'rniga, umumiy `PaymentGateway` interfeysining yangi implementatsiyasini yaratish orqali yangi to'lov shlyuzini qo'shish imkonini beradi. Bu tizimni global bozor ehtiyojlariga va rivojlanayotgan to'lov texnologiyalariga moslashuvchan qiladi.
7. Takrorlanishdan Qochish: DRY Tamoyili
DRY (Don't Repeat Yourself - O'zingizni Takrorlamang) tamoyili qo'llab-quvvatlanadigan kod uchun asosiy hisoblanadi. Takrorlangan kod xatolar ehtimolini oshiradi va yangilanishlarni ko'proq vaqt talab qiladigan qiladi.
- Takrorlanuvchi Naqshlarni Aniqlang: Bir necha marta paydo bo'ladigan kod bloklarini qidiring.
- Funksiyalar yoki Klasslarga Chiqaring: Takrorlangan mantiqni qayta ishlatiladigan funksiyalar, metodlar yoki klasslarga joylashtiring.
- Konfiguratsiya Fayllaridan Foydalaning: O'zgarishi mumkin bo'lgan qiymatlarni qattiq kodlashdan saqlaning; ularni konfiguratsiya fayllarida saqlang.
Global Misol: Sana va vaqtni ko'rsatadigan veb-ilovasini ko'rib chiqing. Agar sanalarni formatlash mantig'i bir nechta joyda (masalan, foydalanuvchi profillari, buyurtmalar tarixi) takrorlansa, yagona `formatDateTime(timestamp)` funksiyasini yaratish mumkin. Bu barcha sana ko'rsatishlari bir xil formatdan foydalanishini ta'minlaydi va agar kerak bo'lsa, formatlash qoidalarini global miqyosda yangilashni osonlashtiradi.
8. O'qiladigan Boshqaruv Tuzilmalari
Sikllar, shartlar va boshqa boshqaruv oqimi mexanizmlarini tuzish usulingiz o'qiluvchanlikka sezilarli darajada ta'sir qiladi.
- Ichma-ichlikni Minimallashtiring: Chuqur ichma-ich joylashgan `if-else` bayonotlari yoki sikllarni kuzatish qiyin. Ularni kichikroq funksiyalarga refaktor qiling yoki himoya shartlaridan (guard clauses) foydalaning.
- Ma'noli Shartlardan Foydalaning: Tavsiflovchi nomlarga ega bo'lgan mantiqiy o'zgaruvchilar murakkab shartlarni tushunishni osonlashtirishi mumkin.
- Chegaralanmagan Sikllar Uchun `for` O'rniga `while`ni Afzal Ko'ring: Iteratsiyalar soni oldindan ma'lum bo'lmaganda, `while` sikli ko'pincha ifodaliroq bo'ladi.
Global Misol: Tahlil qilish qiyin bo'lishi mumkin bo'lgan ichma-ich `if-else` tuzilmasi o'rniga, mantiqni aniq nomlarga ega alohida funksiyalarga chiqarishni ko'rib chiqing. Masalan, `isUserEligibleForDiscount(user)` funksiyasi murakkab munosiblik tekshiruvlarini o'z ichiga olishi mumkin, bu esa asosiy mantiqni tozalaydi.
9. Birlik Testlash: Tozalik Kafolati
Birlik testlarini yozish toza kodning ajralmas qismidir. Testlar jonli hujjat va regressiyalarga qarshi xavfsizlik tarmog'i bo'lib xizmat qiladi, o'zgarishlar mavjud funksionallikni buzmasligini ta'minlaydi.
- Testlanadigan Kod: Toza kod tamoyillari, masalan, SRP va SOLIDga rioya qilish, tabiiy ravishda ko'proq testlanadigan kodga olib keladi.
- Ma'noli Test Nomlari: Test nomlari qaysi stsenariy sinovdan o'tkazilayotganini va kutilayotgan natija qanday ekanligini aniq ko'rsatishi kerak.
- Arrange-Act-Assert (Tartibga solish-Harakat-Tasdiqlash): Testlaringizni sozlash, bajarish va tekshirish uchun aniq bosqichlar bilan aniq tuzing.
Global Misol: Turli valyuta juftliklari va chekka holatlarni (masalan, nol, manfiy qiymatlar, tarixiy kurslar) qamrab oluvchi testlarga ega bo'lgan valyuta konvertatsiyasi uchun yaxshi sinovdan o'tgan komponent, butun dunyo dasturchilariga komponent turli moliyaviy operatsiyalar bilan ishlashda ham kutilganidek ishlashiga ishonch beradi.
Global Jamoada Toza Kodga Erishish
Tarqoq jamoada toza kod amaliyotlarini samarali joriy etish ongli harakat va belgilangan jarayonlarni talab qiladi:
- Kodlash Standartini O'rnating: Nomlash qoidalari, formatlash, eng yaxshi amaliyotlar va umumiy anti-naqshlarni o'z ichiga olgan keng qamrovli kodlash standartiga kelishib oling. Bu standart o'z tamoyillarida tildan mustaqil, lekin ishlatiladigan har bir til uchun o'zining qo'llanilishida aniq bo'lishi kerak.
- Kod Ko'rib Chiqish Jarayonlaridan Foydalaning: Mustahkam kod ko'rib chiqishlari muhim ahamiyatga ega. O'qiluvchanlik, qo'llab-quvvatlanuvchanlik va standartlarga rioya qilishga qaratilgan konstruktiv fikr-mulohazalarni rag'batlantiring. Bu jamoa bo'ylab bilim almashish va murabbiylik uchun ajoyib imkoniyatdir.
- Tekshiruvlarni Avtomatlashtiring: Kodlash standartlarini avtomatik ravishda majburiy qilish uchun CI/CD quvuringizga linterlar va formatlovchilarni integratsiya qiling. Bu sub'ektivlikni yo'qotadi va izchillikni ta'minlaydi.
- Ta'lim va Treningga Sarmoya Kiriting: Toza kod tamoyillari va eng yaxshi amaliyotlar bo'yicha muntazam treninglar o'tkazing. Resurslar, kitoblar va maqolalar bilan bo'lishing.
- Sifat Madaniyatini Targ'ib Qiling: Kichik dasturchilardan tortib katta arxitektorlargacha hamma tomonidan kod sifati qadrlanadigan muhitni yarating. Dasturchilarni aniqlikni oshirish uchun mavjud kodni refaktor qilishga undan.
- Juft Dasturlashni Qabul Qiling: Muhim bo'limlar yoki murakkab mantiq uchun juft dasturlash kod sifatini va bilim uzatishni sezilarli darajada yaxshilashi mumkin, ayniqsa turli xil jamoalarda.
O'qiladigan Implementatsiyaning Uzoq Muddatli Foydalari
Toza kod yozishga vaqt sarflash uzoq muddatda sezilarli afzalliklarga olib keladi:
- Texnik Xizmat Ko'rsatish Xarajatlarining Kamayishi: O'qiladigan kodni tushunish, tuzatish va o'zgartirish osonroq, bu esa texnik xizmat ko'rsatish xarajatlarini kamaytiradi.
- Tezroq Ishlab Chiqish Sikllari: Kod aniq bo'lganda, dasturchilar yangi funksiyalarni tezroq amalga oshirishi va xatolarni tezroq tuzatishi mumkin.
- Yaxshilangan Hamkorlik: Toza kod tarqoq jamoalar o'rtasida uzluksiz hamkorlikni osonlashtiradi, muloqot to'siqlarini yo'q qiladi.
- Yaxshilangan Onbording: Yangi jamoa a'zolari yaxshi tuzilgan va tushunarli kod bazasi bilan tezroq ishga tushishi mumkin.
- Dasturiy Ta'minot Ishonchliligining Oshishi: Toza kod tamoyillariga rioya qilish ko'pincha kamroq xatolar va mustahkamroq dasturiy ta'minot bilan bog'liq.
- Dasturchi Mamnuniyati: Toza, yaxshi tashkil etilgan kod bilan ishlash zavqliroq va kamroq asabiylashtiruvchi, bu esa dasturchilarning ruhiy holatini va jamoada qolishini yaxshilaydi.
Xulosa
Toza kod shunchaki qoidalar to'plami emas; bu fikrlash tarzi va mahoratga sodiqlikdir. Global dasturiy ta'minot ishlab chiqish hamjamiyati uchun o'qiladigan implementatsiyani qabul qilish muvaffaqiyatli, kengaytiriladigan va qo'llab-quvvatlanadigan dasturiy ta'minotni yaratishda muhim omil hisoblanadi. Ma'noli nomlar, qisqa funksiyalar, aniq formatlash, mustahkam xatolarni qayta ishlash va asosiy dizayn tamoyillariga rioya qilishga e'tibor qaratib, butun dunyo dasturchilari yanada samaraliroq hamkorlik qilishi va o'zlari va kelajak avlod dasturchilari uchun ishlash zavqli bo'lgan dasturiy ta'minot yaratishi mumkin.
Dasturiy ta'minotni ishlab chiqish sayohatingizda yodda tutingki, bugun yozgan kodingizni ertaga boshqa birov o'qiydi – ehtimol, dunyoning narigi tomonidagi kimdir. Uni aniq qiling, ixcham qiling va toza qiling.