Xulosa va kompozitsiya

Smoke Art Cubes to Smoke - MattysFlicks - (CC BY 2.0)
Eslatma: Ushbu dastur "Kompozitsiya dasturiy ta'minoti" seriyasining (hozir kitob!) JavaScript ES6 + da funktsional dasturlash va kompozitsion dasturiy texnikani o'rganishga bag'ishlangan. Yangiliklarni kuzatib boring, xabardor bo'lib boring; Biz bilan qoling. Kelishi mumkin bo'lgan yana ko'p narsalar!

Dasturiy ta'minotni ishlab chiqish jarayonida men qanchalik ko'p rivojlangan bo'lsam, men poydevorni shunchalik qadrlayman - boshlang'ich bo'lganimda ahamiyatsiz bo'lib tuyulgan, ammo hozir tajriba foydasi bilan chuqur ahamiyatga ega bo'lgan tushunchalar.

"Karate jang san'atida [...] qora kamar uchun mag'rurlikning ramzi shunchalik uzoq vaqt kiyishki, boshlang'ich holatiga qaytish ramzi sifatida bo'yoq rangi oqarib ketadi." ~ Jon Maeda, "Oddiylik qonunlari. : Dizayn, texnologiya, biznes, hayot ”

Google lug'atiga ko'ra, abstraktsiya - bu "biron bir narsani uning assotsiatsiyasi, atributlari yoki aniq izdoshlaridan mustaqil ravishda ko'rib chiqish jarayoni".

Abstraktsiya so'zi lotincha fe'l-atvordan kelib chiqadi, ya'ni "tortib olish" degan ma'noni anglatadi. Menga bu tushuncha yoqadi. Xulosa bu narsalarni olib tashlash bilan bog'liq, ammo biz nimani olib tashlaymiz va nima oxiriga qadar?

Ba'zan so'zlarni boshqa tillarga tarjima qilishni yaxshi ko'raman va keyin ingliz tilida tarjima qilishni yaxshi ko'raman, chunki biz odatda ingliz tilida umuman o'ylamaydigan boshqa birlashmalar to'g'risida tushuncha hosil qilamiz. Men "mavhumlik" ni yahudiy va orqaga tarjima qilganimda, natija "bema'ni" bo'ladi. Menga ham yoqadi. G'oyib bo'lgan odam avtoulovda ishlaydi, nima qilayotgani to'g'risida faol o'ylamaydi ... shunchaki buni qilyapti.

Abstraktsiya bizga xavfsiz avtopilotda ishlashga imkon beradi. Barcha dasturiy ta'minot avtomatlashtirishdir. Etarli vaqtni hisobga olgan holda, kompyuterda nima qilsangiz ham, qog'oz, siyoh va tashuvchi kabutarlar bilan ishlashingiz mumkin. Dastur shunchaki qo'lda qilish uchun ko'p vaqt talab qiladigan barcha mayda-chuyda narsalar haqida qayg'uradi.

Barcha dasturiy ta'minot abstraktsiya bo'lib, biz barcha foydali ishlarni va ongsiz tafsilotlarni yashiramiz, bundan foyda ko'ramiz.

Ko'plab dasturiy jarayonlar qayta-qayta takrorlanmoqda. Agar muammolarni ajratish bosqichida biz takroran takrorlanadigan narsalarni qayta-qayta to'ldirishga qaror qilsak, bu ko'p keraksiz ishlarni talab qiladi. Hech bo'lmaganda ahmoqona bo'lar edi. Ko'p hollarda, bu amaliy bo'lmaydi.

Buning o'rniga, biz biron bir tarkibiy qismni (funktsiya, modul, sinf va hokazo) yozib, unga nom (identifikatsiya) berish va xohlaganimizcha takrorlash orqali ko'paytirishni olib tashlaymiz.

Parchalanish jarayoni bu abstraktsiya jarayonidir. Muvaffaqiyatli abstraktsiya natija mustaqil foydali va qayta tiklanadigan tarkibiy qismlar to'plamini anglatadi. Bundan biz dasturiy arxitekturaning muhim printsipini olamiz:

Dasturiy ta'minot echimlari tarkibiy qismlarga bo'linishi va yangi echimlarga qayta kiritilishi kerak, bunda ichki komponentlarning bajarilish tafsilotlari o'zgartirilmaydi.

Abstraktsiya - bu soddalashtirish harakati

"Oddiylik ravshanlikni ajratib olish va mazmunini qo'shishdan iboratdir." Jon Maeda, "Oddiylik qonunlari: dizayn, texnologiya, biznes, hayot"

Xulosa qilish jarayoni ikkita asosiy tarkibiy qismga ega:

  • Umumlashtirish - bu takroriy shakllarda o'xshashliklarni (ravshan) topish va mavhumlik ortida o'xshashlikni yashirish jarayoni.
  • Ixtisoslash bu abstraktsiyadan foydalanish, har bir foydalanish holati uchun har xil (mazmunli) narsalarni berish.

Abstraktsiya - bu kontseptsiyaning tub mohiyatini chiqarish jarayoni. Turli xil domenlardagi turli muammolar o'rtasidagi umumiy fikrni o'rganib chiqib, biz bir daqiqaga bosh bo'shligimiz tashqarisiga chiqishni va muammoga boshqa nuqtai nazardan qarashni o'rganamiz. Muammoning mohiyatini ko'rib chiqsak, yaxshi echim boshqa ko'plab muammolarga ham tegishli bo'lishi mumkinligini topamiz. Agar biz yechimni yaxshi kodlasak, biz dastur murakkabligini tubdan kamaytiramiz.

"Agar siz bir narsaga chuqur anglasangiz, unda hamma narsaga tegasiz." ~ Thhat Nhat Hanh

Ushbu printsip dasturni yaratish uchun zarur bo'lgan kodni tubdan kamaytirish uchun ishlatilishi mumkin.

Dasturda mavhumlik

Dasturiy ta'minotdagi mavhumlik ko'p shakllarga ega:

  • Algoritmlar
  • Ma'lumotlar tarkibi
  • Modullar
  • Sinflar
  • Ramkalar

Va mening shaxsiy sevimli:

“Ba'zida nafis ijro etish shunchaki vazifadir. Usul emas. Sinf emas. Tarkib emas. Bu shunchaki vazifadir. "Jon Karmak (Id dasturi, Oculus VR)

Vazifalar ajoyib mavhumliklar keltirib chiqaradi, chunki ular yaxshi mavhumlashtirish uchun zarur bo'lgan fazilatlarga ega:

  • Identifikatsiya - unga nom berish va uni turli kontekstlarda qayta ishlatish qobiliyati.
  • Tarkibi - murakkab funktsiyalarni shakllantirish uchun oddiy funktsiyalarni tuzish qobiliyati.

Tarkibi orqali mavhumlik

Dasturiy ta'minotda mavhumlik uchun eng foydali funktsiyalar - bu matematik funktsiyalar bilan modulli xususiyatlarni almashadigan sof funktsiyalar. Matematikada bir xil kirishda berilgan funktsiya har doim bir xil natijani beradi. Funktsiyalarni kirish va chiqish o'rtasidagi munosabatlar sifatida ko'rish mumkin. Ba'zi bir kirishlarni hisobga olgan holda, f funktsiyasi B ni chiqish sifatida chiqaradi. Siz A f va B o'rtasidagi munosabatni belgilaydi, deb ayta olasiz:

f: A -> B

Xuddi shunday, B va C o'rtasidagi munosabatni belgilaydigan g funktsiyasini ham aniqlashimiz mumkin:

g: B -> C

Bu to'g'ridan-to'g'ri A-dan C-gacha bo'lgan munosabatni belgilaydigan h h funktsiyasini taklif qiladi:

h: A -> C

Ushbu munosabatlar muammoli maydonning tuzilishini va sizning dasturingizda funktsiyalarni qanday shakllantirishingiz dasturingiz tarkibini shakllantiradi.

Yaxshi abstraktsiyalar tuzilishni yashirish orqali soddalashtiradi, h A -> B -> C ni A -> C ga tushiradi.

Less Code yordamida qanday qilib ko'proq qilish kerak

Abstraktsiya - bu kamroq kod bilan ko'proq ish qilishning kalitidir. Masalan, siz ikkita raqamni qo'shadigan funktsiyangiz borligini tasavvur qiling:

const add = (a, b) => a + b;

Ammo siz uni ko'paytirish uchun tez-tez ishlatasiz, shu raqamlardan birini tuzatish mantiqiy bo'lishi mumkin:

const a = qo'shish (1, 1);
const b = qo'shish (a, 1);
const c = qo'shish (b, 1);
// ...

Qo'shish funktsiyasini o'rganishimiz mumkin:

const add = a => b => a + b;

Va keyin qisman dastur yarating, birinchi argumentga funktsiyani qo'llang va keyingi argumentni oladigan yangi funktsiyani qaytaring:

const inc = qo'shish (1);

Endi biz 1 ga ko'paytirishimiz kerak bo'lganda qo'shish o'rniga inc-dan foydalanishimiz mumkin, bu esa kerakli kodni kamaytiradi:

const a = inc (1);
const b = inc (a);
const c = inc (b);
// ...

Bunday holda, inc faqat qo'shimchaning ixtisoslashtirilgan versiyasidir. Barcha egri funktsiyalar mavhumdir. Aslida, barcha yuqori darajadagi funktsiyalar bu bir yoki bir nechta dalillarni berish orqali ixtisoslashishingiz mumkin bo'lgan umumlashmalardir.

Masalan, Array.prototype.map () - bu ishlov berilgan qiymatlarning yangi qatorini qaytarish uchun funktsiyani massivning har bir elementiga qo'llash g'oyasini chiqaradigan yuqori darajadagi funktsiya. Buni yanada aniqroq qilish uchun xaritani egri funksiya sifatida yozishimiz mumkin:

const map = f => arr => arr.map (f);

Xaritaning ushbu versiyasi ixtisoslashuv funktsiyasini oladi va keyin massivni qayta ishlash uchun olib boradigan o'zining maxsus versiyasini qaytaradi:

const f = n => n * 2;
const doubleAll = xarita (f);
const doubleled = doubleAll ([1, 2, 3]);
// => [2, 4, 6]

Shuni yodda tutingki, doubleAll ta'rifiga arzimas miqdordagi kod kerak edi: map (f) - aynan shu! Bu aniq ta'rif. Bizning blokimiz sifatida foydali abstraktsiyalardan boshlab, juda kam yangi kod bilan juda murakkab xatti-harakatlarni qurishimiz mumkin.

Xulosa

Dasturiy ta'minot ishlab chiqaruvchilari o'zlarining butun kareralarini abstraktsiyalarni yaratishga va yozishga sarflaydilar - ko'pchilik abstraktsiya yoki kompozitsiyani yaxshi tushunmasdan.

Abstraktsiyalarni yaratayotganda, siz bu haqda chuqur o'ylab ko'rishingiz kerak va siz allaqachon mavjud bo'lgan yaxshi abstraksiyalardan xabardor bo'lishingiz kerak (har doim foydali xarita, filtrlash va qisqartirish kabi). Yaxshi abstraktsiyalarning xususiyatlarini tan olishni o'rganing:

  • Oddiy
  • Xulosa
  • Qayta foydalanish mumkin
  • Mustaqil
  • Parchalanadigan
  • Qayta ishlatiladigan

EricElliottJS.com saytida ko'proq ma'lumot oling

Funktsional dasturlash bo'yicha video darslar EricElliottJS.com a'zolari uchun mavjud. Agar a'zo bo'lmasangiz, bugun ro'yxatdan o'ting.

Erik Elliot "JavaScript dasturlarini dasturlash" (pulReilly) muallifi va DevAnywhere.io dasturiy ta'minot ustaxonasi asoschilaridan biri. U Adobe Systems, Zumba Fitness, Uoll-strit jurnali, ESPN, Bi-bi-si, shuningdek, Usher, Frank Okean, Metallica va boshqa ko'plab yozuvchilarning dasturiy tajribalariga hissa qo'shgan.

U dunyodagi eng go'zal ayol bilan uzoqdan ishlaydi.