Sodda turlari va TypeScript-dagi sinflar

Mening TypeScript suhbatlarimda klassik Ob'ektga yo'naltirilgan dasturlash o'rniga odatiy turlar va funktsional uslublarni qanday ishlatish haqida so'rashadi. Buni qilish ham mumkinmi? Ushbu echimni tekshirishning foydasi bormi? Qisqa javob aniq "ha" dir, TypeScript-da OOP va sinflardan foydalanishning hojati yo'q, agar biz buni tanlasak, "tom ma'noda" turlaridan foydalanishimiz mumkin.

Bu erda u qanday ishlaydi.

Sinflarni belgilashning o'rniga biz qatorli diskriminantlar (kasaba uyushma turlarini kamaytiradigan) turini yaratishimiz mumkin, masalan:

turi XyzType = {turdagi: "x-turdagi"} | {turdagi: "y-turdagi} | {turdagi: "z-turdagi"}

Dasturda ushbu oddiy turlarni qanday ishlatish mumkinligini tushuntirib beraman, lekin avvalo OOPda qanday amalga oshirilishini ko'rib chiqaylik.

Aytaylik, biz keyingi ierarxiyani yaratamiz.

Yuqoridagi UML sinf diagrammasidan ko'rinib turibdiki, biz beshta sinfni tanishtirishimiz kerak. Mavhum bazaviy sinf ko'proq umumiy (bu holda "Shape"), qolgan to'rtta sinf maxsus beton sinflardir.

Bu OOP uslubidan foydalangan holda TypeScript-da bajarilishi.

Endi, biz buni qanday qilib so'zma-so'z asoslangan funktsional yechimga o'tkazamiz.

Oddiy qilib, biz g'amxo'rlik qiladigan umumiy turni aniqlash uchun biz kamsituvchi birlashma turlarini yaratamiz.

Bu erda amalga oshirish kerak:

OOP eritmasi bilan taqqoslaganda yanada aniqroq ko'rinadi. Amalda, bu. Xo'sh, biz nimaga erishmoqdamiz, bu yondashuvda nimani yo'qotmoqdamiz?

Olingan:

  • Niyatni aniq ifodalash
  • Kod va ma'lumotlar o'rtasida kamroq bog'liqlik
  • Ma'lumotlar uzatishga tayyor (masalan, fayl tizimiga yuborish yoki yozish uchun uni JSON.stringifikatsiya qilishingiz mumkin)

Yo'qotish:

  • Sinf ichidagi davlat boshqaruvi
  • Ma'lumotlarning kapsülasyonu
  • Birgalikda amalga oshirish
Funktsiya shunchaki uning kiritilishi (kirishlari) va mos keladigan chiqishi o'rtasidagi maxsus aloqadir.

Funktsional dasturlashda biz ma'lumotlarni koddan aniq ajratamiz, ya'ni har qanday argumentlarni qabul qiladigan, ularga yon ta'sir qilmasdan ishlaydigan va kerakli funktsionallik asosida natijani qaytaradigan funktsiyalarni taqdim etamiz: Boshqacha aytganda, funktsiya shunchaki uning kiritilishi (lari) va mos keladigan chiqishi o'rtasidagi maxsus aloqa.

Ammo OO dasturlashda aqllar to'plami mutlaqo boshqacha, ob'ektlar haqiqiy dunyo ob'ektlariga o'xshaydi, agar xohlasangiz: biz atributlar ko'rinishida (ob'ekt nima bilishini anglatadi) ma'lumotlarni o'z ichiga olgan ob'ektlar nuqtai nazaridan muammoli domenimizni modellashtirishga harakat qilamiz. yoki maydonlar, xatti-harakatlar usullar (nima qila olishlari mumkin) va uyushmalar (ular biladigan). Haqiqiy domenni modellashtirish bu jihatdan sodda bo'lishi mumkin, ammo ma'lumotlar sinf va sinf ierarxiyasi bilan yanada zich bog'langan. Ob'ektlar guruhining ma'lumotlarini taqdim etish qo'shimcha sinf ta'riflarini talab qilishi mumkin. Masalan, ma'lumotlarni uzatish uchun biz ko'pincha DTO-larni (Data Transfer Objects) ob'ektdan ma'lumotlarga va aksincha xaritalashni amalga oshirish uchun joriy etishimiz kerak.

Ehtimol, boshqa lavozimda men ushbu ikki xil paradigmaning ijobiy va salbiy tomonlarini batafsil ko'rib chiqsam. Ammo hozircha, shunchaki ta'kidlashim kerakki, ikkala yondashuvning afzalliklari va kamchiliklari mavjud. Ma'lumki, JavaScript (va uning o'rnini bosadigan TypeScript) ko'p paradigma dasturlash tili bo'lib, funktsional va ob'ektga yo'naltirilgan uslublarni qo'llab-quvvatlaydi. Oddiy haqiqat shundaki, biz yaratadigan kod yoki haqiqiy dunyoda mavjud bo'lgan kodlar asosan ikkalasini birlashtiradi. Shuning uchun biz dasturchilar sifatida ikkala uslubning ham ijobiy va salbiy tomonlaridan xabardor bo'lishimiz va shunga mos ravishda bizning muammolarimiz uchun tegishli echimni topishimiz kerak.