<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Humoyun Ahmad</title>
    <description>The latest articles on DEV Community by Humoyun Ahmad (@humoyun).</description>
    <link>https://dev.to/humoyun</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F119730%2Ff71f0bde-d277-4eba-b3cc-7d7b99a13650.png</url>
      <title>DEV Community: Humoyun Ahmad</title>
      <link>https://dev.to/humoyun</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/humoyun"/>
    <language>en</language>
    <item>
      <title>Qancha Code Coverage yetarli?</title>
      <dc:creator>Humoyun Ahmad</dc:creator>
      <pubDate>Thu, 30 Mar 2023 13:07:15 +0000</pubDate>
      <link>https://dev.to/humoyun/qancha-code-coverage-yetarli-2c12</link>
      <guid>https://dev.to/humoyun/qancha-code-coverage-yetarli-2c12</guid>
      <description>&lt;h3&gt;
  
  
  Bismillah
&lt;/h3&gt;

&lt;p&gt;Assalom alaykum!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Taxminiy o'qish vaqti: ~3 daqiqa&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://www.codegrip.tech/productivity/everything-you-need-to-know-about-code-coverage/"&gt;&lt;strong&gt;Code coverage&lt;/strong&gt;&lt;/a&gt; bu dasturiy ta'minotning qanchalik darajada testlanganligini ko'rsatuvchi o'lchov hisoblanadi ya'ni har bir qator kodning test bilan tekshirilgan yoki tekshirilmaganligini ko'rsatib beradi. Umuman olganda dastur qanchalik ko'p testlar bilan qoplangan bo'lsa uning shuncha xavfsiz ekanligini bildiradi, eng kamida nazariyada. Lekin kodning to'liq ya'ni &lt;code&gt;100%&lt;/code&gt; testlar bilan qamrab olish qanchalik foydali, unga ketgan vaqtga o'zi arziydimi? &lt;code&gt;100% coverage&lt;/code&gt; quloqqa chiroyli eshitiladiyu ammo amaliyotda bu unchalik ham yaxshi ko'rsatgich emas.&lt;/p&gt;

&lt;p&gt;Quyida 100% lik &lt;code&gt;code coverage&lt;/code&gt; ga (test bilan qoplanganlik) intilish bilan bog'liq muammolarni ko'rib chiqamiz:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;o'ta yuqori darajali &lt;code&gt;code coverage&lt;/code&gt; dasturchilarga soxta xavfsizlik xissiyotini beradi. Chunki testlarni &lt;code&gt;run&lt;/code&gt; qilish jarayonida har bir qatorning testlangani degani bu hali har bir qatorning o'z vazifasini to'g'ri bajarishini tasdiqlangani degani emas. 100% tasdiqlangan kod bu umuman &lt;code&gt;bug&lt;/code&gt;larsiz kod degani, bu esa amaliy imkonsiz bo'lgan narsa. Xatolar doim bo'ladi, asl maqsad ularni sonini iloji boricha kamaytirish va ularning xavflilik darajasini iloji boricha tushirishdir.&lt;/li&gt;
&lt;li&gt;dasturning ba'zi imkoniyatlarini (&lt;code&gt;feature&lt;/code&gt;) test qilish ancha mashaqqatli, masalan browserda fayllarni yuklash yoki &lt;code&gt;drag-and-drop&lt;/code&gt;. Har bir test foydalanuvchilar nuqtai-nazaridan kelib chiqib yozilishi kerak ya'ni testlarimiz  foydalanuvchi dasturning muayyan imkoniyatini qanday ishlatsa uni shunday shaklda o'zida aks ettirishi kerak (e.g. &lt;code&gt;button&lt;/code&gt; elementini &lt;code&gt;loading&lt;/code&gt; yoki &lt;code&gt;disabled&lt;/code&gt; holatini &lt;code&gt;redux&lt;/code&gt; yoki &lt;code&gt;useState&lt;/code&gt; da saqlayotganimiz foydalanuvchi uchun muhimmas (bilishi kerak ham emas), unga buttondagi visual o'zgarishni ko'rish muhim). Lekin bu holatda odatda ko'plab &lt;code&gt;mock&lt;/code&gt;lar ishlatamiz, &lt;code&gt;component&lt;/code&gt;ning ichki mexanizmlarini testlarga aralashtirishga majbur bo'lamiz va oxirida esa testlarimiz umuman boshqa shaklga aylanib qoladi va juda ko'p vaqt foydasi kam bo'lgan va o'zgarishlarga chidamsiz bo'lgan testlarga ketib qoladi. Bu esa testlashda "anti-pattern"dir 🚫. Ushbu &lt;a href="https://kentcdodds.com/blog/testing-implementation-details"&gt;maqolada&lt;/a&gt; &lt;strong&gt;Kent C. Dodds&lt;/strong&gt; buni juda ajoyib qilib tushuntirgan.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://stackoverflow.com/questions/2665812/what-is-mocking"&gt;&lt;strong&gt;&lt;em&gt;mocking&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt; &lt;em&gt;odatda unit testlarda ishlatiladi. Qisqa qilib aytganda, &lt;code&gt;mocking&lt;/code&gt; bu real obyektlarni vazifasi/funksiyasini bajaruvchi soxta obyektni yaratish. Undan asosiy ko'zlangan maqsad esa testlanayotgan obyektning boshqa obyeklarga nisbatan bog'liqligini iloji boricha kamaytirish ya'ni &lt;code&gt;dependency&lt;/code&gt; lardan holi ixotalangan muhit yaratish&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Anti-pattern"&gt;&lt;em&gt;&lt;strong&gt;anti-pattern&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;: &lt;em&gt;bu dasturiy ta'minot ishlab chiqishda (ba'zi boshqa sohalarda ham) ko'p takrorlanadigan muammolarga samarasiz va oqibatda yaxshi natijalarga olib kelmaydigan yechimdir (lekin ishlaydigan).&lt;/em&gt; &lt;a href="https://stackoverflow.com/questions/980601/what-is-an-anti-pattern"&gt;&lt;em&gt;Sodda misol&lt;/em&gt;&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;yaxshi "pattern" kodning takrorlanuvchi qismini alohida funksiyaga olib kerak paytda qayta ishlatish (&lt;code&gt;code-reuse&lt;/code&gt;)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"anti-pattern" xuddi shu muammo uchun har safar &lt;code&gt;copy-paste&lt;/code&gt; ishlatish.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ko'p dasturchilarning tajribalaridan kelib chiqadigan bo'lsak, odatda &lt;code&gt;~100%&lt;/code&gt; lik &lt;code&gt;code coverage&lt;/code&gt; 2 ta holatdagina foydali:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;kutubxonalarda (&lt;code&gt;library&lt;/code&gt;), tasodifiy &lt;code&gt;breaking change&lt;/code&gt; 💥 lardan saqlanish juda ham muhim. Chunki bunday kutubxonalarni odatda minglagan yoki hatto millionlagan dasturchilar ishlatatishi mumkin (&lt;strong&gt;log4j&lt;/strong&gt; eslang).&lt;/li&gt;
&lt;li&gt;va &lt;code&gt;open source&lt;/code&gt; ya'ni ochiq kodli proyektlarda, chunki bunday proyektlarda &lt;code&gt;contributor&lt;/code&gt;larning ko'pgina qismi proyektni arxitekturasi bilan to'liqligicha tanish bo'lishmaydi. &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;breaking change&lt;/strong&gt; bu kutubxonaning yoki har qanday dasturiy ta'minotning (&lt;code&gt;REST API&lt;/code&gt;, &lt;code&gt;SDK&lt;/code&gt;, &lt;code&gt;UI Toolkit&lt;/code&gt;...) biron qismidagi o'zgarish unga bog'liq bo'lgan tizimning boshqa qismlariga ham ta'sir qilishi (to'liq yoki qisman ishdan chiqarish) mumkin bo'lgan o'zgarishdir. Odatda bunday o'zgarishlar dasturiy ta'minot (DT) foydalanuvchilariga (bu holatda dasturchilar) oldindan o'sha DTning rasmiy websayti yoki boshqa yo'llar orqali bildiriladi (bildirilishi zarur ham).&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Xo'sh unda o'rta yo'l qayerda, buni aniq aytish qiyin, odatda bu muayyan dasturiy ta'minotga, jamoaga va undagi qabul qilingan prioritetlarga bog'liq, o'rtacha dastur kodining &lt;code&gt;60-70&lt;/code&gt; foizi testlar bilan qoplanganligi bu yaxshi ko'rsatgich (lekin bu meni subyektiv fikrim). &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code coverage uchun vositalar&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://about.codecov.io"&gt;https://about.codecov.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.cypress.io/guides/tooling/code-coverage"&gt;https://docs.cypress.io/guides/tooling/code-coverage&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>testing</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Static Testlash: Linting va Formatting</title>
      <dc:creator>Humoyun Ahmad</dc:creator>
      <pubDate>Tue, 28 Mar 2023 13:04:04 +0000</pubDate>
      <link>https://dev.to/humoyun/static-testlash-linting-va-formatting-106b</link>
      <guid>https://dev.to/humoyun/static-testlash-linting-va-formatting-106b</guid>
      <description>&lt;h3&gt;
  
  
  Bismillah!
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Taxminiy o'qish vaqti: ~5 daqiqa&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Assalom Alaykum!&lt;/p&gt;

&lt;p&gt;Dasturchi sifatida yozgan har bir kodimiz iloji boricha &lt;code&gt;clean&lt;/code&gt;, &lt;code&gt;consistent&lt;/code&gt; va &lt;code&gt;simple&lt;/code&gt; bo'lishi kerak. Shunday bo'lsinki, 3-4 oy yoki hatto 3-4 yildan keyin ham bu kodni kim yozgan o'zi deb jig'i biyron bo'lishmasin. Bundan tashqari jamoaga yangi qo'shilgan dasturchilar uchun kodning muayyan qoida va qonuniyatlar bo'yicha yozilgani ularning tezda dastur kodiga ortiqcha qiyinchiliklarsiz hissa qo'shishlariga yordam beradi. Bu esa o'z navbatida dasturning kodiga (&lt;code&gt;codebase&lt;/code&gt;) ortiqcha zo'riqishlarsiz o'sish, kengayish va unga yangi imkoniyatlarning qo'sha olishlik xususiyatlarini beradi. Har qanday muvaffaqiyatli dasturiy ta'minot (&lt;code&gt;software product or service&lt;/code&gt;) bu xususiyatga ega bo'lishi shart. Bu ham aslida bir san'atdir ya'ni dasturlash sa'nati. Bu narsaga erishishda bizga katta yordam beradigan amaliyotlardan biri bu &lt;a href="https://en.wikipedia.org/wiki/Programming_style" rel="noopener noreferrer"&gt;code style&lt;/a&gt;lardir.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Code style&lt;/strong&gt; bu kod yozishning muayyan qoidalari/usullari bo'lib uzoq muddat davomida biron dasturlash tilida ishlash jarayonida orttirilgan tajribalar asosida tajribali dasturchilar tomonida yig'ilgan qoidalar majmuasidir.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Quyida JavaScript uchun ushbu qoidalardan namunalar keltirilgan &lt;a href="https://javascript.info/coding-style" rel="noopener noreferrer"&gt;cheatsheet&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3xw07xnb4vwxa8d3qhpw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3xw07xnb4vwxa8d3qhpw.png" alt="cheat sheet with some suggested rules"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sifatli dasturiy ta'minotlarni ishlab chiqarishda bu amaliyotlarning o'rni kattadir. Quyida ushbu amaliyotlarni amalga oshirishda &lt;strong&gt;frontend&lt;/strong&gt;da ishlatiladigan eng ommabop vositalar bilan tanishib chiqamiz. &lt;a href="https://eslint.org" rel="noopener noreferrer"&gt;ESLint&lt;/a&gt; dastur kodini statik analiz qilish vositasi bo'lib, to'g'ri va izchil kod yozishda muayyan qoidalariga amal qilinishini ta'minlaydi. &lt;a href="https://prettier.io" rel="noopener noreferrer"&gt;Prettier&lt;/a&gt; esa dastur kodini to'g'ri va chiroyli formatga keltirishga yordam beradi. Unit testlar haqida esa pastroqda, umumiy testlash bo'limida, bafurja gaplashamiz.&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Eslint &amp;amp; Prettier -&amp;gt; Clean &amp;amp; Consistent Code&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Unit Testing -&amp;gt; Correct Code&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Linting va formattingni proyektimizga qo'shganimizda biz butun jamoa a'zolarini o'zaro belgilangan muayyan &lt;code&gt;coding style&lt;/code&gt;ga (e.g. &lt;a href="https://github.com/airbnb/javascript" rel="noopener noreferrer"&gt;airbnb&lt;/a&gt;) amal qilgan holda kod yozishini kutamiz. Lekin bazida gitga &lt;code&gt;push&lt;/code&gt; qilayotganimizda bu qoidalar esimizdan chiqib qoladi yoki erinchoqlik qilib yoki uzoq muddat kod yozib charchab bunga amal qilmaymiz. Ba'zi jamoalarda esa bu qoidalarga deyarli amal qilinmasligini guvohi bo'lishi mumkin (ESLint o'rnatishni unda nima keragi bor?). Demak, buning oldini olish uchun har doimgidek bu amaliyotlarni avtomatlashtirish kerak. Bunga esa gitdagi &lt;code&gt;hook&lt;/code&gt;lar yordamida osongina erishish mumkin, &lt;code&gt;commit&lt;/code&gt; yoki &lt;code&gt;push&lt;/code&gt; eventlaridan oldin o'zimiz belgilab olgan scriptlarni run qilamiz (ishga tushuramiz). Yuqoridagi amaliyotlarni avtomatlashtirish uchun bizga quyidagi vositalar kerak bo'ladi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/okonet/lint-staged" rel="noopener noreferrer"&gt;&lt;strong&gt;lint-staged&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://typicode.github.io/husky" rel="noopener noreferrer"&gt;&lt;strong&gt;husky&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;lint-staged&lt;/code&gt; aynan "staged" fayllar bilan ishlashga mo'ljallangan bo'lib (ya'ni proyektimizni lokal reposiga yangi qo'shilgan yoki o'zgartirilgan lekin hali &lt;code&gt;commit&lt;/code&gt; qilib ulgurmagan fayllar) &lt;code&gt;linting&lt;/code&gt; qilinishi kerak bo'lgan fayllarni sonini cheklaydi, bu esa ishlash jarayonini ancha tezlashtiradi (5-6 tagina o'zgartirilgan fayllar uchun minglagan fayllar ustida &lt;code&gt;linting&lt;/code&gt; qilish vaqtni zoe qilishdir). &lt;code&gt;husky&lt;/code&gt; esa &lt;code&gt;git&lt;/code&gt;ning &lt;a href="https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks" rel="noopener noreferrer"&gt;hook&lt;/a&gt; mexanizmi bilan ishlashni osonlashtiradi. Bizni qiziqtirgan asosiy git hook bu &lt;code&gt;pre-commit&lt;/code&gt; bo'lib, kodga kiritgan o'zgartirishlarimizni lokal repoimizga &lt;code&gt;commit&lt;/code&gt; qilishdan oldin, bajarilishi kerak bo'lgan amaliyotlarni (linting, testing...) &lt;code&gt;run&lt;/code&gt; qilib olishimiz uchun imkon beradi.&lt;/p&gt;

&lt;h4&gt;
  
  
  Oddiy setup
&lt;/h4&gt;

&lt;p&gt;Keling ushbu vositalarni kompyuterimizga o'rnatib ko'ramiz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx mrm lint-staged
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://mrm.js.org" rel="noopener noreferrer"&gt;mrm&lt;/a&gt; &lt;code&gt;open source&lt;/code&gt; proyektlarni konfiguratsiyalarini avtomatlashtiruvchi vosita. mrm bilan &lt;code&gt;lint-staged&lt;/code&gt; va &lt;code&gt;husky&lt;/code&gt; ni osongina setup qila olamiz. &lt;br&gt;
Yuqoridagi kommandani &lt;code&gt;run&lt;/code&gt; qilganimizdan so'ng &lt;code&gt;.husky&lt;/code&gt; degan folder proyektimizni &lt;code&gt;root&lt;/code&gt; qismida hosil bo'ladi va &lt;code&gt;package.json&lt;/code&gt; fayliga quyidagi qatorlar qo'shib qo'yiladi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"prepare"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"husky install"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"devDependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"husky"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^6.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lint-staged"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^11.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"lint-staged"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"*.js"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eslint --cache --fix"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Odatda, &lt;code&gt;mrm&lt;/code&gt; o'rnatgan oddiy konfiguratsiya ko'p use caselar uchun yetarli.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frth8bxpwajg821ew3et7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frth8bxpwajg821ew3et7.png" alt="secret husky folder"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;.husky&lt;/code&gt; degan folderdagi &lt;code&gt;pre-commit&lt;/code&gt; degan faylga qarasak, quyidagi &lt;code&gt;setup&lt;/code&gt;ni ko'ramiz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;dirname&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/_/husky.sh"&lt;/span&gt;

npx lint-staged
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Endi esa &lt;code&gt;lint-staged&lt;/code&gt;: u birozgina qo'shimcha setup talab qiladi, har bir jamoa o'zi ishlatadigan vositalarni shu buyruq orqali &lt;code&gt;run&lt;/code&gt; qilishi mumkin, quyida bizni jamoa ishlatadigan konfiguratsiya misol sifatida berilgan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nl"&gt;"lint-staged"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"./src/**/*.{ts,tsx}"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"yarn depcheck:validate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"prettier --write"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"yarn lint --fix --max-warnings 0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"yarn test"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Endi esa sinab ko'ramiz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"JIRA-777 ushbu commitga qisqacha sharh"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Commit&lt;/code&gt; komandasini &lt;code&gt;run&lt;/code&gt; qilishingiz bilan terminalingizda  eslint, prettier va unit testlarni ishlayotganini ko'rasiz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9n4iiz0wbwsfwmz27jzm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9n4iiz0wbwsfwmz27jzm.png" alt="running lint-staged commands after commit"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So'ngra esa yo muvaffaqiyatli &lt;code&gt;commit&lt;/code&gt; yoki biron &lt;code&gt;linting&lt;/code&gt; bilan bog'liq xatolar yoki muvaffaqiyatsiz testlarni guvohi bo'lasiz (xuddi yuqoridagi skrinshotdagidek). Muvaffaqiyatli &lt;code&gt;commit&lt;/code&gt;dan so'ng esa bemalol &lt;code&gt;remote repo&lt;/code&gt;imizga yangi qo'shilgan o'zgarishlarni &lt;code&gt;push&lt;/code&gt; qilamiz!&lt;/p&gt;

&lt;h4&gt;
  
  
  ESlint vs Prettier ziddiyati
&lt;/h4&gt;

&lt;p&gt;Agar ESLintni Prettier bilan ishlatishni xohlasak (ishlatishimiz kerak ham) albatta bu ziddiyatga duch kelishimiz muqarrar ya'ni ESLintning formatlash qoidalari bilan Prettierni formatlash qoidalari albatta bir biri bilan kelishmay qoladi. &lt;/p&gt;

&lt;p&gt;Buning yechimi esa juda oddiy, shunchaki ESLintning formatlash bilan bog'liq qoidalarini o'chirib qo'yamiz, Prettierga o'zini ishini qilishga halaqit bermasligi uchun. Hamma o'zini ishini qilgani maqul (bu bilan Linux targ'ib qilgan dasturlash falsafasiga: &lt;a href="https://en.wikipedia.org/wiki/Unix_philosophy" rel="noopener noreferrer"&gt;Write programs that do one thing and do it well&lt;/a&gt; ham amal qilgan bo'lamiz). Bu maqolada buni amaliyotda qanday qilishga to'xtalib o'tirmadim, chunki bu narsa haqida allaqachon 10 lagan yaxshi maqolalar mavjud, quyida ulardan ba'zilarini keltirib o'tdim.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.robinwieruch.de/prettier-eslint/" rel="noopener noreferrer"&gt;https://www.robinwieruch.de/prettier-eslint/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/studio_m_song/how-to-make-eslint-work-with-prettier-avoiding-conflicts-and-problems-57pi"&gt;https://dev.to/studio_m_song/how-to-make-eslint-work-with-prettier-avoiding-conflicts-and-problems-57pi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Boshqa muhim amaliyotlar
&lt;/h4&gt;

&lt;p&gt;Har qanday proyektda agar unda ko'plab dasturchilar birgalikda ishlashar ekan, &lt;code&gt;code style&lt;/code&gt;lardan tashqari dasturlash uchun muhim bo'lgan boshqa umumiy konvensiyalar va jarayonlarni (&lt;code&gt;semantic commits&lt;/code&gt;, &lt;code&gt;git branching strategy&lt;/code&gt;, &lt;code&gt;pull requests&lt;/code&gt;, ...) ham kelishib olish ya'ni ish jarayonining bir qismiga aylantirish yaxshi ROI olib keladi. Muayyan proyekt ustida qancha ko'p dasturchi ishlayotgan bo'lsa, yuqorida sanab o'tilgan konvensiyalar va jarayonlarning ahamiyati shuncha ko'p bilinadi chunki ular ishtirokchilarning samarali muloqot qilishlari uchun umumiy asos yaratib beradi. Bundan tashqari, ularni sifatli qo'llash hozirgi kunda har qanday zamonaviy dasturiy ta'minot yaratishning asosi bo'lgan &lt;strong&gt;CI/CD pipeline&lt;/strong&gt; (DevOps) o'rnatish jarayoniga katta yordam beradi. Quyidagi linklar yordamida ushbu mavzular haqida kengroq ma'lumot olsangiz bo'ladi&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.conventionalcommits.org/en/v1.0.0/" rel="noopener noreferrer"&gt;https://www.conventionalcommits.org/en/v1.0.0/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hungvu.tech/conventions-for-semantics-in-software-development" rel="noopener noreferrer"&gt;https://hungvu.tech/conventions-for-semantics-in-software-development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.flagship.io/git-branching-strategies/" rel="noopener noreferrer"&gt;https://www.flagship.io/git-branching-strategies/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.nvidia.com/blog/benefits-of-using-pull-requests-for-collaboration-and-code-review/" rel="noopener noreferrer"&gt;https://developer.nvidia.com/blog/benefits-of-using-pull-requests-for-collaboration-and-code-review/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Last but not least
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Bu qismdagi yana eng muhim bo'lgan narsalardan biri bu &lt;code&gt;static type checking system&lt;/code&gt;, &lt;a href="https://www.typescriptlang.org/" rel="noopener noreferrer"&gt;TypeScript&lt;/a&gt; yoki &lt;a href="https://flow.org/" rel="noopener noreferrer"&gt;Flow&lt;/a&gt; kabi, bu mavzuni o'zi ancha katta bo'lgani uchun boshqa maqolada alohida to'xtalib o'tamiz. Bunday &lt;a href="https://ageek.dev/js-static-type-checkers" rel="noopener noreferrer"&gt;vositalar&lt;/a&gt; dasturchiga &lt;code&gt;type safety&lt;/code&gt; xususiyatini ya'ni dastur kodini iloji boricha xatolardan holi va barqaror bo'lishini (&lt;code&gt;stable&lt;/code&gt;) ta'minlab beradi. Bundan tashqari, ushbu vositalar &lt;code&gt;IDE&lt;/code&gt;lar bilan birgalikda&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;error highlighting&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;autocomplete&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;automated refactoring&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;auto-documentation&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;kabi &lt;strong&gt;DX&lt;/strong&gt; (&lt;code&gt;developer experience&lt;/code&gt;) ni oshiradigan qulayliklarni ham taqdim etadi.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>javascript</category>
      <category>testing</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Testlash o'zi nimaga kerak, tinchgina yashasak bo'lmaydimi!</title>
      <dc:creator>Humoyun Ahmad</dc:creator>
      <pubDate>Tue, 21 Mar 2023 02:28:22 +0000</pubDate>
      <link>https://dev.to/humoyun/testlash-ozi-nimaga-kerak-tinchgina-yashasak-bolmaydimi-2elj</link>
      <guid>https://dev.to/humoyun/testlash-ozi-nimaga-kerak-tinchgina-yashasak-bolmaydimi-2elj</guid>
      <description>&lt;h3&gt;
  
  
  Bismillah!
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Taxminiy o'qish vaqti: ~5 daqiqa&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Assalom Alaykum!&lt;/p&gt;

&lt;p&gt;O'tgan qismimizda asosan &lt;code&gt;frontend&lt;/code&gt; dagi relizgacha bo'lgan barcha jarayonlarni umumlashtirilgan shaklda ko'rib chiqdik. Bu va bundan keyingi qismlarda dastlabki maqolada keltirilgan mavzularga kengroq kiramiz va ularni qanday oddiy setup qilishlikni ko'rib chiqamiz. Bugun shu mavzularga kirish qismi qilamiz!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ushbu turkum maqolalarda ishlatilgan barcha kodlarni quyidagi github repodan topishingiz mumkin: &lt;a href="https://github.com/humoyun/testing-demo-app" rel="noopener noreferrer"&gt;testing-demo-app&lt;/a&gt;. Alohida repodan asosiy maqsad ham bu mavzularni iloji boricha amaliy ko'rinishga keltirishdir.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/humoyun" rel="noopener noreferrer"&gt;
        humoyun
      &lt;/a&gt; / &lt;a href="https://github.com/humoyun/testing-demo-app" rel="noopener noreferrer"&gt;
        testing-demo-app
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;React Testing Demo App&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;This repo is developed for showing how to setup all necessary modern tooling and good practices for development and bootstrap tests with React (both Jest and Cypress)&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Available Scripts&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;In the project directory, you can run:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;yarn install&lt;/code&gt;: run this after cloning project to install all necessary dependencies&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;yarn postinstall&lt;/code&gt;: run this to setup pre-commit&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;yarn start&lt;/code&gt;: run this to start an app&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;yarn test&lt;/code&gt;: run this to run all tests&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;yarn start:msw&lt;/code&gt;: run this to start app in mocking mode&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;yarn cy:open&lt;/code&gt;: run this to open Cypress in UI mode&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;yarn cy:run&lt;/code&gt;: run this to open Cypress in headless mode&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;npm run build&lt;/code&gt;:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Extra steps&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Need to setup relative path resolving using &lt;code&gt;tspath&lt;/code&gt; as tsconfig baseUrl is only helpful on compile time, in order to resolve after it is transpiled into JS it cannot resolve TS configs…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/humoyun/testing-demo-app" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Testlash o'zi nimaga kerak, tinchgina yashasak bo'lmaydimi!
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Spoiler&lt;/em&gt;: &lt;strong&gt;&lt;em&gt;Ground truth of testing  is the confidence!&lt;/em&gt;&lt;/strong&gt; 😊 &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hozirgi kunda sifatli dasturiy ta'minotni ishlab chiqish jarayonini testlarsiz tasavvur qilish qiyin. Yozayotgan kodimiz doimo to'g'ri ishlashiga ishonch hosil qilishimiz uchun albatta ularni testlar bilan himoyalab qo'yishimiz lozim. Chunki tabiatan har qanday dasturiy ta'minot vaqt o'tishi bilan o'zgarishlarga mahkum va har qanday o'zgarishlardan keyin ham uning to'g'ri ishlayotganiga ishonch hosil qilishimiz uchun ham testlarni yozamiz. Ho'p test yozish muhim ekan lekin ularni qanday yozamiz, ularning qanday turlari bor, ularni yozishda qandaydir usullar, qonun qoidalar ham bormi... Shu va shunga o'xshash savollar test yozishni yangi boshlayotganlarda bo'lishi tabiiy. Keling shular haqida biroz gaplashamiz. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Little story&lt;/strong&gt;&lt;/em&gt;: Esimda, bundan taxminan 3 yilcha oldin &lt;a href="https://www.agoda.com" rel="noopener noreferrer"&gt;Agoda&lt;/a&gt; bilan bo'lgan intervyumda Agodani senior engineeri mendan: hozirgi ishxonangda testlarni qanday yozaslar deb soragandi. Uhh dedim ichimda, xo'sh testlar yozish nimaligini bilaman, ahamiyatini ham, o'zimcha bir nechta test yozib ko'rganman, lekin baribir ishxonamda yozmaymizku. Aldashni keragi yo'q, deb to'g'risini aytdim. Bizda test yozilmaydi, chunki startup bo'lganimiz uchun vaqtimiz kam (oo ajoyib bahona keltirdim deb o'yladim ichimda). U esa menga kulib, bizni ham vaqtimiz kam, vaqtimiz yana ham kamaymasligi uchun test yozamiz deb javob berdi. Shu suhbatdan keyingina, testlarning haqiqiy ahamiyatini tushundim (shekilli?).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Har qanday ishga tizimli tarzda yondashish doimo yaxshi natija beradi. Testlarni yozishda bunday tizimli yondashuv odatda &lt;em&gt;&lt;strong&gt;testlash strategiyasi&lt;/strong&gt;&lt;/em&gt; deb nomlangan bo'lib ular turli test turlarini qanday kombinatsiyalarda bo'lishini muayyan bir qolipga solib tashkillashtirishni anglatadi. Dasturchilar orasida ko'p tarqalgan bunday strategiyalardan biri bu &lt;a href="https://martinfowler.com/articles/practical-test-pyramid.html" rel="noopener noreferrer"&gt;Testing Pyramid&lt;/a&gt;dir. Unga ko'ra &lt;code&gt;UI&lt;/code&gt; testlar (ba'zida &lt;code&gt;e2e&lt;/code&gt; testlar nazarda tutiladi) bu eng qimmat, eng ko'p vaqt talab qiladigan va eng sekin ishlaydigan testlardir, unit testlar esa aksincha eng tez va eng oson yoziladigan, kam mashaqqat talab qiladigan jarayondir. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Unit testlar&lt;/strong&gt; bu dastur kodining eng kichik va o'zi mustaqil biron amal bajara oladigan bo'lagini testlaydi xuddi funksiya yoki React component kabi. Ularni &lt;code&gt;run&lt;/code&gt; qilishimiz uchun bizga browser, server yoki database kerak emas shuning uchun ularni ishlashi juda tez.&lt;/em&gt; &lt;br&gt;
&lt;em&gt;&lt;strong&gt;UI testlar&lt;/strong&gt;ni (odatda e2e nazarda tutiladi) &lt;code&gt;run&lt;/code&gt; qilish uchun esa butun boshli dasturni browserda ishga tushirish kerak bo'ladi, odatda haqiqiy server va database bilan birgalikda, so'ngra esa bu testlar hosil qilgan &lt;code&gt;trash data&lt;/code&gt;ni tozalalashimiz (o'chirish) kerak. Yuqorida ham aytib o'tilganidek, bu ko'p vaqt oladigan jarayon, va ularni yozish ancha mashaqqatliroq.&lt;/em&gt; &lt;br&gt;
&lt;em&gt;&lt;strong&gt;Integration testlar&lt;/strong&gt; esa (service yoki funksional deb ham nomlanadi ba'zida) bu ikki turdagi testlarni orasida joylashgan. Ular dasturning bir nechta o'zaro bo'gliq qismlarini tekshiradi lekin browsersiz va odatda haqiqiy serversiz.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Demak biz ko'plab unit testlar va birozgina UI testlar yozishimiz kerak, shundaymi?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Bu uslub sinalgan va ishlaydigan strategiya bo'lishiga qaramay, &lt;code&gt;frontend&lt;/code&gt;ga qo'llashda o'ziga yarasha kamchiliklari ham bor, bundan tashqari bu strategiya tanishtirilgan vaqtni ham hisobga olish juda muhim. &lt;code&gt;Ajax&lt;/code&gt; revolyutsiyasidan oldin JavaScript odatda formalarni validatsiya qilish va sodda animatsiyalarni hosil qilish kabi oddiy amaliyotlar uchungina ishlatilalardi va u paytlari testing uchun ayniqsa &lt;code&gt;frontend&lt;/code&gt;da testlar yozish uchun vositalar kam va imkoniyatlari cheklangan bo'lishiga qaramay o'sha vaqtdagi talab va ehtiyojlariga javob bera olardi. Lekin so'nggi 10 yillikda web va uning atrofidagi texnologiyalarning soni va imkoniyatlari ancha kengaydi bu esa &lt;code&gt;frontend&lt;/code&gt;ning ancha murakkablashuviga olib keldi. &lt;strong&gt;SPA&lt;/strong&gt; ya'ni &lt;code&gt;client-side routing&lt;/code&gt;, &lt;code&gt;client-side state management&lt;/code&gt; va &lt;code&gt;client-side rendering&lt;/code&gt; kabi texnologiyalar va bular atrofidagi juda ko'plab &lt;code&gt;framework&lt;/code&gt;lar va &lt;code&gt;library&lt;/code&gt;lar web dasturlash olamiga kirib keldi va testlashdagi oldingi usullar, texnologiyalar va vositalar hozirgi kun &lt;code&gt;frontend&lt;/code&gt;dagi testlash talablarini va ehtiyojlarini to'liq qondira olmay qoldi. Bunga yana quyidagi sabablarni ham ko'rsatish mumkin:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;frontend&lt;/code&gt; da UI doimiy o'zgarishda (funksional hech narsa o'zgarmasa ham), bu esa ko'p yozilgan unit testlarni fail bo'lishiga olib kelaveradi va har doim biron &lt;code&gt;styling&lt;/code&gt; bilan bog'liq o'zgarish qilganimizda unit testlarni o'zgartirishimizga to'g'ri keladi.&lt;/li&gt;
&lt;li&gt;unit testlar qanchalik ko'p bo'lmasin va barchasi muvaffaqiyatli ishlamasin agar ular tasdiqlab bergan dasturning qismlari birgalikda to'g'ri ishlamasa unda ulardan katta naf bo'lmaydi. Buning muqobilida, agar bu qismlar birgalikda to'g'ri ishlasa unda juda ko'p unit testlarni yozishga ham hojat qolmaydi. Chunki shuning o'zi dasturning imkoniyatlari to'g'ri ishlayotgani haqida bizga yetarli &lt;code&gt;confidence&lt;/code&gt; ya'ni ishonch darajasini bera oladi.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Balki frontendda test yozishda sal boshqacharoq yondashuv kerakdir?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Frontendda testlashning zamonaviy strategiyalardan biri bu &lt;a href="https://kentcdodds.com/blog/the-testing-trophy-and-testing-classifications" rel="noopener noreferrer"&gt;&lt;strong&gt;Testing Trophy&lt;/strong&gt;&lt;/a&gt;. &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Modern Testing Trophy&lt;/th&gt;
&lt;th&gt;Standard Testing Pyramid&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftzyrbcvw9d4dxe9o6r6x.jpeg" alt="testing-trophy-by-kent-c-dodds" width="" height=""&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwysrgfdrzwu42jnfgbkd.png" alt="standard-testing-pyramid" width="" height=""&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Testing Trophy 🏆
&lt;/h3&gt;

&lt;p&gt;Bu strategiya ko'ra eng katta &lt;strong&gt;ROI&lt;/strong&gt; (&lt;code&gt;return on investment&lt;/code&gt;) bu integration testlarda. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;ROI&lt;/strong&gt; - sarflangan xarajat yoki mashaqqatlarga nisbatan keltirilgan natija yoki foyda.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Integration testlar dasturning muayyan imkoniyatlarini (&lt;code&gt;feature&lt;/code&gt;) yoki butun boshli sahifani to'liq tekshiradi  lekin odatda haqiqiy backend va databasega ulanmagan holatda. Masalan, quyidagi &lt;code&gt;auth flow&lt;/code&gt; ni misol qilib olishimiz mumkin (Login sahifasini):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Login sahifamizni &lt;code&gt;render&lt;/code&gt; qilamiz (oldinlari odatda browsersiz &lt;a href="https://github.com/jsdom/jsdom" rel="noopener noreferrer"&gt;JSDOM&lt;/a&gt; kabi headless &lt;code&gt;runtime&lt;/code&gt;da edi hozir esa &lt;a href="https://www.cypress.io" rel="noopener noreferrer"&gt;Cypress&lt;/a&gt; kabi zamonaviy testlash vositalari yordamida to'g'ridan to'g'ri browserni o'zida ham &lt;code&gt;render&lt;/code&gt; qilsa bo'ladi)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;username&lt;/em&gt; va &lt;em&gt;password&lt;/em&gt; input elementlarini topamiz va kerakli test user &lt;code&gt;credential&lt;/code&gt;larni kirgazamiz.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Sign In&lt;/code&gt; buttonni topamiz va &lt;code&gt;Click&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;To'g'ri &lt;code&gt;request&lt;/code&gt; yuborilganini tekshiramiz.&lt;/li&gt;
&lt;li&gt;Oxirgi bosqich holatga qarab har xil, misol uchun:

&lt;ul&gt;
&lt;li&gt;Login sahifasidan dasturning asosiy qismiga &lt;code&gt;redirect&lt;/code&gt; qilinganligi va biron textning asosiy sahifada borligini tekshirish yoki...&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SessionId&lt;/code&gt; yoki &lt;code&gt;JWT token&lt;/code&gt; ni &lt;strong&gt;&lt;em&gt;cookie&lt;/em&gt;&lt;/strong&gt; yoki &lt;strong&gt;&lt;em&gt;localStorage&lt;/em&gt;&lt;/strong&gt;ga yozilganligini tekshiramiz yoki...&lt;/li&gt;
&lt;li&gt;va hokazo&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Lekin bu jarayonda &lt;code&gt;network request&lt;/code&gt;lar serverga yetib bormaydi va &lt;strong&gt;msw&lt;/strong&gt; kabi vositalar yordamida bu &lt;code&gt;request&lt;/code&gt;lar &lt;code&gt;intercept&lt;/code&gt; qilinib mock natijalar qaytariladi  bunga keyinroq to'liqroq misol bilan to'xtalamiz.&lt;/p&gt;

&lt;p&gt;Keling endi unit va integration testlarni solishtiramiz:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;th&gt;Unit testlar&lt;/th&gt;
      &lt;th&gt;Integration testlar&lt;/th&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;
        &lt;ul&gt;
         &lt;li&gt; bitta test faqat bitta kichik dastur qisminigina qoplay oladi (e.g. funksiya yoki component)&lt;/li&gt;
         &lt;li&gt; odatda har bir refactoringdan keyin o'zgartirishga to'g'ri keladi. &lt;/li&gt;
         &lt;li&gt; odatda implementation detallaridan holi tarzda testlash qiyin ya'ni testdagi ketma-ketliklar foydalanuvchilarning dasturni ishlatishdagi ketma-ketliklariga mos tushmaydi &lt;/li&gt;
         &lt;li&gt; LOW confidence. 💧&lt;/li&gt;
        &lt;/ul&gt;    
      &lt;/td&gt;
      &lt;td&gt;
        &lt;ul&gt;
&lt;li&gt; bitta test butun boshli userflow, featureni yoki hatto sahifani ham qoplaydi. &lt;/li&gt;
&lt;li&gt; odatda refactoringdan o'zgarishsiz chiqadi &lt;/li&gt;
&lt;li&gt; implementation detallaridan deyarli holi va foydalanuvchilar dasturni ishlatishidagi ketma ketliklarni yaxshi aks ettiradi&lt;/li&gt;
&lt;li&gt; HIGHER confidence. 💪 &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/td&gt;

    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Oxirgi farq bu yerda eng muhim jihatlardan biridir ya'ni turli testlar beradigan turli ishonch darajalari (&lt;code&gt;level of confidence&lt;/code&gt;)! Integration testlar bizga dasturiy ta'minotimiz kutilganidek ishlayotganiga yetarli darajada ishonch bera oladi. Bu qolgan testlarni yozish kerak emas degani ham emas, shunchaki asosiy vaqt va e'tiborni integration testlarga berish bizga yaxshi natija olib keladi.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;user flow&lt;/strong&gt; - dasturda muayyan natijaga foydalanuvchi  qanday erishishini ko'rsatuvchi ketma-ketlikdir (&lt;code&gt;e-commerce&lt;/code&gt; appda muayyan mahsulotni topish, uni korzinkaga qo'shish va checkout qilish).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;implementatsiya detallari&lt;/strong&gt; - dasturimizning ichki ishlash mexanizmi bo'lib foydalanuvchilarga ko'rinmaydi va dasturning spesifikatsiyasida ham ko'rsatilmaydi. Dasturchini ishlashi jarayonida hosil bo'lib boradi va odatda vaqt o'tishi bilan o'zgarishlarga mahkum.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Quyida integration testlarni muhimroq ekanligi haqida keltirilgan ajoyib xazilomuz gif (original tweet muallifi &lt;a href="https://twitter.com/erinfranmc/status/1148986961207730176" rel="noopener noreferrer"&gt;&lt;em&gt;Erin McGrath&lt;/em&gt;&lt;/a&gt;)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;expect(umbrellaOpens).toBe(true)

tests: 1 passed, 1 total

**all unit tests passed, hooray**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpd9lnuzi8w3hgto9pbdr.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpd9lnuzi8w3hgto9pbdr.gif" alt="all tests passed" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Demak xulosa:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6e9lzi5eh9f2hsnctc8x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6e9lzi5eh9f2hsnctc8x.png" alt="write mostly integration tests" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Xo'sh testlash, testlarning turlari va testlash strategiyasi haqida bilib oldik va Testing Trophy strategiyasini &lt;code&gt;frontend&lt;/code&gt; uchun tanlab oldik. Keyingi maqolalarda ularning har bir qatlami bilan alohida alohida tanishib chiqamiz.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>testing</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Little React productivity boost by 'curried' function</title>
      <dc:creator>Humoyun Ahmad</dc:creator>
      <pubDate>Sun, 12 Jun 2022 11:56:15 +0000</pubDate>
      <link>https://dev.to/humoyun/little-react-productivity-boost-by-curried-function-1k29</link>
      <guid>https://dev.to/humoyun/little-react-productivity-boost-by-curried-function-1k29</guid>
      <description>&lt;p&gt;Assalom alaykum!&lt;/p&gt;

&lt;p&gt;React da ko'pincha ushbu holatdagi &lt;em&gt;&lt;strong&gt;event handler&lt;/strong&gt;&lt;/em&gt; larni ishlatilishini guvohi bo'lamiz ya'ni odatda &lt;code&gt;implicit&lt;/code&gt; bo'lgan dastlabki &lt;strong&gt;&lt;em&gt;event&lt;/em&gt;&lt;/strong&gt; argumentimizga  qo'shimcha tarzda 2 - argumentni ham funksiyamizga yuborishga to'g'ri keladi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleChange&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// input event va type bilan bog'liq kodimiz&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!--&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="nx"&gt;onChange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;handleChange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;line&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="c"&gt;&amp;lt;!--&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="nx"&gt;onChange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;handleChange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;point&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="c"&gt;&amp;lt;!--&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="nx"&gt;onChange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;handleChange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;polygon&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="c"&gt;&amp;lt;!--&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ushbu kod albatta xatosiz ishlaydi lekin bu yerda muammo &lt;code&gt;onChange&lt;/code&gt; event handler funksiyamizni yoyishga to'g'ri keladi ya'ni:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;onChange={handleChange} =&amp;gt; onChange={(e, arg1) =&amp;gt; handleChange(e)}&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bundan tashqari kodimiz unchalik ham &lt;code&gt;clean&lt;/code&gt; emas. Balki bu usulni bitta joyda ishlatsak uncha bilinmas lekin bu kodimiz bir nechta joyida qayta-qayta ishlatilsa ayniqsa refactor qilishda muammo yaqqol ko'rinadi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sodda yechim&lt;/strong&gt;: &lt;code&gt;curried&lt;/code&gt; funksiya bilan kodimizni quyidagi &lt;em&gt;&lt;strong&gt;elegant &amp;amp; clean&lt;/strong&gt;&lt;/em&gt; ko'rinishga olib kelishimiz mumkin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleChange&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// input event va type bilan bog'liq kodimiz&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!--&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="nx"&gt;onChange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleChange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;point&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="c"&gt;&amp;lt;!--&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="nx"&gt;onChange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleChange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;line&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="c"&gt;&amp;lt;!--&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="nx"&gt;onChange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleChange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;polygon&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="c"&gt;&amp;lt;!--&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ya'ni funksiya qaytaradigan funksiyani event handler sifatida ishlatamiz.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Curried funksiyalar haqida ushbu linkdan batafsil ma'lumot olishingiz mumkin: &lt;a href="https://javascript.info/currying-partials"&gt;https://javascript.info/currying-partials&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>functional</category>
      <category>webdev</category>
    </item>
    <item>
      <title>CI/CD o'zi nima?</title>
      <dc:creator>Humoyun Ahmad</dc:creator>
      <pubDate>Fri, 27 May 2022 15:40:01 +0000</pubDate>
      <link>https://dev.to/humoyun/cicd-ozi-nima-14ba</link>
      <guid>https://dev.to/humoyun/cicd-ozi-nima-14ba</guid>
      <description>&lt;h2&gt;
  
  
  Bismillah!
&lt;/h2&gt;

&lt;p&gt;&lt;u&gt;&lt;em&gt;Taxminiy o'qish vaqti: ~6 daqiqa&lt;/em&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;Assalom Alaykum!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Diskleymer&lt;/strong&gt;: ba'zi atamalardan shundayligicha foydalanildi, tarjimasi ga'latiroq yoki notanish ko'rinmasligi uchun. Ba'zi iboralar esa ixchamroq ko'rinishga keltrildi, release -&amp;gt; reliz.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ushbu turkum maqolalardan ko'zlangan asosiy maqsad, web servislarini &lt;code&gt;reliz&lt;/code&gt; qilish jarayoni bilan qiynalayotgan, dasturning yangi imkoniyatlarni foydalanuvchilariga ishonchli va tez yetkazishda muammolarga duch kelayotgan jamoalar (&lt;code&gt;team&lt;/code&gt;) uchun &lt;code&gt;frontend&lt;/code&gt;da qo'llaniladigan keng tarqalgan amaliyotlarni jamlagan muxtasar qo'llanma sifatida yozildi. Maqoladagi ko'rsatmalar asosan kamida 2-4 kishilik jamoa bo'lib ishlayotgan &lt;code&gt;frontend&lt;/code&gt; dasturchilar uchun qaratilgan bo'lsada, ba'zi umumiy tushunchalar &lt;code&gt;backend&lt;/code&gt; developerlar uchun ham foydali bo'lishi mumkin. Ushbu post juda ko'plab men tanigan va shaxsan tanimagan dasturchilarning tajribalaridan kelib chiqib yozilganiga qaramay albatta xato va kamchiliklardan holi emas. Agar biron xato yoki kamchilik topsangiz albatta sharhlar bandida buni bildiring!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;reliz&lt;/strong&gt; bu muayyan davr (e.g. &lt;code&gt;sprint&lt;/code&gt;) mobaynida dasturiy ta'minotga yangi qo'shilgan &lt;code&gt;feature&lt;/code&gt; ya'ni imkoniyatlar va &lt;code&gt;bugfix&lt;/code&gt; ya'ni dastur xatolariga tuzatmalarning foydalanuvchilarga taqdim etilishidir. Boshqa til bilan aytsak, muayyan dasturiy ta'minotning oxirgi/yangi versiyasini &lt;code&gt;production&lt;/code&gt;ga chiqarish.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  &lt;code&gt;CI/CD&lt;/code&gt; o'zi nima?
&lt;/h3&gt;

&lt;p&gt;Dasturiy ta'minotni &lt;code&gt;reliz&lt;/code&gt; qilish, agar to'g'ri tashkil etilmasa, bosh-og'riq-beruvchi va ko'p vaqt talab qiladigan jarayon bo'lishi mumkin. Kodni reliz qilishga tayyor bo'lish bilan bog'liq vaqt majburiyatlari ya'ni &lt;code&gt;deadline&lt;/code&gt;lar ( &lt;code&gt;savdo/marketing&lt;/code&gt; bo'limlari bosimi ostida) asab torlarini yanada taranglashtiradi. Buni hal qilishni oson yo'li bormi? Albatta bor, &lt;strong&gt;CI/CD&lt;/strong&gt; 🚀&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;CI&lt;/strong&gt; ya'ni &lt;code&gt;Continuous Integration&lt;/code&gt;: dastur kodiga qo'shilgan har bir o'zgarishni (git &lt;code&gt;commit&lt;/code&gt;) dastur kodi joylashgan markaziy &lt;code&gt;repository&lt;/code&gt;ga avtomalashtirilgan shaklda davomiy qo'shib borish&lt;/em&gt;&lt;br&gt;
&lt;em&gt;&lt;strong&gt;CD&lt;/strong&gt; ya'ni &lt;code&gt;Continuous Delivery(Deployment)&lt;/code&gt;: dastur kodini avtomalashtirilgan shaklda doimiy &lt;code&gt;deploy&lt;/code&gt; qilish amaliyoti.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;CI/CD&lt;/code&gt; dasturiy ta'minot ishlab chiqish va shu jarayon bilan bog'liq bo'lgan barcha &lt;code&gt;operativ ishlar&lt;/code&gt; o'rtasida ko'prik vazifasini bajaruvchi avtomalashtirilgan amaliyotlar majmuasidir (operativ ishlar: &lt;code&gt;server&lt;/code&gt;, &lt;code&gt;DB&lt;/code&gt;, &lt;code&gt;OS&lt;/code&gt;, &lt;code&gt;virtualization&lt;/code&gt;, &lt;code&gt;containerization&lt;/code&gt;, &lt;code&gt;dependent libs&lt;/code&gt; va boshqa dastur ishlashi uchun zarur bo'lgan vositalarni o'rnatish, boshqarish va davomiy xizmat ko'rsatib turish).  Boshqa rakursdan qaraganda esa, &lt;code&gt;CI/CD&lt;/code&gt; bu so'nggi 10 yillikda dasturiy ta'minot ishlab chiqishning de-facto standartiga aylangan &lt;code&gt;Agile &amp;amp; DevOps&lt;/code&gt;  madaniyat/harakatining namoyon bo'lishi ya'ni realizatsiyasidir.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;deployment&lt;/strong&gt; yoki &lt;strong&gt;deploy&lt;/strong&gt; qilish bu dastur kodini ishchi holatga keltirishdir.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://www.redhat.com/en/topics/devops/what-is-ci-cd" rel="noopener noreferrer"&gt;&lt;strong&gt;CI/CD&lt;/strong&gt;&lt;/a&gt; ko'p IT kompaniyalarda o'z dasturiy mahsulotlarini (&lt;code&gt;webapp&lt;/code&gt;, &lt;code&gt;web-service&lt;/code&gt;, &lt;code&gt;mobile app&lt;/code&gt; va hkz) foydalanuvchilariga qulay, tez va sifatli tarzda yetkazib berishini yangi darajaga olib chiqdi. &lt;code&gt;CI/CD&lt;/code&gt;, ya'ni dasturiy ta'minot ishlab chiqish jarayonining barcha bosqichlarini iloji boricha avtomatlashtirish, har qanday jamoaga (kompaniya) quyidagi imkoniyatlarni taqdim etadi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;risklarni kamaytirish: avtomatlashtirilgan testlar dasturiy ta'minotning ishonchliligini yaxshigina kafolatlaydi va keyingi relizlarda ham regressiyalar yuz berish ehtimolini ancha kamaytiradi yoki yo'qotadi.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;better code quality&lt;/code&gt;: dastur kodininig sifatli bo'lishiga ya'ni uning izchil va muayyan kodlash qoidalariga amal qilinishini osonlashtiradi.&lt;/li&gt;
&lt;li&gt;davomiy va bir maromdagi relizlarni chiqarish imkoniyati: dasturning yangi versiyasini &lt;code&gt;deploy&lt;/code&gt; qilish anavaviy usullardan ko'ra ancha qulay, oson va tezroq.&lt;/li&gt;
&lt;li&gt;bozorga tezroq kirish: &lt;code&gt;CI/CD pipeline&lt;/code&gt; dan asosiy ko'zlangan maqsadlardan biri ham tayyor bo'lgan dasturiy mahsulotni, keyinchalik esa uning yangi imokoniyatlarini foydalanuvchilarga tez yetkazib berib turishni ancha osonlashtirishdir.&lt;/li&gt;
&lt;li&gt;yangi qo'shilgan lekin muammoli &lt;code&gt;feature&lt;/code&gt;larni tezda va ortiqcha qiyinchiliklarsiz &lt;code&gt;revert&lt;/code&gt; ya'ni ortga qaytara olishlik qobilyatini beradi.&lt;/li&gt;
&lt;li&gt;dasturchilar va operativ ishchilar (e.g. sysadmin) o'rtasidagi &lt;code&gt;friction&lt;/code&gt; ya'ni kelishmovchiliklarni oldini oladi.&lt;/li&gt;
&lt;li&gt;dasturchilarning vaqtini tejash: dasturchilarning vaqti juda qimmat, shuning uchun ularning asosiy vaqti kod yozish bilan o'tishi kerak, &lt;code&gt;production&lt;/code&gt; ga chiqarilgan relizdagi muammolarni topish bilan emas. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Demak reliz qilishgacha bo'lgan deyarli barcha jarayonlarni avtomatlashtirish ya'ni inson omilini kamaytirish orqali dasturiy ta'minotning iloji boricha xatolardan holi, &lt;strong&gt;barqaror&lt;/strong&gt; va sifatli bo'lishiga olib keladi.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;CI/CD pipeline&lt;/strong&gt;: dastur kodidagi o'zgarishlarni asosiy &lt;code&gt;repo&lt;/code&gt;ga qo'shishdan tortib to uni &lt;code&gt;reliz&lt;/code&gt; qilishgacha bo'lgan barcha ketma-ket o'zaro bog'liq bosqichlarni o'z ichiga olgan jarayonning nomlanishi. Mingta gapdan bitta rasm yaxshiroq.&lt;/em&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4vialoslqu2pee4516rg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4vialoslqu2pee4516rg.png" alt="CI/CD pipeline"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Jamoa bilan yangi &lt;code&gt;CI/CD pipeline&lt;/code&gt;ni ishlab chiqar ekanmiz, (yoki allaqachon mavjud bo'lganini takomillashtirish bo'lsin) bu ishda eng muhim jihatlardan biri bu asosiy kuchni qayerga yo'naltirishni aniq qilib olish:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;formatlash, linting, unit/integration testlar va code coverage&lt;/strong&gt;&lt;br&gt;
jamoadagi dasturchilarning muayyan kodlash qoidalariga rioya qilib kod yozishi va doimiy &lt;code&gt;unit/integration&lt;/code&gt; testlar yozib turishi jamoani samaradorligini, &lt;code&gt;uzoq muddatli tezligini&lt;/code&gt; (lekin boshlanishida ko'proq vaqt oladi) va barqarorligini sezilarli oshiradi. Demak ushbu qismni dasturdagi kichik miqyosli ammo muhim xato va kamchiliklarini aniqlovchi birinchi himoya fronti sifatida ko'radigan bo'lsak, bu yerdagi amaliyotlar asosan muayyan jamoa tarkibidagi dasturchilargagina ta'sir etadi. Bu amaliyotlarning asosiy farqlovchi xususiyati bu tez ishlashi (bir necha soniyalar) va agarda xato topilsa ham tezda &lt;code&gt;fail&lt;/code&gt; bo'lishidir. &lt;code&gt;Code coverage&lt;/code&gt; esa o'z nomi bilan dasturning qancha qismi testlar bilan qoplanganini aniqlab beruvchi indikatordir.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;E2E (end-to-end) testlar, code review va preview branch deploymentlar&lt;/strong&gt;&lt;br&gt;
himoyaning bu o'rta fronti &lt;code&gt;kross-funksional&lt;/code&gt; (ya'ni bir necha jamoalarni qamrab oluvchi) amaliyotlardan tashkil topgan bo'lib odatda ancha ko'proq vaqt oladi. Agar &lt;code&gt;e2e&lt;/code&gt; testlarni misol qilib oladigan bo'lsak, bu turdagi testlar &lt;code&gt;frontend&lt;/code&gt; va &lt;code&gt;backend&lt;/code&gt; jamoa a'zolariga dasturning eng muhim qismlarini (&lt;code&gt;user flow&lt;/code&gt;) birgalikda tekshirish imkonini beradi. &lt;code&gt;Code review&lt;/code&gt;lar esa 1-frontdan o'tib ketgan xatolarni ya'ni asosan dasturning mahtiqiy xatolari, taklif etilgan yechimdagi kamchiliklar, ularning dasturlashdagi ma'lum va mashxur tamoyillarga (&lt;code&gt;DRY&lt;/code&gt;, &lt;code&gt;SOLID&lt;/code&gt;, &lt;code&gt;KISS&lt;/code&gt;, &lt;code&gt;SOC&lt;/code&gt;, &lt;code&gt;YAGNI&lt;/code&gt; va &lt;a href="https://thefullstack.xyz/dry-yagni-kiss-tdd-soc-bdfu" rel="noopener noreferrer"&gt;boshqa umumiy&lt;/a&gt;) amal qilingan yoki qilinmaganini aniqlashda, yoki taklif etilgan yechim &lt;code&gt;feature requirement specs&lt;/code&gt;ga qanchalik to'g'ri kelgan-kelmaganini aniqlashda o'rni beqiyosdir. Va oxirgisi bu har bir PR (Pull Request) uchun alohida &lt;code&gt;preview&lt;/code&gt; deploymentlarga ega bo'lish (bunday deploymentlar takrorlanmas &lt;code&gt;URL&lt;/code&gt;ga ega bo'lishi bilan ajralib turadi). Har bir bunday deployment bu sizning frontend loyihangizning ma'lum bir o'zgarishlarga ega versiyasidir. Bunday deploymentlar nafaqat jamoa ichida &lt;code&gt;code review&lt;/code&gt;ni tezligini oshiradi balki bundan tashqari &lt;code&gt;design&lt;/code&gt; va &lt;code&gt;product&lt;/code&gt; teamlar siz tanishtirgan o'zgarishlarni (e.g. dasturga yangi qo'shilgan imkoniyatlar) qulay va tezda tasdiqlashini ham osonlashtiradi.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;feature flag, accessibility auditlar/testlar, performance testlar va cross-browser testlar&lt;/strong&gt;&lt;br&gt;
bu esa himoyaning so'nggi fronti bo'lib asosan reliz va relizdan keyingi &lt;code&gt;more-customer-facing&lt;/code&gt; amaliyotlardan tashkil topgan. Xususan, &lt;strong&gt;feature flaglar&lt;/strong&gt; bu muayyan dastur imkoniyatini masofadan turib dasturni qayta deploy qilmasdan (ya'ni hech qanday koddagi o'zgarishsiz) o'chirib/yoqib qo'yish imkoniyati yoki biron yangi &lt;code&gt;feature&lt;/code&gt;ni foydalanuvchilarga ko'rsatmasdan turib deploy qila olishlik imkoniyatini beruvchi vositadir. &lt;strong&gt;ff&lt;/strong&gt;lar yordamida &lt;code&gt;canary reliz&lt;/code&gt;lar, &lt;code&gt;kill switch&lt;/code&gt;, &lt;code&gt;A/B testing&lt;/code&gt; va bir qancha boshqa ishlarni amalga oshirsa bo'ladi. &lt;strong&gt;Accessibility audit/testlar&lt;/strong&gt; : bularni CI/CD pipelinimizni oxirgi qismi desak ham bo'ladi, lekin shunga qaramasdan eng muhim va eng qiyin bosqichlardan biri chunki odatda frontendimizni &lt;code&gt;100% accessible&lt;/code&gt; qilishni kafolatlash deyarli imkonsiz. Lekin shunga harakat qilinish kerak.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;linting&lt;/strong&gt; bu dastur kodini statik tahlil qilish jarayoni bo'lib, dasturdagi &lt;code&gt;bug&lt;/code&gt;lar ya'ni xatolar va koddagi stilistik nomutanosibliklarni topishda ishlatiladi.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;e2e testlar&lt;/strong&gt; bu sodda qilib aytganda dasturning butun jabhalarini, &lt;code&gt;database&lt;/code&gt;, &lt;code&gt;backend&lt;/code&gt; va &lt;code&gt;frontend&lt;/code&gt;ni qamrab oluvchi va eng qimmat va eng ko'p vaqt talab qiladigan testlar. Ayni paytda, bu turdagi teslarni dastur kodining haqiqatda muammolarsiz ishlayotganini eng to'g'ri ko'rsatib beruvchi indikator deb qarasak ham bo'ladi.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;feature requirement specs&lt;/strong&gt; bu dasturning muayyan &lt;code&gt;feature&lt;/code&gt;sini nimaligi, qanday ishlashi va nima natija berishi kerakligi bildiruvchi texnik xujjat, sodda qilib aytsak  dasturchilar/proyekt managerlar shunga qarab dasturga yangi imkoniyatlarni qo'shishadi. FRS ni &lt;a href="https://en.wikipedia.org/wiki/Software_requirements_specification" rel="noopener noreferrer"&gt;SRS&lt;/a&gt; (Software requirements specification) ning kichikroq versiyasi desak ham bo'ladi.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Demak, &lt;code&gt;CI/CD pipeline&lt;/code&gt;ning har bir bosqichini ta'sir doirasining kengliga qarab shartli 3 guruhga bo'lib olsak bo'ladi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;faqat muayyan jamoa miqyosida

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;unit/integration&lt;/code&gt; testlar (odatda &lt;code&gt;code coverage&lt;/code&gt; bilan), &lt;code&gt;linting&lt;/code&gt;, &lt;code&gt;formatlash&lt;/code&gt; va &lt;code&gt;type checker&lt;/code&gt;lar &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;bir necha jamoalarni qamrab oluvchi (ya'ni kompaniya darajasida)

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;e2e&lt;/code&gt; testlar, &lt;code&gt;code review&lt;/code&gt;, &lt;code&gt;preview deployment&lt;/code&gt;lar va avtomatlashtirilgan relizlar&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;jamoa(lar)ni, kompaniyani va barcha foydalanuvchilarni qamrab oluvchi.

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;feature flaglar&lt;/code&gt;, &lt;code&gt;accessibility&lt;/code&gt; auditlar/testlar va &lt;code&gt;performance&lt;/code&gt; testlar.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Kelgusu qismlarda bularning har biri bilan alohida-alohida va chuqurroq tanishib chiqamiz.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Maqsadimiz o'zbek tilida IT bilan bo'gliq sifatli contentni ko'paytirish va ularni hammaga qulay uslubda tarqatishdir. Bunda eng katta muammolarimizdan biri bu sohaga oid inglizcha atamalarni qanday qilib tushinarli tarzda, o'z ma'nosidan chiqib ketmagan holda qisqa va lo'nda shaklda yetkazishdir. Chunki to'g'ridan to'g'ri (direct) tarjima ko'p hollarda haddan tashqari uzun, tushunarsiz va o'zining dastlabki ma'nosidan chiqib ketgan shaklga kelib qolishidir. Shuning uchun sarbast (erkin) uslubni (postimizda boshida ham bu haqida biroz to'xtalgandik) sinab ko'rishga qaror qildik. Haligi aytishgandek: Best of both worlds :) !&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>webdev</category>
      <category>devops</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>JavaScript Evolutsiyasi Qisqa Satrlarda!</title>
      <dc:creator>Humoyun Ahmad</dc:creator>
      <pubDate>Thu, 12 May 2022 08:25:00 +0000</pubDate>
      <link>https://dev.to/humoyun/javascript-evolutsiyasi-qisqa-satrlarda-4c77</link>
      <guid>https://dev.to/humoyun/javascript-evolutsiyasi-qisqa-satrlarda-4c77</guid>
      <description>&lt;h3&gt;
  
  
  Bismillah!
&lt;/h3&gt;

&lt;p&gt;&lt;u&gt;&lt;em&gt;Taxminiy o'qish vaqti: ~9 daqiqa&lt;/em&gt;&lt;/u&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Diskleymer&lt;/strong&gt;: ba'zi atamalardan shundayligicha foydalanildi, tarjimasi ga'latiroq yoki notanish ko'rinmasligi uchun. Ba'zi iboralar esa ixchamroq ko'rinishga keltrildi, release -&amp;gt; reliz.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Assalam alaykum! Bugun siz bilan &lt;strong&gt;JavaScript&lt;/strong&gt; (&lt;strong&gt;JS&lt;/strong&gt;) rivojlanish tarixiga biroz nazar tashlaymiz. Hozirgi kunda eng zamonaviy va eng ko'p qo'llaniladigan tillardan hisoblangan JS oldin qanday edi va o'tgan yillar ichida qanchalik o'zgardi va kimlar o'zgartirdi. Bu maqolada JSni boshlanish tarixiga to'xtalib o'tirilmadi, agar bu haqida to'liq bilishni xohlasangiz quyidagi maqoladan o'qib olsangiz bo'ladi: &lt;a href="https://www.educative.io/blog/javascript-versions-history"&gt;version history of javascript&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ko'p yillar davomida (&amp;lt; 2015 gacha) JS rivojlanishi (tilga yangi imkoniyatlarni qo'shib borish) juda sekin va salmoqsiz edi. Aniqroq gapiradigan bo'lsak, &lt;a href="https://en.wikipedia.org/wiki/ECMAScript"&gt;ECMAScript&lt;/a&gt; (JS ni spesifikatsiyasiga ma'sul standard) tilni &lt;strong&gt;&lt;em&gt;3.1&lt;/em&gt;&lt;/strong&gt; versiyasida 2009 dan beri qotib qolgan edi 🔒. Solishtirish uchun ushbu &lt;a href="https://www.w3schools.com/js/js_versions.asp"&gt;havolaga&lt;/a&gt; qaralsin. Keyinchalik bu versiya biz ko'proq tanish bo'lgan &lt;strong&gt;ECMAScript 5&lt;/strong&gt; yoki &lt;strong&gt;ES5&lt;/strong&gt; nomi bilan almashtirildi. Keyingi katta relizgacha JS community ancha uzoq kutib qoldi, deyarli 6 yil. Xatto ATM mashinalar ham tezroq yangilanib turiladi.&lt;/p&gt;

&lt;p&gt;Bu vaqt mobaynida esa &lt;a href="https://github.com/tc39"&gt;TC39&lt;/a&gt; deb nomlangan JSni stardartlashtirish guruhi bir qancha &lt;a href="https://openjsf.org/"&gt;OpenJS Foundation&lt;/a&gt; kabi ochiq jamiyatlar yordamida ECMAScript 2015 yoki ES6 versiyasini ishlab chiqishdi va 2015 yilga kelibgina taqdim etishdi. Bu JS tarixidagi shu paytgacha kirtilgan eng katta va muhim yangilanish edi.&lt;/p&gt;

&lt;p&gt;Bu relizda JSga kiritilgan yangi imkoniyatlarning eng asosiylari bilan quyida tanishib chiqamiz. To'liq ma'lumotni esa &lt;a href="http://es6-features.org/"&gt;ushbu&lt;/a&gt; havoladan ko'rib olsangiz bo'ladi.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
yangi Promise API ⌛&lt;/li&gt;
&lt;li&gt;class sintaksisi&lt;/li&gt;
&lt;li&gt;
yagona modul tizimi 🌕&lt;/li&gt;
&lt;li&gt;
arrow funksiyalar 🔥&lt;/li&gt;
&lt;li&gt;destrukturalash sintaksisi&lt;/li&gt;
&lt;li&gt;
meta programming 🔧&lt;/li&gt;
&lt;li&gt;block scoped ozgaruvchilar&lt;/li&gt;
&lt;li&gt;
iterator va generatorlar 💪&lt;/li&gt;
&lt;li&gt;template literal&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Yangi Promise API
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://javascript.info/promise-basics"&gt;Promise&lt;/a&gt; obyekti muayyan asinxron operatsiya (serverga http so'rov) bilan ancha qulay tarzda ishlash imkonini beradi. Bu mexanizmdan oldin JSda asinxron kodlar &lt;code&gt;callback&lt;/code&gt; lar yordamida amalga oshirilardi lekin noqulayliklari ko'p edi. Bunga yaqqol misol qilib &lt;code&gt;callback hell&lt;/code&gt; 😩 keltirish mumkin. Buni quyidagi &lt;a href="http://callbackhell.com"&gt;code-snippet&lt;/a&gt; da ko'rishingiz mumkin: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fys4llm78tc7mthzxhunp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fys4llm78tc7mthzxhunp.png" alt="Callback hell sample" width="800" height="523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Demak &lt;code&gt;Promise&lt;/code&gt;lar bizga quyidagilarni beradi:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Yanada ekspressiv asinxron kod yozish.&lt;/li&gt;
&lt;li&gt;Yanada elegant &lt;code&gt;error handling&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;ekspressiv&lt;/em&gt; - qisqa satrlarda ko'p narsani namoyon eta olish.&lt;br&gt;
&lt;em&gt;elegant&lt;/em&gt; - nafis va yoqimli ko'rinish.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Qo'shimcha: &lt;a href="https://javascript.info/async-await"&gt;ES7&lt;/a&gt; &lt;code&gt;async/await&lt;/code&gt; sintaksisi esa asinxron kodingni yanada qulaylashtirdi.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Class sintaksisi
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Class&lt;/code&gt;lar JSning &lt;code&gt;prototype&lt;/code&gt; mexanizmi ustiga qurilgan abstraksiyasidir. Javadagi &lt;code&gt;class&lt;/code&gt;lar bilan adashtirilmasin chunki sintaktik bir xil ko'rinishda bo'lsada, ishlash mexamizmlari fundamental darajada bir biridan farqlidir. JSda haqiqiy &lt;code&gt;Prototypal Inheritance&lt;/code&gt; (aslida &lt;code&gt;Delegation&lt;/code&gt;) ni to'g'ri &lt;code&gt;setup&lt;/code&gt; qilish biroz murakkabroq jarayon edi, &lt;code&gt;class&lt;/code&gt;lar buni elegant holatga keltirdi.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// classlarsiz&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{...}&lt;/span&gt;
&lt;span class="nx"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{...}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Student&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="nx"&gt;Student&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getScores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{...}&lt;/span&gt;
&lt;span class="nx"&gt;Student&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;Student&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;constructor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Student&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// classlar bilan&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Person&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;getName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{...}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Student&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Person&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;getScores&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{...}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lekin bu degani &lt;code&gt;class&lt;/code&gt;lar yaxshiroq degani emas. Uni o'ziga yarasha kamchililari bor. Bu haqida esa boshqa maqolada bafurja muhokama qilamiz. Shaxsan men uchun &lt;code&gt;class&lt;/code&gt;lar JSda obyektlar bilan ishlashga turli tumanlikni olib kirdi va Javaga o'xshash kompilyatorlik tillardan kelgan dasturchilarga visual qulaylik berdi ya'ni &lt;em&gt;syntactic sugar&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Yagona modul tizimi
&lt;/h3&gt;

&lt;p&gt;Har qanday dasturiy ta'minotda dastur kodining yaxshi strukturaviy qismlarga ajratilgani, ham mantiqiy ham jismoniy, bu eng muhim masalalardan biridir. Bunga esa modullar orqali erishiladi. Afsuski, ES6 modul tizimidan oldingi modullash tizimlarida bir qator kamchiliklar mavjud edi, misol uchun server va client uchun universal modul tizimining yo'qligi. Dastlabki modul tizimlaridan farqli o'laroq, yangi ECMAScript Modules (ESM) tizimi &lt;a href="https://waghetti.com/posts/2021/01/static-dependency-injection/"&gt;statik bog'liqliklardan&lt;/a&gt; foydalanish uchun JS sintaksisini yaxshiladi, bu esa 4 ta muhim afzalliklarni berdi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dastur kodining statik tahlili, o'lik kodni yo'q qilish (dead-code elimination) va keraksiz kodlarni topish (tree-shaking) kabi bir qancha zamonaviy dasturlash vositalarini ishini ancha samaraliroq qilishga imkon yaratdi.&lt;/li&gt;
&lt;li&gt;Server va client uchun modul tizimini birlashtirdi, bu esa platformaga qarab turli xil modul tizimlarini talab qilish muammosini chiroyli hal etdi. (e.g. CommonJS va AMD)&lt;/li&gt;
&lt;li&gt;butun dastur bo'ylab kodni qayta-qayta ishlata olishlik imkoniyatini yaxshiladi ya'ni more elegant code sharing.&lt;/li&gt;
&lt;li&gt;Kompilyatorlarning kodni tahlil qilish usulini optimallashtirdi. &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Yashasin &lt;code&gt;export/import&lt;/code&gt; yo'qolsin &lt;code&gt;require/define&lt;/code&gt;! (bu albatta xazil edi)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Arrow funksiyalar
&lt;/h3&gt;

&lt;p&gt;Bu yangi standartdan oldin, JSda funksiyalarni yaratish uchun &lt;code&gt;function&lt;/code&gt; kalitso'zi ishlatilardi, endi esa funksiyalarni &lt;code&gt;=&amp;gt;&lt;/code&gt; maxsus arrow sintaksisi yordamida ekspressivroq tarzda e'lon qila olamiz. Arrow funksiyalar Pythondagi lambda funksiyalar kabidir va an'anaviy funksiyalardan bir qancha &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions"&gt;farqlari&lt;/a&gt; bor. Xususan, arrow funksiyalar an'anaviy funksiyalardagi &lt;code&gt;this&lt;/code&gt;, &lt;code&gt;arguments&lt;/code&gt; yoki &lt;code&gt;super&lt;/code&gt; kabi mexanizmlarga ega emas . Bundan tashqari, &lt;code&gt;call&lt;/code&gt;, &lt;code&gt;apply&lt;/code&gt; va &lt;code&gt;bind&lt;/code&gt; kabi scopelarni o'zgartira olishda ishlatiladigan vositalar bilan ishlatila olinmaydi.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ES6 dan oldin &lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;num2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;num1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;num2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// ES6 dan keyin &lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;addImplicit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;num2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;num1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;num2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Arrow funksiyalaridan foydalanishning eng katta qulayligi sifatida &lt;code&gt;setTimeout()&lt;/code&gt; va &lt;code&gt;EventTarget.addEventListener()&lt;/code&gt; kabi metodlar bilan oson ishlatilishini aytish mumkin, chunki ularda odatda funksiyaning tegishli scopeda bajarilishini taʼminlash uchun &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures"&gt;closure&lt;/a&gt; mexanizmini tadbiq qilinishi yoki &lt;code&gt;bind&lt;/code&gt; va &lt;code&gt;apply&lt;/code&gt; kabi metodlarni ishlatish talab etiladi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Destrukturalash sintaksisi
&lt;/h3&gt;

&lt;p&gt;Obyektni destrukturalash obyektning propertiylarini qulay tarzda ajratib olishga va ularni o'zgaruvchilarga osonroq o'zlashtirishga imkon yaratadi. Bu esa dastur kodidagi tartibsizliklarni (code clutter) kamaytirishda samarali rol o'ynab kodni yanada ixcham va o'qishli ko'rinishga keltiradi.&lt;br&gt;
Ko'rib o'zingiz baho bering:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ahmad&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="na"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="na"&gt;zipCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7711&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tashkent&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;zipCode&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// cool!&lt;/span&gt;
&lt;span class="c1"&gt;// solishtirish uchun&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;zipCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;zipCode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;zipCode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Meta programming
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy"&gt;Proxy&lt;/a&gt;&lt;/strong&gt; obyekti sizga dasturni ishlash jarayonida (runtime) meta levelda muayyan operatsiyalarni intersept qila olish va o'ziga qulay shaklga keltira olish imkoniyatlarini taqdim etadi.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;intersept qilish&lt;/em&gt;&lt;/strong&gt; - dasturning biron operatsiyasini bajarilish jarayoni orasiga suqulib kirib unga ta'sir o'tkazish, zimdan kuzatish yoki o'zgartira olishlik. (dasturni ishlash jarayoni bu RAMda aktiv ishchi holatda bo'lishlik degani)&lt;br&gt;
&lt;strong&gt;&lt;em&gt;meta level&lt;/em&gt;&lt;/strong&gt; - ya'ni runtime vaqtida dasturlash tilining fundamental mexamizmlari ishlashiga aralasha olish yoki o'zgartira olish &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;Proxy&lt;/code&gt;lar muayyan turdagi muammolarni hal qilishda juda foydali mexanizm hisoblanadi. &lt;em&gt;&lt;strong&gt;&lt;a href="https://en.wikipedia.org/wiki/Cross-cutting_concern"&gt;Cross cutting aspects&lt;/a&gt;&lt;/strong&gt;&lt;/em&gt; bunga yaqqol misol bo'la oladi. Real misol sifatida esa Vue3 ning &lt;a href="https://vuejs.org/guide/extras/reactivity-in-depth.html#how-reactivity-works-in-vue"&gt;reaktiv&lt;/a&gt; tizimini keltirish mumkin, ular &lt;code&gt;Proxy&lt;/code&gt;lardan juda samarali foydalanishgan va oldingi versiyadagi hacky yechimni (&lt;code&gt;Object.defineProperties()&lt;/code&gt;) &lt;code&gt;Proxy&lt;/code&gt;lar bilan almashtirishgan. Bu haqida boshqa maqolalarimizda batafsil to'xtalib o'tamiz.&lt;/p&gt;

&lt;h3&gt;
  
  
  Iterator va generatorlar
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;ES6 dagi menga eng yoqqan imkoniyatlardan biri&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bular tilning eng kam tilga olinadigan biroq eng ko'p ishlatiladigan imkoniyatlarini asosida yotuvchi mexanizmlardir (&lt;code&gt;Promise&lt;/code&gt;, &lt;code&gt;async/await&lt;/code&gt;, etc). JSchilar uchun katta imkoniyatlarni ochib beradi. Bular alohida e'tiborga loyiq mazvular bo'lgani uchun ular haqida ham alohida post yozish istagi bor. Hozircha esa quyidagi &lt;a href="https://gist.github.com/humoyun/1bbdb4b36300c350e0c63db73b82fbcb"&gt;code-snippet&lt;/a&gt; lar bilan cheklanamiz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// DOM traversal &lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;parent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;div&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`
  &amp;lt;div id="subTree"&amp;gt;  
    &amp;lt;form&amp;gt;    
      &amp;lt;input type="text"/&amp;gt;  
    &amp;lt;/form&amp;gt;  
    &amp;lt;p&amp;gt;Paragraph&amp;lt;/p&amp;gt;
    &amp;lt;span&amp;gt;Span&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;subTree&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// recursive yechim&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;traverseDOMRecursive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;elem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cb&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;cb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;elem&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;elem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;elem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firstElementChild&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;elem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;traverseDOMRecursive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;elem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cb&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;elem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;elem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nextElementSibling&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nodeName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;traverseDOMRecursive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;subTree&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// generatorlar bilan&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;traverseDOMGenerator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;elem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nx"&gt;elem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;elem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;elem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firstElementChild&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;elem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;traverseDOMGenerator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;elem&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;elem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;elem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nextElementSibling&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="c1"&gt;// for loop ni ichida ishlatilishiga e'tibor bering&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nf"&gt;traverseDOMGenerator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;subTree&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;element&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nodeName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Endi esa iteratorlarga misol:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Range&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;step&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;iterator&lt;/span&gt;&lt;span class="p"&gt;]()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;step&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Range&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// ajoyib emasmi!&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;([...&lt;/span&gt;&lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)]);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;([...&lt;/span&gt;&lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)]);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;([...&lt;/span&gt;&lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Block scoped o'zgaruvchilar
&lt;/h3&gt;

&lt;p&gt;ES6 tilga yangi o'zgaruvchilarni olib kirdi va ular &lt;code&gt;var&lt;/code&gt; ni o'rnini deyarli to'liq egalladi. ES6 gacha, JSda faqatgina funksional va global scopelar bor edi, &lt;code&gt;let&lt;/code&gt; va &lt;code&gt;const&lt;/code&gt; qo'shilishi tufayli JSda endi &lt;a href="https://dev.to/sandy8111112004/javascript-introduction-to-scope-function-scope-block-scope-d11#:~:text=A%20block%20scope%20is%20the,only%20within%20the%20corresponding%20block."&gt;block scope&lt;/a&gt; ham mavjud. &lt;code&gt;var&lt;/code&gt; bilan e'lon qilingan o'zgaruvchilarda &lt;code&gt;locality&lt;/code&gt; mexanizmi yo'q edi shuning uchun odatda global scope da e'lon qilingan boshqa o'zgaruvchilar bilan to'qnashuv bo'lishini oldini olish qiyin edi. Block scope esa bu muammoni hal qildi.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;locality&lt;/strong&gt;&lt;/em&gt; - biron o'zgaruvchining dastur kodining faqat o'ziga tegishli qismidagina &lt;code&gt;{}&lt;/code&gt; mavjud bo'la olishi.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;blockExample&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="c1"&gt;// bu funksional scope&lt;/span&gt;
 &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// bu block scope&lt;/span&gt;
   &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;if blokining ichida&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;else blokining ichida&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;
 &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;funksiyani ichidagi&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;blockExample&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;global x&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;const&lt;/code&gt; o'z nomi bilan constanta ya'ni o'zgarmas qiymatni bildiradi va u bilan e'lon qilingan o'zgaruvchilarga yangi qiymat berishga urinilsa dastur xatolik qaytaradi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Template literal
&lt;/h3&gt;

&lt;p&gt;Stringlar bilan ishlash imkoniyatlarini yanada kengaytirdi. Qulay interpolyatsiya &lt;code&gt;${}&lt;/code&gt; sintaksini olib kirdi.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ahmad&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;HOLIDAY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Iyd al-Fitr&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="c1"&gt;// ES6 dan oldin: &lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ning sevimli bayrami bu &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;HOLIDAY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// ES6 dan keyin:&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;ning sevimli bayrami bu &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;HOLIDAY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// yoki&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;multiLineString&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`Cross-cutting concerns are parts 
of a program that rely on or must affect many other 
parts of the system`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Va hokazo!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Yana bir eng muhim yangilik bu: JS ni reliz sikli (tilga yangi imkoniyatlarni davomiy tarzda qo'shib borish davri) yillik ko'rinishga o'tkazildi.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Biroz TC39 haqida
&lt;/h2&gt;

&lt;p&gt;Endi TC39 haqida bir-ikki luqma gap aytamiz. Bu ishchi guruh  yetakchi web kompaniyalar a'zolaridan tashkil topgan bo'lib asosiy maqsadi ECMAScriptni rivojlantirib borishdan iborat, bu esa o'z navbatida JSni standartlashtirib borish degani. Bundan tashqari TC39 JSchilar keng ommasiga tilga o'zlarining takliflarini (&lt;a href="https://github.com/tc39/proposals"&gt;proposal&lt;/a&gt;) berish imkoniyatini bajaruvchi platforma sifatida ham faoliyat yuritadi. Bu takliflar ochiq shaklda butun dunyodagi webchilar ommasiga qo'yiladi va muayyan vaqt davomida belgilangan &lt;a href="https://tc39.es/process-document/"&gt;struktura&lt;/a&gt; bo'yicha bir nechta bosqichlarda muhokama qilinadi. Quyida bu haqida biroz to'xtalamiz. &lt;/p&gt;

&lt;h3&gt;
  
  
  TC39 bosqichlari
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Stage 0 (strawman)&lt;/em&gt;&lt;/strong&gt;: Bu norasmiy bosqich bo'lib, taklif har qanday erkin shaklda bo'lishi mumkin, demak hamma ishtirok eta oladi. Taklifingizni kirgazish uchun esa TC39ning a'zosi bo'lishingiz yoki ECMA Internationalga &lt;a href="https://tc39.github.io/agreements/contributor."&gt;registratsiya&lt;/a&gt; qilishingiz talab etiladi. Registratsiyadan so'ng taklifingizni &lt;a href="https://esdiscuss.org"&gt;esdiscuss&lt;/a&gt; mailing listi orqali bildirishingiz yoki boshqa takliflarni kuzatib borishingiz mumkin.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;Stage 1 (proposal)&lt;/strong&gt;&lt;/em&gt;:  &lt;strong&gt;&lt;em&gt;Strawman&lt;/em&gt;&lt;/strong&gt; dan so'ng, biron &lt;strong&gt;TC39&lt;/strong&gt; a'zosi sizning taklifingiz keyingi bosqichga o'tish uchun qo'llab-quvvatlashi kerak. Bu a'zo berilgan taklif nima uchun foydali ekanligini tushuntirishi va u amalga oshirilganda qanday ishlashi va ko'rinishini tasvirlashi kerak 🐥.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;Stage 2 (draft)&lt;/strong&gt;&lt;/em&gt;:  Bu bosqichda taklifning to'liq spesifikatsiyasi ishlab chiqiladi va eksperimental hisoblanadi (do it at your own risk ☢️ ). Agar taklif bu bosqichga yetib kela olsa, odatda &lt;strong&gt;TC39&lt;/strong&gt; bu taklifni qachondir JSni spesifikatsiyasiga kiritilishini kutadi.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Stage 3 (candidate)&lt;/em&gt;&lt;/strong&gt;: Bu bosqichda berilgan taklif to'liq deb hisoblanadi va imzolanadi. Bu bosqichdan keyin taklifga o'zgartirishlar kiritish juda ham kam bo'lib, faqatgina juda kiritik muammolari topilsagina va ko'p muddatli foydalanishdan so'ngina amalga oshiriladi. Ushbu bosqichda taklifni qo'rqmasdan ishlatsangiz bo'ladi chunki ma'lum muddatdan so'ng, taklif xavfsiz tarzda so'nggi bosqichga o'tkaziladi.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Stage 4 (finished)&lt;/em&gt;&lt;/strong&gt;: Bu yakuniy bosqich hisoblanadi. Agar taklif bu bosqichgacha yetib kelsa uni endi bemalol formal tarzda ECMAScript standartining spesifikatsiyasiga qo'shildi desa bo'ladi 🏁. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bunday sog'lom va dinamik usulda tilga yangi imkoniyatlarni kiritib borish juda ham muhim jarayon hisoblanadi. Buning natijasida JS bugungi dunyoning tez o'zgarib boruvchi va murakkab talablariga labbay deb javob bera oladi.&lt;br&gt;
Quyida ushbu taklif (proposal) lardan ba'zilarini keltirib o'tamiz.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/tc39/proposal-class-fields"&gt;Private class &lt;code&gt;field&lt;/code&gt;lari&lt;/a&gt; va nihoyat &lt;code&gt;class&lt;/code&gt;larda &lt;code&gt;access modifier&lt;/code&gt;larni (&lt;code&gt;private&lt;/code&gt;,&lt;code&gt;static&lt;/code&gt;) qo'llash imkonini beruvchi sintaksis.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/tc39/proposal-observable"&gt;&lt;code&gt;Observable&lt;/code&gt;lar&lt;/a&gt; &lt;code&gt;stream&lt;/code&gt;larga asoslangan reaktiv dasturlash paradigmasini olib kiradi JSga. Shaxsan menga eng yoqqan takliflardan biri. Bu haqida ham alohida maqola yozish niyat bor. RxJS (Angular) bilan ishlab ko'rganlar bo'lsa buni nimaligini juda yaxshi tushunishadi, endi bu library emas balki native 🚀 !!! &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/tc39/proposal-pipeline-operator"&gt;Pipeline operatori&lt;/a&gt; UNIXdagi &lt;code&gt;pipe&lt;/code&gt; utilitasiga o'xshash asosan funksional tillarga tegishli bo'lgan mexanizmni JS fuksiyalarida ishlatish imkonini beradi.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/tc39/proposal-bind-operator"&gt;Yangi &lt;code&gt;bind&lt;/code&gt; operatori&lt;/a&gt; &lt;code&gt;Function.prototype.bind&lt;/code&gt; ni yanada elegant tarzda ishlatish imkonini beruvchi yangi sintaksis&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ushbu maqola Internetdan olingan ma'lumotlar yordamida tayyorlandi. Har qanday taklif va mulozalar bosh ustiga, ularni pastdagi sharhlar bo'limida qoldirishingiz mumkin. Maqsadimiz o'zbek tilida IT bilan bo'gliq sifatli contentni ko'paytirish va ularni hammaga qulay uslubda tarqatishdir. Bunda eng katta muammolarimizdan biri bu sohaga oid inglizcha atamalarni qanday qilib tushinarli tarzda, o'z ma'nosidan chiqib ketmagan holda qisqa va lo'nda shaklda yetkazishdir. Chunki to'g'ridan to'g'ri (direct) tarjima ko'p hollarda haddan tashqari uzun, tushunarsiz va o'zining dastlabki ma'nosidan chiqib ketgan shaklga kelib qolishidir. Shuning uchun &lt;strong&gt;sarbast&lt;/strong&gt; (erkin) uslubni (postimizda boshida ham bu haqida biroz to'xtalgandik) sinab ko'rishga qaror qildik. Haligi aytishgandek: Best of both worlds :) !&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>javascript</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
