Ky artikull është pjesë e një serie që flet për "Programimin funksional"

Në këtë pjesë të parë, ne do të flasim për paradigmat e programimit. Prekja e paradigmave imperative dhe deklarative. Duke u bazuar në disa shembuj dhe krahasime minimale. Në fund, ne do të hedhim një vështrim me perspektivë evolucionare në disa paradigma.

Tabela e përmbajtjes

  • Paradigmat e programimit
  • Paradigmë imperative
  • Paradigma deklarative
  • Milje shtesë në shembullin e shumës
  • Perspektiva e evolucionit
  • konkluzioni

Paradigmat e programimit

Një paradigmë programimi është një stil ose një "mënyrë" programimi. Pra, disa gjuhëna detyrojnë të shkruajmë në një paradigmë të caktuar. Gjuhët e tjera i mbajnë opsionet të hapura për programuesin. ku çdo paradigmë ndjek një grup konceptesh. (Ju lutemi hidhini një sy fotos së titullit - nëse nuk e keni bërë tashmë, kështu që fjala "paradigmë" mund të ketë kuptim).

Në historinë e programimit kompjuterik, inxhinierët kanë zhvilluar gjuhë të ndryshme. Çdo gjuhë kishte një paradigmë (ose më shumë) në mendje. Këto paradigma i përkasin njërës prej këtyre 2 kategorive kryesore:

1. Paradigma imperative

Në të cilën rrjedha e kontrollit ështëe qartë, ku programuesi udhëzon programin si të ndryshojë gjendjen. Ku përfshin më shumë paradigma:

  • Paradigma Strukturore
  • Paradigma e orientuar nga objekti

2. Paradigma deklarative

Në të cilën rrjedha e kontrollit është i nënkuptuar, ku programuesi udhëzon programin çfarë duhet bërë pa përcaktuar siduhet bërë. Ku përfshin më shumë paradigma:

  • Paradigma Funksionale
  • Paradigma logjike
  • Paradigma matematikore
  • Paradigma Reaktive

Përmbledhje

Shumica e gjuhëve i përkasin ose paradigmës Imperative ose Deklarative, ku çdo paradigmë ka një sërë konceptesh për t'u ndjekur.

Le të flasim më shumë për dy paradigmat kryesore:

Paradigmat imperative dhe deklarative.

1. Paradigma imperative

Paradigma imperative ka evoluar pak sa i përket strukturës(për shkak të Paradigmës Strukturore), por ajo ende ka probleme:

  • T'i tregosh programit si t'i bëjë gjërat (rrjedha e kontrollit ështëe qartë)
  • Gjendja e ndarjes

Për ta bërë pak më afër idenë. Le të marrim dy analogji për dy problemet e mësipërme (nëse i kuptoni problemet, mund të kaloni pjesën tjetër dhe të kaloni te shembulli):

Problemi 1: Ti tregosh programit se si t'i bëjë gjërat (rrjedha e kontrollit ështëe qartë)

  • Rasti: Imagjinoni 1000 punonjës me një drejtues që i drejton ata drejt një misioni. Drejtuesi fillon t'u thotë 1000 punonjësve si t'i bëjnë gjërat një nga një. Sa e keqe mendoni se do të jetë kjo? Jam shumë i sigurt se mund të shihni se ky stil i menaxhimit të nivelit mikro ka rreziqe të mëdha, gracka dhe as që do të funksionojë.
  • Zgjidhja: Gruponi njerëzit në fushat e përgjegjësive dhe delegoni një drejtues ekipi për secilin grup. Udhëheqësi i secilit grup duhet të di sitë bëjë gjërat për hir të misionit. Kjo do të zvogëlojë shumë kompleksitetin, pengesën dhe do të jetë shumë më e lehtë për t'u menaxhuar.
  • Në këtë analogji
    — Udhëheqësi i misionit = Programues.
    — Drejtuesit e grupeve = Funksionet e nivelit më të lartë
    — Punonjësit në secilin grup = Linjat e kodit
  • Përfundim: kur aplikojmë strukturë organizative të rendit më të lartë në nivel programi, jeta jonë do të jetë shumë më e qetë.

Problemi 2: Gjendja e ndarjes

  • Rasti:Imagjinoni veten një baba, ju keni 2 fëmijë. Ju keni krijuar një llogari bankare të përbashkët për ta. Çdo muaj ju vendosni 1000 dollarë në atë llogari. Të dy fëmijët tuaj nuk janë në dijeni që llogaria është e përbashkët. Kështu që të dy mendojnë se secili ka 1000 dollarë për të shpenzuar për veten e tij/saj. Në fund të muajit, ju jeni të dëshpëruar sepse keni marrë vesh se përfundoni me -$1000 në atë llogari.
  • Zgjidhja:Çdo fëmijë duhet të ketë llogari të veçantë dhe shumë të caktuar mujore
  • Në këtë analogji:
    — Fëmijët = Funksionet
    — Llogaria e përbashkët bankare = shteti i përbashkët.
  • Përfundim:Kur funksionet tuaja ndajnë të njëjtën gjendje. Ata e përdorin atë në mënyrë të pandërgjegjshme. Kjo do të prishë gjendjen e programit tuaj edhe me vetëm 2 funksione. Pra, është gjithmonë më mirë që çdo funksion të ketë gjendjen e tij të pavarur për t'u përdorur.

Shembull mbi paradigmën imperative

Le të shohim se si sum mund të zbatohet në Paradigmën Imperative

Pse kjo konsiderohet e domosdoshme?

  1. Tregimi i programit se si t'i bëjë gjërat (rrjedha e kontrollit është e qartë): Ne i tregojmë ciklit for si të funksionojë në mënyrë eksplicite. Gjithashtu ne aksesojmë çdo element në grup në mënyrë eksplicite.
  2. Gjendja e ndarjes: ndryshorja result është një gjendje e përbashkët, e cila ndryshon në çdo përsëritje (ndarja e gjendjes në probleme më të mëdha do të jetë shumë më e vështirë për t'u trajtuar).

2. Paradigma deklarative

Paradigma deklarative është kur programuesi udhëzon programin çfarë duhet bërë pa përcaktuar se si.

Në kontrast me paradigmën imperative, paradigma deklarative nuk është thjesht e domosdoshme. Me fjalë të tjera, në paradigmën deklarative ne shkruajmë funksione që:

  • Përshkruani çfarë duhet të performojë një program në vend të si(të nënkuptuarkontrollojë rrjedhën).
  • Prodhoni asnjë efekt anësor (të cilat do t'i diskutojmë më vonë).

Shembull mbi Paradigmën Deklarative

Ne pamë se si funksioni sum mund të zbatohej në Paradigmën Imperative, le të shohim se si mund të zbatohet në mënyrë deklarative

Magjike, apo jo? Por pse kjo konsiderohet deklarative?

  1. Përshkroi se çfarë duhet të performojë një program në vend të mënyrës (të nënkuptuarkontrolloni rrjedhën): Nuk ka përsëritës të qartë, nuk i tregon në mënyrë eksplicite ciklit se si të funksionojë ose si të aksesoni elementët. Kjo u arrit duke përdorur reduce.
  2. Nuk ka efekte anësore:Gjendja e përbashkët është një formë e efekteve anësore, e cila u eliminua plotësisht duke përdorur përbërjen e funksionit reduce dhe add.

Milje shtesë në shembullin e shumës

Po sikur të donim të sum vetëm numra çift?

Në mënyrë të domosdoshme do të bënim:

Por në mënyrë deklarative do të bënim:

Siç e shohim, nëse duam të krahasojmë të dyja paradigmat (Imperative dhe Deklarative), në Paradigma Deklarative (Paradigma funksionale në rastin tonë) është më shumë si ingranazhet ⚙️, ju i zhvilloni ingranazhet tuaja si njësi të veçanta, pastaj i shtoni ato kudo që ju nevojiten. Por në paradigmën Imperative është më shumë si brumë 🫓 pothuajse gjithçka përzihet dhe shkrihet në të njëjtën pjesë kodi (përveç nëse në fakt keni bërë punë të shkëlqyer duke bërë modele dizajni).

Në përgjithësi, Paradigma Deklarative është më shumë:

  • E parashikueshme
  • E testueshme
  • I ripërdorshëm
  • I personalizueshëm
  • E fshehtë
  • E mirëmbajtur
  • Kompozues

Disa nga këto pika nuk kanë domosdoshmërisht kuptim në kontekstin e shembullit sum, por do të kenë kuptim në artikujt e ardhshëm.

Perspektiva e evolucionit

Pasi të kuptojmë se kemi 2 paradigma kryesore Imperative dhe Deklarative, ku secila ka nënparadigma. Le të flasim tani më shumë rreth Paradigmave strukturore, të orientuara nga objektetdhe Paradigmave funksionale. nga perspektiva evolucionare.

Çdo paradigmë ka kufizuarnjë mënyrë programimi duke prezantuar diçka të re. Ku mund të themi se kërcimet më të mira ndodhën në:

  • Paradigma strukturore:Përdorimi i kufizuar i goto dhe “rrjedha e transferimit të kontrollit”duke futur strukturën në kodin tonë si if/else/then/loop dhe të tjerët. Me fjalë të tjera, ai kufizon rrjedhën e transferimit të kontrollit.
  • E orientuar nga objekti Paradigma:Kufizuar kryerja e polimorfizmit duke përdorur tregues për funksionet duke futurPolimorfizmin duke përdorur trashëgiminë.
  • Paradigma funksionale:gjendje e përbashkët e kufizuar dhe efektet anësore duke prezantuar Pandryshueshmëria.

Mbani në mend se çdo paradigmë mund të përdorë një ose më shumë koncepte të paradigmave të tjera (për shembull, të dyja paradigmat e orientuara nga objekti dhe ato funksionale përdorin koncepte të paradigmës strukturore).

konkluzioni

Në jetën reale, ne kemi paradigma të ndryshme me stile të ndryshme që kanë nevojë për nivele të ndryshme aftësish. Praktikimi i më shumë paradigmave do t'ju japë më shumë superfuqi, OO ka superfuqitë e veta dhe FP gjithashtu. Sa më të fortë të bëheni në këto paradigma, aq më të fuqishme do të jenë zgjidhjet tuaja, aq më të sigurt do të ndihen njerëzit rreth jush.

Faleminderit shumë që gjetët kohë duke lexuar këtë artikull. Unë jam duke gatuar ato të radhës në serial. Ju lutemi, më jepni komente dhe më tregoni se çfarë mendoni në komentet për këtë artikull ose për artikujt e ardhshëm.

Ky është një artikull në një seri artikujsh që flasin për Programimin Funksional

Në këtë seri artikujsh ne trajtojmë konceptet kryesore të Programimit Funksional. Në fund të serisë, do të jeni në gjendje t'i trajtoni problemet në një qasje më funksionale.

Kjo seri diskuton:

0. Një krahasim i shkurtër ndërmjet paradigmave të programimit (ky artikull)

  1. "Funksionet e klasës së parë"
  2. "Funksionet e pastra"
  3. "Kurrying"
  4. "Përbërja"
  5. Funktorët
  6. Monadat

Burimet

  1. https://blog.cleancoder.com/uncle-bob/2018/04/13/FPvsOO.html
  2. https://cs.lmu.edu/~ray/notes/paradigms/
  3. https://blog.cleancoder.com/uncle-bob/2014/11/24/FPvsOO.html
  4. https://blog.cleancoder.com/uncle-bob/2017/07/11/PragmaticFunctionalProgramming.html
  5. https://blog.cleancoder.com/uncle-bob/2012/12/19/Three-Paradigms.html
  6. https://en.wikipedia.org/wiki/Programming_paradigm
  7. https://en.wikipedia.org/wiki/Procedural_programming
  8. https://en.wikipedia.org/wiki/Functional_programming
  9. https://en.wikipedia.org/wiki/Non-structured_programming