Interview paytida sizdan "Procedural va Functional Programming o'rtasidagi farqni aytib ber" deyishsa havotirga tushishga xojat yo'q. Ushbu postda siz bilan asosan Functional Programming va uning boshqa Paradigmalardan nima ajratib turishi haqida gaplashamiz.
FP, What?
Functional Programming, qisqacha qilib FP bu deklarativ dasturlash uslubi bo'lib murakkab muammolarni ketma-ket funksiyalar orqali hal qilishga o'xshaydi. Funksiya deganda siz-u biz kundalik tarzda yozadigan emas, balkim ko'proq matematik funksiyalar nazarda tutilayabdi ya'ni ular shared state (umumiy holat) yoki mutable (o'zgaruvchan) qiymatlarsiz kod yozish degani.
- Imperative: Hello Otabek yozuvini bufferga yozasan, uni keyin standart outputga...
xullas hali ko'p gapiradi
- Declarative: Hello Otabek yozuvini ekranga chiqar:
print("Hello Otabek")
Immutability
Noto'g'ri eshitmadingiz, FP ning asosiy konsepsiyalaridan biri bu immutability ya'ni o'zgarmaslik. O'zgaruchilar declare (e'lon) qilingandan keyin ularni o'zgartira olmaysiz. Bu huddi u yerda o'zgaruvchi emas hamma qiymatlar konstantalardan iborat degandek gap.
Tasavvur qiling, dastur yaratdingiz va uni ishga tushurdingiz. Unda declare qilgan o'zgaruvchilaringiz hech qachon o'zgarmasligini bilsangiz, try-except, catch-throw kabi statementlar ishlatasizmi? Albatta yo'q chunki ular hech qachon o'zgarmaydi va dasturda bug paydo bo'lmaydi (agar o'zingiz buggy kod yozmagan bo'lsangiz).
Recursion
Odatda ishni takror qilish yoki biror narsani iteratsiya qilishda Loop (while, for, ... looplar) tushunchasidan foydalanamiz. Ammo loop da o'zgaruvchi bor va u state saqlaydi. Tepadagi tamoyil o'zgaruvchanlikdan qaytarayabdi. Bu yerda sizga rekursiya yordamga keladi.
Rekursiyada base case tushunchasi bor va u qachon butunlay funksiyani chaqirishdan to'xtash kerakligini bildiruvchi qoida xisoblanadi. Har bir funksiya qaytargan qiymatni yo'qotib qo'ymaslik uchun stack ma'lumot tuzilmasidan foydalanadi, bunga sabab esa LIFO tamoyili. Qachon base case to'xtashlikni buyursa o'sha ondan stackni yuqorisidan elementlar ketma-ket olib natijalar ustida siz buyurgan ish bajariladi.
# Necha marta desangiz shuncha salom beradi.
def salom_de(marta: int):
if marta == 0: # base case, aynan shu qachon to'xtashlikni aytadi.
return
print("Salom!")
return salom_de(marta - 1)
salom_de(5)
Pure functions
Pure function bu toza funksiya degani (ha cho'milib yuradida, o'ziga qarab). Har doim bir xil input bersangiz, bir xil output qaytaradi. Hech qanday side-effect mavjud bo'lmagan funksiya.
Pure function juda tez, bunga sabab cache qilsa bo'ladi. Chunki u doim bir xil inputga bir xil output qaytaradi va hech qachon o'zgarmaydi. Xullas tarif bersangiz so'z yetmaydi, ishonavering...
High Order vs First class Functions
FPdagi eng kerakli tushunchalardan biri bu First-class function tushunchasi. Ya'ni har qanday funksiya qiymat sifatida qaraladi va ularni funksiyaga argument sifatida bersa bo'ladi yoki qayerdadir saqlasa bo'ladi. Misol uchun:
# Istasangiz def, istansaigz lambda funksiya yozing
five = lambda : 5
six = lambda : 6
def add(x, y):
return x + y
add(five() + six()) # 5 + 6 degani bu
Yana bir muhim tushunchalardan biri bu High order function. Ya'ni funksiyalar funksiyalarni argument sifatida qabul qila olishdimi, demak javob sifatida qandaydir aniq qiymatni emas balkim funksiyani qaytara oladi degani. Misol uchun:
# funksiyani argument sifatida oladi
def apply_twice(func, x):
return func(func(x))
def add_two(n):
return n + 2
result = apply_twice(add_two, 5)
# func(func(x)) xisobiga 2 marta chaqiriladi
# add_two(add_two(5)) => add_two(2 + 5) => add_two(7)
# yana bir bor add_two(7) => 9
print(result) # 9
Procedural vs Functional
Procedural programming bu siz har doim yozadigan odatiy uslubdagi kodingizni olib qarasangiz bo'ladi. U yerda o'zgaruvchilar, funksiyalar, statementlar, va hokazolar mavjud. Ammo Functional Programmingda holat umumman boshqacha, qisqacha shu : )
Conclusion
Pros va cons haqida yozmaganim sababi postda deyarli siz bilishingiz mumhim bo'lgan eng kerakli narsalar yozildi. FP da terminlar juda ko'p va ularni barchasi matematika olamiga mansub. Ularni o'zingiz qiziqib o'rgansangiz yaxshi mavzular bor. Post asosan qisqa va ilk qadam uchun deb o'ylayman.
Endi qo'rqmasdan Functional va Procedural programming o'rtasidagi farqni aytib bera olasiz. Cheers!