Definujte a opíšte modulárne programovanie. "Zabudnuté" programovacie paradigmy. Všeobecná štruktúra modulu

  • 31.10.2019

Účel modulov

Standard Pascal neposkytuje mechanizmy na samostatnú kompiláciu programových častí s ich následnou montážou pred spustením. Je celkom pochopiteľné, že vývojári komerčných kompilátorov Pascal chcú do jazyka zahrnúť nástroje, ktoré zvýšia jeho modularitu.

modul je to samostatne skompilovaná programová jednotka, ktorá obsahuje rôzne komponenty deklaračnej časti (typy, konštanty, premenné, procedúry a funkcie) a prípadne niektoré spustiteľné príkazy iniciačnej časti.

Hlavným princípom modulárneho programovania je princíp „rozdeľuj a panuj“. Modulárne programovanie je organizácia programu ako súboru malých nezávislých blokov nazývaných moduly, ktorých štruktúra a správanie podliehajú určitým pravidlám.

Použitie modulárneho programovania uľahčuje testovanie programu a hľadanie chýb. Hardvérovo závislé podúlohy môžu byť striktne oddelené od ostatných podúloh, čo zlepšuje prenosnosť vytvorených programov.

Pojem „modul“ sa v programovaní začal používať v súvislosti so zavádzaním modulárnych princípov pri tvorbe programov. V 70. rokoch bol modul chápaný ako akýkoľvek postup alebo funkcia napísaná v súlade s určitými pravidlami. Napríklad: " Modul by mal byť jednoduchý, uzavretý (nezávislý), viditeľný (od 50 do 100 riadkov), mal by vykonávať iba jednu úlohu, mať jeden vstupný a jeden výstupný bod».

Parnas ako prvý viac-menej jasne formuloval hlavné vlastnosti softvérového modulu: „ Napísať jeden modul by malo stačiťminimálne znalosti o texte iného". Modul teda môže byť v súlade s definíciou akákoľvek samostatná procedúra (funkcia) najnižšej úrovne hierarchie (úroveň implementácie) aj najvyššej úrovne, na ktorej sa vyskytujú iba volania procedúr iných modulov.

Parnassus bol teda prvý, kto predložil koncepciu skrývania informácií v programovaní. Jediné syntaktické konštrukcie, ktoré existovali v jazykoch sedemdesiatych rokov minulého storočia, ako procedúra a funkcia, však nedokázali poskytnúť spoľahlivé ukrytie informácií, pretože podliehajú vplyvu globálnych premenných, ktorých správanie v zložitých programoch môže byť ťažko predvídať.

Tento problém by bolo možné vyriešiť iba vyvinutím novej syntaktickej konštrukcie, ktorá nie je ovplyvnená globálnymi premennými.

Takýto dizajn bol vytvorený a nazývaný modul. Pôvodne sa predpokladalo, že pri implementácii zložitých softvérových systémov by mal byť modul použitý spolu s postupmi a funkciami ako konštrukcia, ktorá kombinuje a spoľahlivo skrýva detaily implementácie konkrétnej čiastkovej úlohy.

Počet modulov v komplexe by teda mal byť určený rozkladom súboru úloh na nezávislé podúlohy. V krajnom prípade možno modul použiť aj na uzavretie iba jednej procedúry, ak je potrebné, aby lokálna akcia, ktorú vykonáva, bola pri akýchkoľvek zmenách zaručene nezávislá od vplyvu ostatných častí programu.

Prvýkrát špecializovanú syntaktickú konštrukciu modulu navrhol N. Wirth v roku 1975 a zahrnul ju do svojho nového jazyka Modula. Ako silno sa vlastnosti jazyka menia po zavedení modulového mechanizmu, dokazuje nasledujúca poznámka N. Wirtha, ktorú urobil o neskoršom jazyku Modula-2: „Moduly sú najdôležitejšou vlastnosťou, ktorá odlišuje Modula-2 jazyk od svojho predchodcu Pascal."

Moduly Turbo Pascal sú svojou organizáciou a použitím v programe blízke balíčkovým modulom (PACKAGE) programovacieho jazyka Ada. V nich, ako aj v balíkoch Ada, je explicitne alokovaná nejaká „viditeľná“ časť rozhrania, v ktorej sú sústredené popisy globálnych typov, konštánt, premenných a tiež sú uvedené názvy procedúr a funkcií. Vzhľad objektov v časti rozhrania ich sprístupňuje iným modulom a hlavnému programu. Telá procedúr a funkcií sa nachádzajú v spustiteľnej časti modulu, ktorú je možné pred používateľom skryť.

Obr.2. Postupnosť vývoja softvérového projektu

Význam modulov pre technológiu vývoja softvérových projektov možno demonštrovať na schéme na obr. 2.

Moduly sú skvelým nástrojom na vývoj aplikačných knižníc a výkonným nástrojom na modulárne programovanie. Dôležitou vlastnosťou modulov je, že kompilátor umiestňuje ich programový kód do samostatného pamäťového segmentu. Dĺžka segmentu nemôže presiahnuť 64 KB, ale počet súčasne používaných modulov je obmedzený len dostupnou pamäťou, ktorá umožňuje vytvárať veľké programy.

Modulová štruktúra

Každý modul má nasledujúcu štruktúru:

jednotka <имя_модуля>;

irozhranie

<интерфейсная часть>;

implementáciu

<исполняемая часть>;

<инициирующая часть>;

UNIT je tu rezervované slovo (jednotka); spustí hlavičku modulu;

<имя_модуля>- názov modulu (správny identifikátor);

INTERFACE - vyhradené slovo (rozhranie); spustí časť rozhrania modulu;

IMPLEMENTÁCIA - vyhradené slovo (vykonanie); spustí spustiteľnú časť modulu;

BEGIN je vyhradené slovo; spustí iniciačnú časť modulu; a začne sa stavba<инициирующая часть>voliteľné;

KONIEC - rezervované slovo - označenie konca modulu.

Modul teda pozostáva z hlavičky a troch komponentov, z ktorých každá môže byť prázdna.

Všeobecná štruktúra modulu je uvedená nižšie, doplnená o komentáre vysvetľujúce význam a účel každej časti modulu.

jednotka ID modulu;

{sekcia rozhrania}

rozhranie

(Táto časť popisuje interakciu tohto modulu) (s ostatnými používateľskými a štandardnými modulmi, ako aj) (s hlavným programom. Inými slovami - interakcia) (modulu s "vonkajším svetom". )

{Zoznam importu sekcií rozhrania}

(Identifikátory sú uvedené v tomto zozname oddelené čiarkami) (modulov, ktorých informácie o častiach rozhrania musia byť )

(aby boli dostupné v tomto module. Tu je vhodné popísať) (identifikátory iba tých modulov, z ktorých sú informácie) (používané v popisoch časti rozhrania tohto modulu.)

{Zoznam exportu sekcií rozhrania}

const (Exportovaný zoznam pozostáva z podsekcií konštantných deklarácií) typ (typy, premenné, hlavičky procedúr a funkcií) var (definované v tomto module, ale povolené na použitie) procedure (povolené vo všetkých ostatných moduloch a programoch, ktoré obsahujú názov) funkcia (tohto modulu v riadku jeho použitia. Pre procedúry a funkcie) (tu sú popísané iba hlavičky, ale s povinnou) (úplný popis formálnych parametrov.)

{Implementačná sekcia}

implementáciu

(Táto časť označuje implementačnú (osobnú) časť) (popisov tohto modulu, ktorý nie je dostupný ostatným) (modulov a programov. Inými slovami „vnútorná kuchyňa“).

{Zoznam importu sekcie implementácie}

(Identifikátory sú uvedené v tomto zozname oddelené čiarkami) (tie moduly, ktorých informácie o častiach rozhrania by mali byť) (byť dostupné v tomto module. Tu je vhodné popísať) (identifikátory všetkých potrebných modulov, informácie z) (ktoré sa nepoužívajú v popis časti rozhrania tohto) ( modul a ktorého použitie by nikto nemal vedieť) (ďalší modul. )

{Podsekcie interných popisov modulu}

label (Tieto podsekcie popisujú označenia, konštanty, typy,) const (premenné, procedúry a funkcie, ktoré popisujú) typ (algoritmické akcie vykonávané týmto modulom a) var (ktoré sú výlučne „osobným vlastníctvom“) procedure (iba tento modul . popisy nie sú dostupné žiadnej) funkcii (do iného modulu. Hlavičky procedúr a funkcií v tomto) (podsekcia môže byť uvedená bez zoznamu formálnych) (parametre. Ak sú hlavičky špecifikované s parametrami, tak) (ich zoznam musí byť identické s rovnakým zoznamom pre ) (zodpovedajúceho postupu (funkcie) v sekcii rozhrania)

{Časť Inicializácia}

(Táto časť špecifikuje príkazy úvodných nastavení,) (potrebné na spustenie správnej činnosti modulu. Operátori) (časti inicializácie modulu používané v programe,) (vykonané pri prvom spustení programu v rovnakom poradí) (poradie v ktorom sú identifikátory modulu popísané v ) (klauzula použitia. Ak sa nevyžadujú inicializačné príkazy, ) (potom slovo begin možno vynechať.)

koniec.

Hlavička modulu a vzájomné prepojenie modulov

Hlavička modulu pozostáva z rezervovanej slovnej jednotky, za ktorou nasleduje názov modulu. Pre správne fungovanie prostredia Turbo Pascal a možnosť pripojenia nástrojov uľahčujúcich vývoj veľkých programov, názov modulu sa musí zhodovať s názvom súboru na disku, ktorý obsahuje zdrojový kód modulu. Ak máme napríklad hlavičku modulu

jednotka základný náter;

potom musí byť zdrojový kód tohto modulu umiestnený na disku v súbore primer.pas.

Názov modulu sa používa na jeho prepojenie s inými modulmi a hlavným programom. Toto spojenie je vytvorené špeciálnou ponukou:

používa <список модулей>

Tu POUŽITIE– vyhradené slovo (používa);

<список модулей>- zoznam modulov, s ktorými je nadviazaná komunikácia; položky zoznamu sú názvy modulov oddelené čiarkami.

Ak sú v programe použité moduly, potom vetapoužíva <список модулей> sa musí objaviť hneď za názvom programu, t.j. by mal otvoriť sekciu popisov hlavného programu. Moduly môžu používať iné moduly. V moduloch klauzula o použití<список модулей>sa môže objaviť hneď po slove rozhranie alebo hneď po slove implementácia. Povolené sú aj dve doložky o použití, t.j. môže stáť sem a tam.

Časť rozhrania

Otvorí sa časť rozhrania s rezervovaným slovom ROZHRANIE. Táto časť obsahuje deklarácie všetkých globálnych objektov modulu (typy, konštanty, premenné a podprogramy), ktoré musia byť dostupné hlavnému programu a (alebo) iným modulom. Pri deklarovaní globálnych podprogramov sa v časti rozhrania uvádza iba ich hlavička, napríklad:

postup AddC(x,y: komplex, var z: komplex);

postup MulC (x,y: komplex, var z: komplex);

V akejkoľvek profesii, nielen v programovaní, zažívate počas projektu rôzne emocionálne stavy:

  • Prvým je nadšenie z vyhliadok a príležitostí.
  • Potom príde vzrušenie. Prvé chyby a ťažkosti vás len provokujú a nútia váš mozog a predstavivosť pracovať naplno.
  • Nasleduje koncentrácia. V určitom okamihu prestanete venovať pozornosť upozorneniam a menším chybám, čím odložíte riešenie týchto problémov na neskôr.
  • V dôsledku toho strácate motiváciu. Opravíte jednu chybu, objavia sa tri. Pokúšate sa pridať novú funkciu, ale hodíte nápad do koša, pretože na ňom nechcete tráviť veľa času.

Niektorí ľudia si myslia, že je to normálne: vždy stojí za to prijať a žiť tento cyklus. V skutočnosti je všetko o niečo jednoduchšie a riešenie nespočíva v oblasti psychológie, ale v prístupe k tvorbe kódu.

Klasický problém s programovaním

V západnej literatúre existuje výraz „veľká guľa bahna“ na opis architektúry programu. Preložme si to doslovne. Graficky možno „veľkú guľu špiny“ znázorniť ako body na kruhu, ktoré symbolizujú funkčné prvky a rovné čiary – spojenia medzi nimi:

Znie to ako vaše oči pred odovzdaním projektu, však?

Toto je ilustrácia zložitosti, s ktorou musíte pracovať, koľko pripojení je potrebné zvážiť, ak sa vyskytne chyba.

Programovanie nie je jedinečná disciplína: tu môžete a mali by ste uplatniť skúsenosti z iných oblastí. Vezmime si napríklad počítač. Ich výrobcovia nemyslia na rôznorodosť úloh, ktoré používateľ rieši, ba čo viac, nevyčleňujú na každú malý procesor a pamäť. Počítač je jednoducho súbor nezávislých komplexných objektov spojených v jednom puzdre pomocou konektorov a vodičov. Objekty nie sú jedinečné, nie sú optimalizované špeciálne pre vás, a napriek tomu plnia svoju prácu bravúrne.

V programovaní existujú úplne rovnaké riešenia. Napríklad knižnice. Pomáhajú nestrácať drahocenný čas vynálezom bicykla. Pre konkrétne úlohy však knižnice nie sú efektívne – vytvorenie zaberie veľa času a pri jedinej opakovateľnosti má efektivita tendenciu k nule.

V tomto prípade je užitočnejšie obrátiť sa na moduly. Modul je logicky úplný kus kódu, ktorý má špecifický funkčný účel. Pre interakciu modulov sa používajú metódy, ktoré neumožňujú meniť parametre a funkčnosť. Výhody modulárneho programovania sú zrejmé:

  • Zrýchlenie vývoja.
  • Zvýšenie spoľahlivosti.
  • Zjednodušenie testovania.
  • Zameniteľnosť.

Modulárne programovanie je mimoriadne efektívne pri skupinovom rozvoji, kde sa každý zamestnanec môže sústrediť len na svoj vlastný front práce a nepozerať sa späť na rozhodnutia kolegov. Pri individuálnom prístupe však získate aspoň vyššie uvedené výhody.

Ale nie všetko je také jednoduché.

Problémy modulárneho programovania

Samotná myšlienka používania modulov kód výrazne nezjednodušuje, je dôležité minimalizovať počet priamych spojení medzi nimi. Tu sa dostávame ku konceptu Inversion of Control (IoC). Zjednodušene ide o princíp programovania, pri ktorom sú jednotlivé komponenty kódu od seba čo najviac izolované. To znamená, že podrobnosti jedného modulu by nemali ovplyvniť implementáciu iného modulu. To sa dosahuje pomocou rozhraní alebo iných reprezentácií, ktoré neposkytujú priamy prístup k modulárnemu kódu.

Takýchto príkladov je v každodennom živote veľa. Ak si chcete kúpiť letenku alebo zistiť čas odletu, nemusíte volať pilotovi. Aby človek pil mlieko, nemusí ísť do dediny alebo do továrne a stáť nad dušou kravy. Na to vždy existujú sprostredkovatelia.

Modulárne programovanie má tri hlavné implementácie:

  • Injekcia závislosti. Spôsobom, akým má každý prvok svoje vlastné rozhranie, dochádza k interakcii modulov prostredníctvom rozhraní.
  • továrenská metóda. Je založená na existencii určitého objektu, určeného na vytváranie iných objektov. Inými slovami, zavedenie prototypu do programu, ktorý kombinuje spoločné vlastnosti pre väčšinu objektov. Medzi modulmi nedochádza k priamej interakcii, všetky parametre sa dedia z „fabriky“.
  • spôsob služby. Vytvorí sa jedno spoločné rozhranie, ktoré je vyrovnávacou pamäťou pre interakciu objektov. Podobnú funkciu v reálnom živote plnia call centrá, obchody, reklamné platformy atď.

Zatiaľ čo prvá implementácia IoC je najbežnejšie používaná, na prvé kroky v modulárnom programovaní je najlepšie použiť ďalšie dve. Dôvodom je, že jednoduché vytváranie rozhraní iba obmedzuje prístup k modulom a na zníženie zložitosti kódu je potrebné znížiť aj počet odkazov. Rozhrania, ktoré chaoticky odkazujú na iné rozhrania, kód len komplikujú.

Na vyriešenie tohto problému je potrebné vyvinúť architektúru kódu. Spravidla je podobná štruktúre súborov akejkoľvek aplikácie:

Podpora princípov modulárneho programovania, inverzia riadenia a prehľadná architektúra aplikácií teda pomôže zabiť tri muchy jednou ranou:

  1. Poskytnite jasné funkčné oddelenie kódu. Keď sa vyskytnú chyby, zdroj sa dá rýchlo identifikovať a opravy nepovedú k novým poruchám.
  2. Minimalizujte počet pripojení. To zjednoduší vývoj tým, že viacerým vývojárom poskytne rôzne moduly. Alebo môžete každý blok vytvoriť sami bez toho, aby ste sa pozerali na ostatných, čo tiež šetrí čas a námahu.
  3. Vytvorte hierarchiu s jasnou vertikálou dedičnosti. To zvyšuje spoľahlivosť kódu, pretože sa ľahšie testuje a výsledky sú informatívnejšie.

Dodržiavanie princípu modularity pri veľkých projektoch ušetrí čas a nepreleje počiatočné nadšenie. Navyše sa konečne budete môcť sústrediť na to najzaujímavejšie - implementáciu originálnych nápadov do kódu. Ale práve toto hľadá v programovaní každý z nás.

Stalo sa, že tie paradigmy, ktoré kedysi prerážali pot a krv cez hordy prívržencov tradičných metód, postupne upadli do zabudnutia. Tieto paradigmy vznikli na úsvite programovania a prečo vznikli, aké výhody priniesli a prečo sú stále užitočné pre každého vývojára.

OK. Úvod je veľmi zábavný, ale stále ho nečítate, takže ak máte záujem, vitajte v zostrihu!

Imperatívne programovanie



Historicky je veľká väčšina počítačového hardvéru, ktorý programujeme, stavová a programovateľná pomocou inštrukcií, takže prvé programovacie jazyky boli väčšinou čisto imperatívne, t.j. nepodporoval žiadne iné paradigmy ako imperatív.

Boli to strojové kódy, assembleri a skoré jazyky na vysokej úrovni ako Fortran.

Kľúčové body:

V tejto paradigme sú výpočty opísané ako inštrukcie, ktoré krok za krokom menia stav programu.

V jazykoch nízkej úrovne (ako je jazyk symbolických inštrukcií) môže byť stav pamäť, registre a príznaky a inštrukcie môžu byť inštrukcie podporované cieľovým procesorom.

V stave vyššej úrovne (ako C) je iba pamäť, inštrukcie môžu byť zložitejšie a spôsobiť, že sa pamäť pri svojom spustení pridelí a uvoľní.

V tých na veľmi vysokej úrovni (ako je Python, ak sa v ňom nevyhnutne programuje) je stav obmedzený len na premenné a inštrukcie môžu byť zložité operácie, ktoré by v assembleri zabrali stovky riadkov.

Základné pojmy:

- Poučenie
- Štát

Vygenerované koncepty:

- Zadanie
- Prechod
- Pamäť
- Ukazovateľ

Ako hlavné:
- Jazyky zhromaždenia
- Fortran
- Algol
- Cobol
- Pascal
- C
- C++
-Ada
Ako pomocný prostriedok:
-Python
- Ruby
- Java
- C#
- PHP
- Haskell (cez monády)

Stojí za zmienku, že väčšina moderných jazykov do určitej miery podporuje imperatívne programovanie. Dokonca aj v čistom funkčnom jazyku Haskell je možné písať imperatívne.

Štruktúrované programovanie



Štruktúrované programovanie je paradigma programovania (bežne označovaná aj ako metodika vývoja), ktorá bola prvým veľkým krokom vo vývoji programovania.

Zakladateľmi štruktúrovaného programovania boli takí známi ľudia ako E. Dijkstra a N. Wirth.

Priekopnícke jazyky v tejto paradigme boli Fortran, Algol a B, neskôr nasledovali Pascal a C.

Kľúčové body:

Táto paradigma zavádza nové koncepty, ktoré zjednocujú bežne používané vzory písania imperatívneho kódu.

V štruktúrovanom programovaní stále pracujeme so stavom a inštrukciami, no zavádza sa pojem zložená inštrukcia (blok), vetvené inštrukcie a slučka.

Pomocou týchto jednoduchých zmien je možné vo väčšine prípadov eliminovať príkaz goto, čo zjednodušuje kód.

Niekedy goto stále robí kód čitateľnejším, takže je stále široko používaný, napriek všetkým tvrdeniam jeho odporcov.

Základné pojmy:

- Blokovať
- Cyklus
- Vetvenie

Jazyky podporujúce túto paradigmu:

Ako hlavné:
- C
- Pascal
- Základné
Ako pomocný prostriedok:
- C#
- Java
-Python
- Ruby
- JavaScript

Čiastočne podporované:
- Niektoré zostavy makier (prostredníctvom makier)

Opäť platí, že väčšina moderných jazykov podporuje štrukturálnu paradigmu.

procedurálne programovanie



Zvyšujúca sa zložitosť softvéru opäť prinútila programátorov hľadať iné spôsoby opisu výpočtov.

V skutočnosti boli opäť zavedené ďalšie koncepty, ktoré umožnili nový pohľad na programovanie.

Tento koncept bol tentoraz postup.

V dôsledku toho vznikla nová metodika písania programov, ktorá je dodnes vítaná - pôvodný problém sa rozdelí na menšie (pomocou postupov) a tak sa to deje dovtedy, kým sa riešenie všetkých konkrétnych postupov ukáže ako triviálne.

Kľúčové body:

Procedúra je nezávislá časť kódu, ktorá môže byť vykonaná ako jedna inštrukcia.

V modernom programovaní môže mať procedúra viacero výstupných bodov (návrat v jazykoch podobných C), viacero vstupných bodov (pomocou výnosu v Pythone alebo statických lokálnych premenných v C++), môže mať argumenty, vrátiť hodnotu ako výsledok svojho vykonania, byť preťažené počtom, či typom parametrov a mnoho iného.

Základné pojmy:

- Postup

Vygenerované koncepty:

- Výzva
- Argumenty
- Návrat
- Rekurzia
- Preťaženie

Jazyky podporujúce túto paradigmu:

Ako hlavné:
- C
- C++
- Pascal
- Object Pascal
Ako pomocný prostriedok:
- C#
- Java
- Ruby
-Python
- JavaScript

Čiastočne podporované:
- Skorý základ

Stojí za zmienku, že viaceré vstupné body zo všetkých týchto jazykov sú podporované iba v Pythone.

Modulárne programovanie



Koľkokrát rastúca zložitosť programov prinútila vývojárov zdieľať svoj kód. Tentoraz postupy nestačili a tentoraz bol predstavený nový koncept - modul.

Pri pohľade do budúcnosti poviem, že moduly tiež nedokázali pokryť rastúcu komplexnosť softvéru neuveriteľnou rýchlosťou a následne sa objavili balíčky (to je tiež modulárne programovanie), triedy (toto je už OOP), šablóny (všeobecné programovanie ).

Program popísaný v štýle modulárneho programovania je súbor modulov. Čo je vnútri, triedy, imperatívny kód alebo čisté funkcie – na tom nezáleží.

Vďaka modulom sa prvýkrát v programovaní objavilo vážne zapuzdrenie - je možné použiť akékoľvek entity vo vnútri modulu, ale neukázať ich vonkajšiemu svetu.

Kľúčové body:

Modul je samostatná pomenovaná entita programu, ktorá kombinuje iné programové jednotky s podobnou funkčnosťou.

Napríklad súbor List.mod, ktorý obsahuje triedu List
a funkcie pre prácu s ním - modul.

Priečinok Geometry obsahujúci moduly Tvar, Obdĺžnik a Trojuholník je tiež modul, hoci niektoré jazyky oddeľujú koncept modulu a balíka (v takýchto jazykoch je balík kolekciou modulov a/alebo kolekciou iných balíky).

Moduly je možné importovať (spojiť), aby bolo možné použiť entity v nich deklarované.

Základné pojmy:

- Modul
- Dovoz

Vygenerované koncepty:

- Balíček
- Zapuzdrenie

Jazyky podporujúce túto paradigmu:

Ako hlavné:
- Haskell
- Pascal
-Python
Ako pomocný prostriedok:
- Java
- C#
- ActionScript 3

Čiastočne podporované:
- C/C++

Niektoré jazyky majú samostatné abstrakcie pre moduly, zatiaľ čo iné môžu na implementáciu modulov používať hlavičkové súbory (v C/C++), menné priestory, statické triedy a/alebo knižnice s dynamickými prepojeniami.

Namiesto záveru

V tomto článku som nepopisoval v súčasnosti populárne objektovo orientované, generické a funkcionálne programovanie. Jednoducho preto, že mám na túto vec svoj, dosť radikálny názor a chovať holivara som nechcel. Aspoň zatiaľ. Ak sa táto téma ukáže ako užitočná pre komunitu, plánujem napísať niekoľko článkov, ktoré podrobne načrtnú základy každej z týchto paradigiem.

Tiež som nenapísal nič o exotických paradigmách ako automat, applicative, aspekt/agent/komponent-orientované programovanie. Nechcel som článok veľmi rozťahovať a opäť, ak je téma žiadaná, napíšem o týchto paradigmách možno podrobnejšie a s príkladmi kódu.

Štruktúrované programovanie

Najbežnejšie známa definícia štruktúrovaného programovania je prístup k programovaniu, ktorý používa tri konštrukty na prenos riadenia v programe: nasledovať, vybrať a zacykliť.

Klasická Boehmova a Jacopiniho veta o štruktúrovanom programovaní hovorí, že každý bežný program (teda program s jedným vstupom a jedným výstupom, bez slučiek a nedosiahnuteľných vetiev) možno napísať pomocou nasledujúcich logických štruktúr:

sekvencie dvoch alebo viacerých operátorov;

dichotomický výber;

opakovania;

Dijkstra navrhol opustiť operátor nepodmieneného skoku a obmedziť sa na tri konštrukcie – postupnosť, výber a slučku;

Donald Knuth demonštroval prípady, kedy bol operátor nepodmieneného skoku užitočný (napr. výstup z viacerých vnorených slučiek) a kritizoval Dijkstrovo tvrdenie.

V roku 1965 upozornil akademik Glushkov na skutočnosť, že štruktúrované programy možno v nejakej algebre považovať za vzorce. Poznaním pravidiel pre transformáciu výrazov v takejto algebre je možné vykonávať hlboké formálne (a teda automatizované) transformácie programov.

Štruktúrované programovanie nie je samoúčelná, jej hlavným účelom je získať dobrý program. Avšak aj tie najlepšie programy vyžadujú príkazy skoku, ako napríklad pri odchode z mnohých vnorených slučiek.

Modulárne programovanie

Modulárne programovanie je spôsob programovania, pri ktorom je celý program rozdelený do skupiny komponentov nazývaných moduly, z ktorých každý má svoju riadenú veľkosť, jasný účel a podrobné rozhranie s vonkajším prostredím. Jedinou alternatívou k modulárnosti je monolitický program, ktorý je, samozrejme, nepohodlný. Najzaujímavejšou otázkou pri štúdiu modularity je teda definícia kritéria pre rozdelenie do modulov. Modulárne programovanie je založené na troch hlavných konceptoch.

Princíp zadržiavania informácií. Každý komponent ukrýva jedno konštrukčné rozhodnutie, t.j. modul slúži na skrytie informácií. Prístup k návrhu programu spočíva v tom, že sa najprv vytvorí zoznam návrhových rozhodnutí, ktoré je obzvlášť ťažké urobiť alebo sa pravdepodobne zmenia. Potom sú definované samostatné moduly, z ktorých každý implementuje jedno zo špecifikovaných riešení.

Axióma modularity. Modul je nezávislá programová jednotka, ktorá slúži na vykonávanie určitej špecifickej funkcie programu a na komunikáciu so zvyškom programu. Softvérová jednotka musí spĺňať nasledujúce podmienky:


- bloková organizácia, t.j. schopnosť volať programovú jednotku z blokov akéhokoľvek stupňa vnorenia;

- syntaktická izolácia, t. j. zvýraznenie modulu v texte syntaktickými prvkami;

- sémantická nezávislosť, t. j. nezávislosť od miesta, kde sa volá programová jednotka;

- všeobecnosť údajov, t. j. prítomnosť vlastných údajov, ktoré sa ukladajú pri každom prístupe;

- úplnosť definície, teda nezávislosť programovej jednotky.

programovanie zostavy. Moduly sú softvérové ​​stavebné bloky, z ktorých je zostavený program.

Spojovacie moduly je mierou relatívnej nezávislosti modulu od ostatných modulov. Nezávislé moduly je možné upravovať bez úpravy iných modulov. Čím slabšia je väzba modulu, tým lepšie. Zvážte rôzne typy spojok.

- nezávislé moduly - to je ideálny prípad. Moduly o sebe nič nevedia. Interakciu takýchto modulov môžete organizovať tak, že poznáte ich rozhranie a podľa toho presmerujete výstupné údaje jedného modulu na vstup iného modulu.

– reťazenie údajov (parametrické) je reťazenie, keď sú údaje odovzdané modulu ako hodnoty jeho parametrov alebo ako výsledok jeho volania do iného modulu na výpočet nejakej funkcie. Tento typ reťazenia je implementovaný v programovacích jazykoch, keď sa odkazuje na funkcie (postupy).

Rutinnosťou modulu je nezávislosť modulu od predchádzajúcich volaní do neho (od praveku). Modul je rutinný, ak výsledok jeho práce závisí len od počtu odovzdaných parametrov (a nie od počtu volaní). Modul by mal byť vo väčšine prípadov rutinný, ale existujú aj prípady, keď by mal modul uchovávať históriu. Pri výbere stupňa rutiny modulu sa používajú tri odporúčania:

– vo väčšine prípadov robíme modul rutinou;

– moduly závislé od histórie by sa mali používať iba vtedy, keď je to potrebné na reťazenie údajov;

– Špecifikácia modulu závislého od histórie by mala jasne formulovať túto závislosť, aby používatelia mohli predvídať správanie takéhoto modulu.

modul je sekvencia logicky spojených fragmentov, navrhnutá ako samostatná časť programu.

Modul má nasledujúce požiadavky:

1) modul musí implementovať jedinú funkciu, t.j. pri stavbe modulu sa používa koncept: „jeden modul – jedna funkcia“. Modul je teda programový prvok, ktorý vykonáva nezávislú úlohu. Na svoj vstup môže prijať určitý súbor počiatočných údajov, spracovať ich v súlade s daným algoritmom a vrátiť výsledok spracovania, t.j. je implementovaný štandardný princíp IPO (vstup - proces - výstup) - vstup-proces-výstup;

2) modul musí byť označený jeho názvom. Musí mať jeden vstup a jeden výstup, čo zaručuje uzavretosť modulu a zjednodušuje údržbu programu;

3) modul musí mať funkčnú kompletnosť, t.j. vykonať zoznam regulovaných operácií na implementáciu každej jednotlivej funkcie v plnom rozsahu, dostatočný na dokončenie začatého spracovania;

4) modul musí vrátiť riadenie do bodu svojho volania, naopak musí byť schopný sám volať ostatné moduly;

5) modul by nemal ukladať históriu svojich hovorov a používať ju počas prevádzky;

6) modul musí mať logickú nezávislosť, t.j. výsledok práce programového modulu závisí iba od počiatočných údajov, ale nezávisí od práce iných modulov;

7) modul by mal mať slabé informačné prepojenie s inými programovými modulmi – výmena informácií medzi modulmi by mala byť podľa možnosti minimalizovaná;

8) modul by mal byť relatívne malý, t.j. byť predvídateľné čo do veľkosti a zložitosti. Skúsení programátori odporúčajú jeho veľkosť nie viac ako dve vytlačené strany na tlačiarni.

Na dosiahnutie modulovej nezávislosti sa často používa princíp lokalizácie informácií , ktorá spočíva v tom, že všetky informácie o štruktúre údajov, prototypoch funkcií, konštantách atď. je sústredená („skrytá“) v samostatnom module. Prístup k týmto informáciám je realizovaný len cez tento modul (v algoritmickom jazyku C/C++ majú takéto moduly príponu *.h).

Programovanie pomocou modulov je tzv modulárne programovanie. Vznikol začiatkom 60. rokov 20. storočia. Modulárne programovanie je založené na myšlienke využitia úrovní abstrakcie, kedy je celý problém alebo súbor úloh rozdelený na úlohy, podúlohy, abstrahovaný a prezentovaný ako hierarchický strom vzájomne prepojených modulov, ktoré spoločne predstavujú vytváraný softvér.

Výhody modulárneho programovania je nasledovné:


Veľký program môže písať niekoľko programátorov súčasne, čo vám umožňuje dokončiť úlohu skôr;

Môžete vytvárať knižnice najčastejšie používaných modulov;

zjednodušuje postup načítania veľkého programu, ktorý vyžaduje segmentáciu, do pamäte RAM;

· existuje veľa prirodzených kontrolných bodov na ladenie projektu;

Jednoduchšie je navrhovať a ďalej upravovať programy.

Nevýhody modulárneho programovania sú nasledujúce:

Zvyšuje veľkosť požadovanej pamäte RAM;

Zvýšený čas kompilácie a sťahovania;

zvýšiť čas vykonávania programu;

medzimodulové rozhrania sa stávajú pomerne zložitými.

Modulárne programovanie sa realizuje prostredníctvom modulov – funkcií. Funkcia je oblasť pamäte pridelená na ukladanie programového kódu navrhnutá na vykonávanie špecifickej úlohy. Inými slovami, funkcia je minimálny spustiteľný modul programu C/C++. Štandardne je funkcia typu externá a je prístupná z akéhokoľvek programového súboru. Môže byť však obmedzený špecifikátorom triedy statického úložiska.

Funkciu charakterizuje typ, rozsah názvu spojeného s funkciou, viditeľnosť názvu funkcie a typ väzby.

Zadajte názov_funkcie (špecifikácia parametra) telo_funkcie

Typ je návratový typ funkcie vrátane void (okrem typov poľa alebo funkcií). Predvolený typ je int. Ak návratový typ funkcie nie je neplatný, telo funkcie musí obsahovať aspoň jeden príkaz return.

Názov_funkcie- identifikátor, pomocou ktorého môžete funkciu zavolať. Vyberá si ho programátor svojvoľne a nemal by sa zhodovať s obslužnými slovami a názvami iných programových objektov. Každý program v C/C++ však musí mať aspoň jednu pomenovanú funkciu hlavné- hlavná funkcia obsahujúca vstupný bod do programu .

Parametre_špecifikácie– zoznam formálnych parametrov, t.j. premenné, ktoré nadobúdajú hodnoty odovzdané funkcii pri jej volaní. Zoznam formálnych parametrov je oddelený čiarkami. Každý formálny parameter musí mať nasledujúci formát:

Zadajte názov formálneho_parametra

Typ môže byť vstavaný (int, long, float, double, atď.), štruktúra (struct), union (union), enumerácia (enum), ukazovatele na ne alebo na funkcie či triedy (class). Formal_parameter_name je názov premennej použitej v tele funkcie. Formálne identifikátory parametrov sa nemôžu zhodovať s názvami lokálnych premenných deklarovaných v tele funkcie.

Formálna deklarácia parametra môže obsahovať inicializátor, teda výraz, ktorý musí zabezpečiť, že parametru bude priradená počiatočná hodnota. Inicializátor parametra nie je konštantný výraz. Počiatočná inicializácia parametrov nenastáva vo fáze kompilácie (ako napr. alokácia pamäte pre polia), ale priamo počas vykonávania programu.

V jazyku C/C++ sú povolené funkcie, ktorých počet parametrov nie je pri kompilácii funkcie pevne stanovený, a preto ich typy zostávajú neznáme. Počet a typy parametrov takýchto funkcií sú známe až pri ich volaní, keď je explicitne uvedený zoznam skutočných parametrov. Pri definovaní a popise takýchto funkcií zoznamami parametrov s neurčitou dĺžkou by špecifikácia formálnych parametrov mala končiť čiarkou a elipsou.

Každá variatická funkcia musí mať aspoň jeden požadovaný parameter. Za zoznamom požadovaných parametrov nasleduje čiarka a potom elipsa, ktorá informuje kompilátor, že pri spracovaní volania funkcie nie je potrebné vykonávať ďalšiu kontrolu súladu medzi počtom a typmi parametrov.

Parameter_spec môže chýbať, t.j. zátvorky môžu byť prázdne, ale v tomto prípade sa odporúča zadať typ void .

Function_body- časť definície funkcie, ohraničená zloženými zátvorkami a umiestnená bezprostredne za hlavičku funkcie. Function_body môže byť buď zložený príkaz, alebo blok. Napríklad.