Niyə funksional proqramlaşdırma?

Sahil Appayev
Pragmatech

--

Funksional proramlaşdırma deklerativ proqramlaşdırma paradiqmalarından biridir. İlk funksional proqramlaşdırma dili (1958, Lisp) riyazi hesablamaları həyata keçirmək üçün xüsusi olaraq hazırlanmışdır. Məhz buna görə də funksional proqramlaşdırma riyazi funksiyalara əsaslanır. Funksional kod imperativ və ya obyekt yönümlü koddan daha qısa, daha proqnozlaşdırıla bilən və sınaqdan keçirilməyə daha asandır. Hal-hazırda funksional dillər getdikcə populyarlaşır və dünyanın ən böyük şirkətlərinin diqqətini cəlb edir. Məşhur funksional proqramlaşdırma dillərindən bəziləri: Lisp, Python, JavaScript, Erlang, Haskell, Clojure və s.

Son illər JavaScript-in populyarlığının çox artması funksional proqramlaşdırmaya marağın daha da artmasına səbəb olmuşdur. JavaScript dünyası çox aktivdir. Bir neçə il əvvəl yalnız bir neçə proqramçının funksional proqramlaşdırma məlumatı var idisə, son 5 il ərzində demək olar ki, hər bir geniş tətbiq kod bazası funksional proqramlaşdırma ideyalarından istifadə edir. Bunun üçün obyektiv səbəblər var:

  1. Funksional proqramlaşdırma daha kompakt və proqnozlaşdırıla bilən kod yazmağa imkan verir
  2. Kod analizini və testingi asanlaşdırır
  3. Pure funksiyalarda yan təsirlərin olmaması və dəyişməzlik sayəsində paralel proqramlaşrımaya şərait yaradır və s.

Funksional proqramlaşdırma dilləri iki qrupa bölünür:

  • Saf Funksional Dillər — Bu tip funksional dillər yalnız funksional paradiqmaları dəstəkləyir. Məsələn — Haskell.
  • Çirklənmiş funksional dillər — Bu tip funksional dillər funksional paradiqmaları və həmçinin imperativ stil proqramlaşdırmanı dəstəkləyir. Məsələn — LISP.

Funksional proqramlaşdırma (FP) istifadə edən proqram inkişafının əsas fərqləndirici xüsusiyyətləri:

  • Pure funksiyalar
  • Function composition
  • Rekursiya
  • Referential transparency
  • First class and high order functions
  • Immutable

Pure funksiyalar. Bu funksiyalar iki əsas xüsusiyyətə malikdir. Birincisi, həmişə başqa bir şeydən asılı olmayaraq eyni arqumentlər üçün eyni nəticə çıxarırlar.
İkincisi, onlara heç bir yan təsir yoxdur. Yəni hər hansı bir arqumenti və ya qlobal dəyişənləri dəyişdirir və ya bir nəticə çıxarırlar. Beləliklə proqramınızın anlaşılması ve test edilməsi çox asan olur. Pure funksiyalar paralel proqramlaşdırmaya şərait yardır.
Saf funksiyanın nümunəsi:

Biz bu funksiyaya hər dəfə eyni dəyərlər ötürdükcə bizə ancaq eyni nəticə qaytaracaq.

Function composition. Function composition bir neçə pure funksiyanın istifadə olunması ilə yeni funksiya yaratmaqdır. Beləliklə bir funksiyanın formalaşması və icra olunması üçün başqa pure funksiyaları istifadə etməklə funksiyalar kompozisaysı yaratmış oluruq.

Rekursiya. Funksiyanal proqramlaşdırma dillərində for döngüləri və while döngüləri olmur. Ona görə də təkrarlanmalar rekursiv olaraq həyata keçirilir. Rekursiya bir funksiyayının özünü çağırmasıdır. Riyazi faktorialı hesablamaq üçün rekursiv funksiya nümunəsi:

Referential transparency. Pure funksiyalar həmişə eyni dəyər daxil olunduqda enyi nəticə qaytardığı üçün pure funksiya istifadə etdiyimiz digər yerlərdə funksiyanın qaytardığı dəyəri birbaşa qeyd edə bilərik. Məsələn (6*5) funksiyası həmişə 30 qaytardığı üçün bu funksiyanı istifadə etdiyimiz yerdə birbaşa 30 ədədini yaza bilərik. Bu xüsusiyyət referential transparency adlanır.

First class and high order functions. Funksional proqramlaşdırmada first class funksiyalara birinci dərəcəli dəyişən kimi baxılır. Birinci dərəcəli dəyişənlər parametr kimi funksiyalara ötürülə, funksiyalardan geri qaytarıla və ya məlumat strukturlarında saxlanıla bilər. High order funksiyalar isə parametr olaraq funksiya və ya funksiyaları qəbul edir və ya nəticə olaraq bir funksiya qaytarır.

Immutable. Məlumat immutable olduqda dəyişən yarandıqdan sonra dəyişdirilə bilməz. Funksional proqramlamlaşdırma immutable verilənlər strukturu ilə kod yazarkən bizə əlavə imkanlar yaradır. Belə ki, dəyişməz verilən növünü fərqli bir thread`də istifadə etdiyimizdə dəyişməyəcəyi üçün əminliklə istifadə edə bilirik. Bu xüsusiyyət funksional proqramlaşdırmada pararlel proqramlaşdırmanı mümkün edir.

Digər tərəfdən immutable bir obyekti dəyişdirmək istəsək, bunu edə bilmirik. Bunun əvəzində yeni dəyəri olan yeni bir obyekt yaradırıq. Bu xüsusiyyət yaddaşdan daha çox istifadə olunmsına gətirib çıxardır.

İndi isə gəlin funksional proqralaşdırma (FP) ilə bu gün populyar olan obyekt yönümlü proqramlaşdırma (OOP) arasında nə kimi fərqlər var ona nəzər yetirək.

--

--