Dasturlash

Deterministik Yadro, Nondeterministik Qobig‘i: Qanday Testlashni Osonlashtirish

21-sentabr, 2026, 09:380 ko'rish3 daqiqa o'qish
Deterministik Yadro, Nondeterministik Qobig‘i: Qanday Testlashni Osonlashtirish

14 yil oldin Gary Bernhardt “Functional Core, Imperative Shell” atamasini kiritdi. Bu atama testlash va determinizmni muhokama qilish uchun yaxshi asos bo'lib xizmat qiladi. Bu arxitektura kodni ikkita qismga ajratadi: funksional yadro va imperativ qobig‘i.

Funksional Yadro va Imperativ Qobig‘i

Funksional yadro biznes logikasiga e'tibor qaratadi va to'liq funktsional bo'lib, ya'ni IO va vujudga kelgan holatni yangilamaydi. Imperativ qobig‘i esa, tashqi bog'liqliklarni boshqaradi, holatni saqlaydi va tashqi dunyo bilan aloqada bo'ladi. Bu modelda yadro va qobig‘i farqli xususiyatlarga ega:

Disk Defragmenter tool in Windows XP
  • Yadro: qarorlar qabul qiladi, ko'p yo'nalishli ijro yo'llariga ega, dunyodan ajratilgan.
  • Qobig‘i: bog'liqliklarni boshqaradi, chiziqli ijro yo'llariga ega, dunyo bilan integratsiyalashadi.

Bu yadroni testlashni osonlashtiradi, chunki u to'liq funktsional va ajratilgan. Shuning uchun uni test qilishda hech narsa mock yoki stub qilish kerak emas.

Funksional Tozalik va Determinizm

To'liq funktsional dasturlashning testlashga mos keladigan xususiyatlari determinizmdir. Ya'ni, berilgan kirishlar oqimi uchun to'liq funktsional dastur har doim bir xil chiqishlar oqimini qaytaradi. Bu xususiyatni davlat mashinalari ham berishi mumkin.

Misol uchun, quyidagi kodni ko'ring:

function add(ns) { return ns.reduce((a, b) => a + b, 0) }
class AddMachine {
  #state = 0
  transition(input) {
    this.#state += input
  }
  get state() {
    return this.#state
  }
}

Bu kodda “add” funktsiyasi to'liq funktsional va deterministik. “AddMachine” esa, imperativ bo'lsa-da, bir xil kirishlar oqimi uchun bir xil holatni qaytaradi.

To'liq funktsional dasturlash yaxshi paradigma bo'lsa-da, har doim amaliy bo'lmaydi. Shuning uchun, “Deterministik Yadro, Nondeterministik Qobig‘i” konsepsiyasini qo'llash mumkin.

Determinizmni Tanishlash

Determinizm funktsional tozalikka qaraganda abstraktroq tushuncha bo'lishi mumkin. Deterministik bo'lmagan xatti-harakatlar misollari:


function add(ns) {
 return ns.reduce((a, b) => a + b, 0)
}

class AddMachine {
  #state = 0

  transition(input) {
    this.#state += input
  }

  get state() {
    return this.#state
  }
}
  • Tashqi bog'liqliklarni boshqarish
  • Asinxron va multithreadli operatsiyalar
  • Tarmoq orqali aloqa
  • Boshqa jarayonlar bilan aloqa
  • Mahalliy saqlashga yozish/oxish
  • Baza ma'lumotlariga aloqa
  • Operatsion tizimdan sana yoki vaqtni so'rash

Bu xatti-harakatlar biznes logikasida bo'lmasligi kerak. Agar ularni topishsangiz, ularni ajratib olish yoki yuqori darajaga ko'tarib, parametr sifatida kiritish mumkin.

Mavjud Koddagi Ishlash

Bu konsepsiya yangi loyihalarda emas, balki mavjud va eski kodlarda ham qo'llanishi mumkin. Deterministik yadrolarni topib, ularga guruhlash orqali testlashni osonlashtirish mumkin.


const output = add([1, 2, 3]) // 6

Misol uchun, eski Windows tizimlarida “Disk Defragmenter” bor edi. U fayllarni birlashtirib, o'qish tezligini oshirardi. Shunday qilib, mavjud kodda determinizmni defragmentatsiya qilish mumkin.

Har bir qattiq kodda bir yoki bir nechta toza deterministik davlat mashinalari bor. Ularni topish orqali dasturiy ta'minotni osonroq o'zgartirish va testlash mumkin.


const a = new AddMachine()
a.transition(1)
a.transition(2)
a.transition(3)

const output = a.state // 6

Bu maqola “Deterministik Yadro, Nondeterministik Qobig‘i” konsepsiyasini tushuntiradi va amaliy misollar beradi. Bu konsepsiya testlashni osonlashtirish va dasturiy ta'minotning ishonchliligini oshirish uchun foydali bo'lishi mumkin.

Asl manba: outdata.net

Manba: Hacker News
#determinizm #dasturlash #testlash #arxitektura #dasturiy ta'minot
Telegram da muhokama qilish