Definējiet un aprakstiet modulāro programmēšanu. Modulārā programmēšana - PIE.Wiki. Nodoto parametru skaita samazināšana līdz minimumam

Materiāls no PIE.Wiki

būtība modulārā programmēšana sastāv no sarežģītas problēmas sadalīšanas vairākos vienkāršākos apakšuzdevumos un programmu sastādīšanas to risināšanai diezgan neatkarīgi viena no otras. Modularitāte ir viens no programmatūras projektu veidošanas pamatprincipiem. Vispārīgā gadījumā modulis ir atsevišķa funkcionāli pabeigta, kaut kādā veidā identificēta un ar citiem apvienota programmas vienība, loģiski saistītas objektu kopas noteikšanas līdzeklis, to atlases un izolēšanas līdzeklis. Modulis ir līdzeklis ne tikai vadības struktūru, bet arī datu struktūru sadalīšanai. To lielā mērā veicināja jēdziena "datu tips" attīstība.

Definīcija. Ko nozīmē modulārā programmēšana?

Modulārā programmēšana ir sadalīšanas process datorprogramma atsevišķās apakšprogrammās. Modulis ir atsevišķs programmatūras komponents. To bieži var izmantot dažādās lietojumprogrammās un funkcijās kopā ar citiem sistēmas komponentiem. Līdzīgas funkcijas ir sagrupētas vienā programmēšanas koda vienībā, un atsevišķas funkcijas tiek izstrādātas kā atsevišķas koda vienības, lai kodu varētu atkārtoti izmantot citās lietojumprogrammās.

Objektorientētā programmēšana lielā mērā ir savietojama ar modulārās programmēšanas koncepciju. Modulārā programmēšana ļauj vairākiem programmētājiem patstāvīgi koplietot darbu un atkļūdot programmas daļas. Moduļu programmēšanas moduļi nodrošina loģiskas robežas starp komponentiem un uzlabo apkopi. Tie ir savienoti, izmantojot saskarnes. Tie ir paredzēti, lai samazinātu atkarību starp dažādiem moduļiem. Komandas var izstrādāt moduļus atsevišķi un neprasa zināšanas par visiem sistēmas moduļiem.

Modulis ir programmatūras projekta kompilācijas, uzglabāšanas, kā arī izstrādes un atsevišķas izstrādes vienība, ko veic izstrādātāju komanda. Tādējādi modulis tiek saprasts kā līdzeklis loģiski saistītas objektu kopas noteikšanai, to atlases un izolācijas līdzeklis.

Katrai modulārajai lietojumprogrammai ir ar to saistīts versijas numurs. Tas sniedz izstrādātājiem elastību moduļu uzturēšanai. Ja modulim ir jāpiemēro kādas izmaiņas, ir jāmaina tikai mainītās rutīnas. Tas padara programmu vieglāk lasāmu un saprotamu.

Moduļu programmēšanai ir galvenais modulis un daudzi apakšmoduļi. Galvenais modulis ir apkopots kā izpildāms fails, kas izsauc palīgmoduļa funkcijas. Funkciju nosaukumiem starp moduļiem ir jābūt unikāliem, lai tiem būtu viegli piekļūt, ja ir jāeksportē galvenā moduļa izmantotās funkcijas.

Moduļu izveide un to objektu izmantošana programmās ir viens no trikiem ekonomiska programmēšana kas ir saistīts ar šādiem apstākļiem.

Pirmkārt, modulis parasti definē objektus, kas ir kādas "priekšmetu" jomas pamatjēdzienu nesēji, tādējādi modulis nosaka šīs priekšmeta jomas kontekstu. Tāpēc programmas, kas šajā jomā veiks dažādus apstrādes algoritmus, varēs izmantot jau gatavas un, kas ir svarīgi, vienādas pamata objektu definīcijas.

Modulārās programmēšanas jēdziens

Modulārās programmēšanas izmantošanas priekšrocības ietver. Atkārtotai izmantošanai var izstrādāt vienu procedūru, tādējādi novēršot nepieciešamību atkārtoti ievadīt kodu vairākas reizes. Programmas var izstrādāt vienkāršāk, jo neliela komanda nodarbojas tikai ar nelielu daļu no visa koda. Modulārā programmēšana ļauj daudziem programmētājiem sadarboties vienā lietojumprogrammā. Kods ir īss, vienkāršs un skaidrs. Kļūdas var viegli identificēt, jo tās lokalizē apakšprogramma vai funkcija. To pašu kodu var izmantot daudzās lietojumprogrammās. Ir viegli kontrolēt mainīgo lielumu apjomu.

  • Jāraksta mazāk koda.
  • Kods tiek saglabāts vairākos failos.
Kā jūs organizējat vidējas vai lielas programmas?

Otrkārt, tiek apkopoti gan moduļi, gan programmas, kas tos izmanto neskatoties uz(modulis ir jāapkopo pirms programmas, kas to izmanto). Sakarā ar to tiek ievērojami samazināts lielas programmas kompilācijas laiks, izmantojot gatavus moduļus, kas ir svarīgi, veicot programmu atkļūdošanu, kad tās ir jākompilē daudzas reizes.

Piemēri parasti iekļaujas vienā avota koda failā. Modulārā programmēšana ir viens no sarežģītības pārvaldības veidiem. Modulārās programmēšanas grupas grupē saistītās funkciju kopas kopā modulī. Modulis ir sadalīts saskarnē un ieviešanā. Modulis eksportē saskarni; moduļa klienti importē saskarni, lai viņi varētu piekļūt moduļa funkcijām. Moduļa ieviešana ir privāta un slēpta no klientu viedokļa. Programmu sadalīšana moduļos ir spēcīgs organizēšanas princips netriviālu programmu izstrādei.

Trešā svarīga moduļa īpašība ir tāda, ka tas slēpj, "iekapsulē" eksportējamo objektu attēlojumu un realizāciju, lai to iespējamās izmaiņas modulī (kad tas ir konfigurēts vai pielāgots jaunām aparatūras iespējām) neprasa nekādas izmaiņas. lietotāju programmām.

Moduļi nodrošina abstrakciju, iekapsulēšanu un informācijas slēpšanu, kas ļauj vieglāk saprast programmas liela mēroga struktūru. Rūpīga moduļu konstrukcija veicina arī atkārtotu izmantošanu programmatūra pat programmējot iegultās sistēmas.

Programmētāji katru dienu strādā ar abstrakcijām. Abstrakcija uzsver kaut kā būtiskās iezīmes, vienlaikus ignorējot tā detaļas. Abstrakcija var ietvert aparatūras daļu, programmatūras komponentu un tā tālāk. mūsu vajadzībām interfeiss ar moduli ir moduļa funkciju abstrakcija. Interfeiss nosaka moduļa funkcijas un to lietošanu.

Visos moduļos to definētajiem objektiem (konstantes, mainīgie, tipi un apakšprogrammas) tiek izmantoti mnemoniski nosaukumi, kas atvieglo to mērķa un iegaumēšanas izpratni, atbilst prasībām. teksta redzamība programmas.

Programmētājs, kas izmanto moduli, redz moduļa saskarnes definīciju. Šīs saskarnes otrā pusē ir ieviesta moduļa ieviešana. Programmētājs implementācijā nedrīkst izmantot neko, kas nav definēts saskarnē. Ideālā gadījumā modulim ir jānodrošina, ka programmētājs nevar piekļūt ieviešanas iekšējai informācijai. Šī informācijas slēpšana ir vienīgais veids, kā ieviešana var aizsargāt savu datu integritāti un nodrošināt, ka modulis ir pareizs. Īstenošanas slēpšana ļauj arī aizstāt uzlaboto ieviešanu, neietekmējot neko ārpus moduļa.

Programmēšanas valodas, kas atbalsta modulāru pieeju, apraksta moduli kā programmatūras vienību, kas sastāv no divām galvenajām daļām - specifikācijas (interfeisa) un ieviešanas. Specifikācija nodrošina tādus moduļu objektu raksturlielumus, kas ir nepieciešami un pietiekami šo objektu izmantošanai citos moduļos un programmās. Tas ļauj moduļa objektus izmantot, tikai pamatojoties uz informāciju par to saskarni (negaidot tos pilnīgs apraksts). Moduļa realizācijas daļā ir aprakstīti attēlošanas un apstrādes algoritmi, kas saistīti ar noteiktiem moduļa objektiem.

Divi svarīgākie moduļa elementi ir moduļa atdalīšana saskarnē un implementācijā, kā arī iespēja slēpt informāciju implementācijā. Sintakse moduļa izveidei būtu. Interfeisa definīcija un ieviešana ir atsevišķas. Interfeisa definīcija satur eksportējamo funkciju un datu struktūru sarakstu, kā arī šo funkciju un datu deklarācijas. Šīs ir vienīgās moduļa daļas, ko klienti var izmantot. Ieviešanā ir uzskaitītas tās atkarības no citiem moduļiem. Pēc tam tas izvada eksportētās funkcijas; viņi var izmantot slēptās palīgfunkcijas un datus.

Modulis ir viens no rīkiem, kas atvieglo programmas verifikāciju. Modulis kā abstrakcijas veidošanas līdzeklis izceļ specifikāciju un lokalizē informāciju par ieviešanu.

Moduļi kalpo arī domēnam specifiska konteksta izveidei un mašīnu atkarību lokalizēšanai.

Samaziniet nepieciešamo zvanu skaitu

Mēs varam iekapsulēt funkcijas un datus avota failā, lai tie būtu daļa no moduļa ieviešanas. Atbilstošais galvenes fails veido moduļa interfeisu. Apskatīsim, kā tas darbojas sīkāk. Pirmkārt, modulis uzskaita savas atkarības no citiem moduļiem; tas importē saskarnes izmantotajos moduļos. Tas ļauj kompilatoram pārliecināties, vai moduļa ieviešana atbilst tā reklamētajam interfeisam. Interfeisa failu saturu apskatīsim vēlāk. Lai paslēptu iekšējās detaļas, moduļa ieviešanai jāspēj izveidot privātus datus un funkcijas.

Modulārās programmēšanas jēdziens

Modulārās programmēšanas jēdzienu var formulēt vairāku jēdzienu un noteikumu veidā:

  • Uzdevuma funkcionālā dekompozīcija ir liela uzdevuma sadalīšana vairākos mazākos, funkcionāli neatkarīgos apakšuzdevumos - moduļos. Moduļi ir savstarpēji savienoti tikai ar ieejas un izejas datiem.
  • Modulis ir modulārās programmēšanas koncepcijas pamatā. Katrs modulis funkcionālajā sadalījumā ir "melnā kaste" ar vienu ieeju un vienu izeju. Modulārā pieeja ļauj nesāpīgi atjaunināt programmu tās darbības laikā un atvieglo tās apkopi. Turklāt modulārā pieeja ļauj izstrādāt viena projekta programmu daļas dažādās programmēšanas valodās un pēc tam izmantot montāžas rīkus, lai tās apvienotu vienā sāknēšanas modulī.
  • Ieviestajiem risinājumiem jābūt vienkāršiem un skaidriem. Ja moduļa mērķis nav skaidrs, tas norāda, ka sākotnējā vai starpuzdevuma dekompozīcija nav veikta pietiekami labi. Šajā gadījumā uzdevums ir jāanalizē vēlreiz un, iespējams, jāveic papildu sadalīšana apakšuzdevumos. Ja projektā ir sarežģītas vietas, tās ir jādokumentē sīkāk, izmantojot pārdomātu komentāru sistēmu. Šis process jāturpina, līdz tiešām ir iespējams panākt skaidru izpratni par visu problēmas moduļu mērķi un to optimālo kombināciju.
  • Visu moduļa mainīgo mērķis ir jāapraksta, izmantojot komentārus, kā tie ir definēti.

Literatūra

  1. MM. Bezhanova, L.A. Moskvins. Praktiskā programmēšana. Paņēmieni programmu veidošanai Pascal. M.: Zinātniskā pasaule, 2000, 270 lpp.
  2. Istomins E.P., Novikovs V.V., Novikova M.V. Augsta līmeņa informātikas un programmēšanas metodes: Mācību grāmata. - Sanktpēterburga. SIA "Adreevsky Publishing House", 2006 - 228 lpp.

1.3.1. Modulārās programmēšanas mērķis.

Modulārā programmēšana pamatojoties uz koncepciju modulis - loģiski savstarpēji savienots funkcionālo elementu kopums, kas veidots kā atsevišķi programmatūras moduļi.

Tāpat visi datu dalībnieki, kas nav lokāli funkcijai, ir pieejami no citiem failiem. Pēc noklusējuma funkcijā esošie lokālie mainīgie tiek dinamiski piešķirti, tas ir, stekā. Statiskas vērtības pievienošana lokālā mainīgā definīcijai izraisa statisku sabiedroto piešķiršanu tā, ka tas pastāvīgi saglabā vērtības starp funkciju izsaukumiem. Ja lietas kļūst neskaidras, ir nelokālo datu definīcija.

Šeit statiskais ietekmē tvēruma datus, statiskie sabiedrotie tiek piešķirti statiski vai nē. Statikas izmantošana informācijas slēpšanai prasa zināmu pašdisciplīnu. Aizmirstot statisku dalībnieku datos, kuriem jābūt moduļa iekšienē, dati var "izplūst" no moduļa. 2. sarakstā ir parādīta mūsu parauga moduļa saskarnes definīcija. Galvenā saskarnes daļa deklarē moduļa ārējās, publiskās daļas. Programma kompilējas bez kļūdām un brīdinājumiem.

Moduli raksturo:

  1. viena ieeja un viena izeja - pie ieejas programmas modulis saņem noteiktu sākotnējo datu kopu, veic jēgpilnu apstrādi un atgriež vienu rezultātu datu kopu, t.i. tiek ieviests IPO (Input - Process - Output) standarta princips - iebraukšana-process-izeja;
  2. funkcionālā pilnība - modulis veic regulēto darbību sarakstu katras atsevišķas funkcijas īstenošanai kopumā, kas ir pietiekams, lai pabeigtu uzsākto apstrādi;
  3. loģiskā neatkarība - programmas moduļa darba rezultāts ir atkarīgs tikai no sākotnējiem datiem, bet nav atkarīgs no citu moduļu darba;
  4. vājas informācijas saites ar citiem programmas moduļiem - pēc iespējas jāsamazina informācijas apmaiņa starp moduļiem;
  5. programmas elements, kas ir paredzams pēc izmēra un sarežģītības.

Tādējādi moduļi satur apstrādei pieejamo datu definīciju, datu apstrādes operācijas, starpsavienojumu shēmas ar citiem moduļiem.

Programmai ir vienkārša kļūda. Funkciju prototipi ļauj kompilatoram pārbaudīt funkcijām nodoto argumentu veidus, pat ja funkcija ir definēta citā failā. Tomēr, izmantojot mūsu moduļa tehniku, tika atrasta kļūda. Kompilators tagad var noteikt veida neatbilstību. Citiem vārdiem sakot, aizstāšana nenotiek kā meklēšanas un aizstāšanas komanda teksta redaktorā. Tas darbojas pat tad, ja funkcija neizmanto argumentus, fiksētu argumentu skaitu vai mainīgu argumentu skaitu.

Tas darbojas arī, veidojot funkciju rādītāju. Jaunais nosaukums sastāv no funkcijas nosaukuma ar prefiksu ar moduļa nosaukumu. Tomēr moduļa nosaukuma pievienošana visām globālajām funkcijām palielina iespēju, ka nosaukums paliks unikāls, ja modulis tiek mitināts bibliotēkā.

Katrs modulis sastāv no specifikācijas un korpusa. Specifikācijās ir noteikti moduļa lietošanas noteikumi, un pamattekstā ir noteikts, kā tiek īstenots apstrādes process.

Uzsākot katras FP programmas izstrādi, jāpatur prātā, ka tā parasti ir liela sistēma, tāpēc mums ir jāveic pasākumi tās vienkāršošanai. Lai to izdarītu, šāda programma tiek izstrādāta daļās, kuras sauc par programmas moduļiem. Un šo programmu izstrādes metodi sauc par modulāro programmēšanu. Programmatūras modulis- tas ir jebkurš procesa apraksta fragments, kas veidots kā neatkarīgs programmatūra, piemērots izmantošanai procesu aprakstos. Tas nozīmē, ka katrs programmas modulis tiek programmēts, kompilēts un atkļūdots atsevišķi no citiem programmas moduļiem, tādējādi fiziski atdalīts no citiem programmas moduļiem. Turklāt katru izstrādāto programmatūras moduli var iekļaut dažādās programmās, ja tiek ievēroti tā lietošanas nosacījumi, kas deklarēti šī moduļa dokumentācijā. Tādējādi programmatūras moduli var uzskatīt gan par līdzekli programmu sarežģītības apkarošanai, gan kā līdzekli programmēšanas dublēšanās apkarošanai (ti, kā programmētāju zināšanu uzkrāšanas un atkārtotas izmantošanas līdzekli).

Nav tik svarīgi definēt publisko datu moduļu nosaukumus, jo ar funkcijas pārdēvēšanu parasti pietiek, lai atklātu saskarnes iekļaušanas kļūmi. Tomēr moduļa nosaukuma pievienošana visiem publiskajiem datiem, tāpat kā funkciju nosaukumiem, samazina nosaukumu sadursmes iespējamību, ja modulis tiek pievienots bibliotēkai. Līdz šim mūsu piemēru saskarnēm ir bijušas tikai funkcijas un dati. Ja publiska funkcija izmanto vai atgriež apkopotus datus, piemēram, struktūru, mums parasti šī datu struktūra ir jādeklarē saskarnē.

Modulārā programmēšana ir iemiesojums abu programmu izstrādes procesā izplatītas metodes sarežģītības apkarošana un sistēmas komponentu neatkarības nodrošināšana, kā arī hierarhisku struktūru izmantošana. Lai realizētu pirmo metodi, tiek formulētas noteiktas prasības, kurām jāatbilst programmatūras modulim, t.i. tiek identificētas "labas" programmatūras moduļa galvenās īpašības. Otrās metodes realizēšanai tiek izmantotas kokam līdzīgas modulāras programmu struktūras (ieskaitot kokus ar sapludinātiem zariem).

Datu struktūras deklarēšana saskarnē klientiem atklāj iekšējos elementus. Tas bieži vien ir saprātīgi un nepieciešami; piemēram, ja klients vēlas nodot funkcijai lielu datu apjomu, var būt skaidrāk ievietot datus struktūrā un nodot struktūrai rādītāju, nevis nodot visus datus kā atsevišķus argumentus. Šajā gadījumā klientam ir jāzina struktūras komponentu nosaukumi, lai tas varētu aizpildīt savas vērtības.

Bet ko darīt, ja mēs vēlamies slēpt datu struktūras attēlojumu no klientiem? 4. sarakstā ir parādīts interfeiss modulim, kas nodrošina vienkāršu prioritāšu rindu. Prioritātes rindas klients var izveidot rindas, reģistrēt datus un deaktivizēt datus prioritārā secībā. Tomēr nekur interfeisā nav norādīta deklarētās prioritātes rindas faktiskā struktūra. Kaut kur tipam tas ir jādara prioritārās rindas ieviešanas daļā. Tas ļauj mums slēpt datu struktūras attēlojumu no mūsu klientiem.

1.3.2. Programmatūras moduļa galvenās īpašības.

Ne katrs programmas modulis veicina programmas vienkāršošanu. No šī viedokļa laba moduļa izvēle ir nopietns radošs uzdevums. Lai novērtētu izvēlētā moduļa pieņemamību, tiek izmantoti daži kritēriji. Tādējādi Holts ierosināja šādus divus vispārīgus šādus kritērijus:

Faktiskajās saskarnes definīcijās jāietver visa dokumentācija, kas programmētājam nepieciešama, lai izmantotu moduli. Tomēr šajā dokumentācijā nevajadzētu būt mājieniem par to, kā modulis faktiski tiek ieviests. Saglabājot dokumentāciju ar prototipu deklarācijām, programmētājs var vienreiz iegādāties, lai uzzinātu, kā lietot moduli.

Programmatūras moduļa galvenās īpašības

Atcerieties, ka modulārā programmēšana ir saistīta ar ieviešanas atsaisti no saskarnes un informācijas slēpšanu ieviešanā. Statikas disciplinēta izmantošana tiek izmantota, lai paslēptu ieviešanas detaļas. Interfeisa definīcija veido saikni starp moduli un tā klientiem. Joprojām ir vieta citam galvenes faila stilam. Ja lietojumprogramma izmanto konstantu vai datu tipu, tā pieder tradicionālajam galvenes failam. Modulārā programmēšana liek mums dziļāk domāt par to, kā mēs sadalām programmu tās sastāvdaļās.

  • labs modulis ir vieglāk no ārpuses nekā no iekšpuses;
  • labu moduli ir vieglāk lietot nekā izveidot.

Maierss iesaka izmantot vairāk programmatūras moduļa dizaina raksturlielumu, lai novērtētu tā pieņemamību: moduļa lielums; moduļa izturība; savienojums ar citiem moduļiem; moduļa rutīna (neatkarība no zvanu vēstures uz to).

Skaidru un vienkāršu saskarņu projektēšana palīdz precizēt programmas vispārējo struktūru. Moduļu programmēšana arī mudina mūs domāt par koda atkārtotu izmantošanu, gan formalizējot moduļa lietotāja interfeisu, gan skaidri norādot tā atkarības no citiem moduļiem. Moduļa atkarību skaita samazināšana palielina tā atkārtotas izmantošanas potenciālu. Šo samazinājumu bieži var panākt, vienkārši pārveidojot lietojumprogrammu moduļu funkcionalitāti.

Programmas struktūras veidošanas metodes

Galu galā lietojumprogramma kļūst par atkārtoti lietojamu elementu kolekciju ar vienu, pielāgojamu pamata moduli, kas tos visus saista kopā. Parnassus ir klasiska atsauce uz šo tēmu. Hansona grāmatā ir sniegti daudzi saskarņu un ieviešanas piemēri retā elegances un praktiskuma kombinācijā.

Izmērs Modulis tiek mērīts pēc tajā ietverto paziņojumu (rindu) skaita. Modulis nedrīkst būt pārāk mazs vai pārāk liels. Mazie moduļi rada smagnēju moduļu programmu struktūru, un tie var nebūt vērti ar to dizainu saistītās pieskaitāmās izmaksas. Lieli moduļi ir neērti studijām un mainīšanai, tie var ievērojami palielināt kopējo programmu atkārtoto tulkojumu laiku, veicot programmas atkļūdošanu. Parasti ir ieteicami programmu moduļi, kuru lielums ir no dažiem desmitiem līdz dažiem simtiem operatoru.

Spēks modulis ir tā iekšējo savienojumu mērs. Jo augstāks ir moduļa stiprums, jo vairāk savienojumu tas var paslēpt no programmas ārējās daļas attiecībā pret to un līdz ar to, jo lielāku ieguldījumu tas var dot programmas vienkāršošanā. Lai novērtētu moduļa stiprības pakāpi, Maierss piedāvā septiņu moduļu klašu komplektu, kas sakārtots pēc stiprības pakāpes. Modulim ir vājākā stiprības pakāpe, izturīgs nejaušības dēļ. Šis ir tāds modulis, kura elementiem nav jēgpilnu savienojumu. Šādu moduli var izcelt, piemēram, kad dažādās programmas vietās tiek atrasts vienas un tās pašas izteikumu secības atkārtojums, kas tiek veidots atsevišķā modulī. Nepieciešamība mainīt šo secību kādā no kontekstiem var izraisīt izmaiņas šajā modulī, kas var padarīt tā lietošanu citos kontekstos kļūdainu. Šīs klases programmatūras moduļi nav ieteicami lietošanai. Vispārīgi runājot, Maiersa piedāvātā moduļu klašu sakārtošana pēc stiprības pakāpes nav neapstrīdama. Tomēr tas nav īpaši svarīgi, jo lietošanai ir ieteicamas tikai divas augstākās stiprības klases moduļiem. Mēs apsvērsim šīs nodarbības sīkāk.

Funkcionāli izturīgs Modulis ir modulis, kas veic (īsteno) vienu noteiktu funkciju. Ieviešot šo funkciju, šāds modulis var izmantot citus moduļus. Šīs klases programmatūras moduļi ir ieteicami lietošanai.

Informatīvi izturīgs modulis ir modulis, kas veic (realizē) vairākas operācijas (funkcijas) vienā datu struktūrā (informācijas objektā), kas ārpus šī moduļa tiek uzskatīts par nezināmu. Katrai no šīm darbībām šādam modulim ir sava ievade ar savu piekļuves veidu. Šāda klase jāuzskata par programmu moduļu klasi ar visaugstāko stiprības pakāpi. Informācijas stipruma modulis var ieviest, piemēram, abstraktu datu tipu.

AT modulārās valodas programmēšana, vismaz ir līdzekļi funkcionāli stabilu moduļu definēšanai (piemēram, FUNCTION tipa modulis FORTRAN valodā). Līdzekļi informatīvi spēcīgu moduļu noteikšanai agrīnās programmēšanas valodās trūka - tie parādījās tikai vēlākās valodās. Tātad programmēšanas valodā Ada informatīvi izturīga moduļa norādīšanas līdzeklis ir pakete.

Sajūgs Modulis ir tā datu atkarības no citiem moduļiem mērs. To raksturo datu pārraides metode. Jo vājāka ir moduļa savienošana ar citiem moduļiem, jo ​​spēcīgāka ir tā neatkarība no citiem moduļiem. Lai novērtētu kohēzijas pakāpi, Maierss piedāvā sakārtotu sešu veidu moduļu kohēzijas kopumu. Sliktākais moduļu savienojuma veids ir satura saikne. Šī ir divu moduļu savienošana, ja vienam no tiem ir tiešas atsauces uz otra moduļa saturu (piemēram, uz konstanti, kas atrodas otrā modulī). Šāda moduļu savienošana ir nepieņemama. Tāpat nav ieteicams lietot vispārējā zonas saķere- šī ir tāda moduļu salikšana, kad vairāki moduļi izmanto vienu un to pašu atmiņas apgabalu. Šāda veida moduļu saistīšana tiek realizēta, piemēram, programmējot FORTRAN valodā, izmantojot COMMON blokus. Vienīgais moduļu ķēdes veids, ko ieteicams izmantot mūsdienu programmēšanas tehnoloģijās, ir parametriskā ķēde (Myers datu ķēde) — tas notiek, ja dati tiek pārsūtīti uz moduli vai nu tad, kad tiem tiek piekļūts kā tā parametru vērtība, vai kā tās piekļuves citam modulim rezultāts kādas funkcijas aprēķināšanai. Šis moduļu ķēdes veids tiek ieviests programmēšanas valodās, izmantojot procedūru (funkciju) izsaukumus.

Moduļa rutīna ir tā neatkarība no izsaukumu vēstures uz to. Modulis tiks izsaukts rutīna, ja tā izsaukšanas rezultāts (efekts) ir atkarīgs tikai no tā parametru vērtībām (un nav atkarīgs no zvanu vēstures uz to). Modulis tiks izsaukts atkarīgs no fona, ja tā izsaukšanas rezultāts (efekts) ir atkarīgs no šī moduļa iekšējā stāvokļa, kas saglabā iepriekšējo izsaukumu pēdas uz to. Maierss neiesaka izmantot no vēstures atkarīgus (neprognozējamus) moduļus, jo tie programmās ievieš sarežģītas (nenotveramas) kļūdas. Tomēr šāds ieteikums nav konstruktīvs, jo daudzos gadījumos tieši no vēstures atkarīgais modulis ir labākā informācijas stiprā moduļa ieviešana. Tāpēc pieņemamāks ir šāds (piesardzīgāks) ieteikums:

  • rutīnas modulis ir jāizmanto vienmēr, ja vien tas neizraisa sliktu (nav ieteicamu) moduļa savienojumu;
  • no vēstures atkarīgie moduļi ir jāizmanto tikai tad, ja nepieciešams, lai nodrošinātu parametru ķēdi;
  • no vēstures atkarīgā moduļa specifikācijā šī atkarība ir skaidri jāformulē tā, lai būtu iespējams paredzēt šī moduļa uzvedību (izpildes efektu) ar dažādiem turpmākiem tā izsaukumiem.

Saistībā ar pēdējo ieteikumu var būt lietderīgi definēt ārēju (uz cilvēku informēšanu orientētu) no vēstures atkarīgā moduļa stāvokļu attēlojumu. Šajā gadījumā katras šī moduļa realizētās funkcijas (operācijas) izpildes efekts ir jāapraksta ar šo ārējo attēlojumu, kas ievērojami vienkāršos šī moduļa darbības prognozēšanu.

1.3.3. Programmatūras produktu modulāra struktūra

Programmatūras produktu modulārās programmēšanas principi daudzējādā ziņā ir līdzīgi projektēšanas no augšas uz leju principiem. Pirmkārt, tiek noteikts funkciju sastāvs un pakļautība, bet pēc tam - programmatūras moduļu komplekts, kas realizē šīs funkcijas.

Viena veida funkcijas tiek realizētas ar tiem pašiem moduļiem. Tiek nodrošināta augstākā līmeņa funkcija galvenais modulis; tā kontrolē zemāko funkciju izpildi, kas atbilst padotajiem moduļi.

Nosakot moduļu kopu, kas īsteno noteikta algoritma funkcijas, jāņem vērā:

  1. katru moduli izsauc izpildei augstāka līmeņa modulis un pēc darba pabeigšanas atgriež vadību modulim, kas to izsauca;
  2. galveno lēmumu pieņemšana algoritmā tiek pacelta augstākajā iespējamajā hierarhijas līmenī;
  3. lai izmantotu vienu un to pašu funkciju dažādās algoritma vietās, tiek izveidots viens modulis, kuru pēc vajadzības izsauc izpildei. Algoritma tālākas pilnveidošanas rezultātā a funkcionāls un modulārs lietojumprogrammas algoritma shēmu (FMS), kas ir programmēšanas pamatā.

Programmas moduļu sastāvu un veidu, to mērķi un lietošanas veidu programmā lielā mērā nosaka rīki. Piemēram, attiecībā uz DBVS rīkiem atsevišķi moduļi var būt:

  1. ekrāna veidlapas datu bāzu informācijas ievadīšanai un/vai rediģēšanai;
  2. Atskaišu ģeneratoru atskaites;
  3. makro;
  4. standarta informācijas apstrādes procedūras;
  5. izvēlne, kas ļauj izvēlēties apstrādes funkciju utt.

1.3.4. Programmas struktūras izstrādes metodes.

Kā minēts iepriekš, kā programmas modulāro struktūru ir ierasts izmantot koka struktūru, ieskaitot kokus ar sapludinātiem zariem. Šāda koka mezglos ir programmas moduļi, un virzītās lokas (bultiņas) parāda moduļu statisko pakļautību, t.i. katrs loks parāda, ka tā moduļa tekstā, no kura tas ir cēlies, ir saite uz moduli, kurā tas ietilpst. Citiem vārdiem sakot, katrs modulis var piekļūt saviem pakārtotajiem moduļiem, t.i. izteikti šo moduļu izteiksmē. Tajā pašā laikā programmas modulārajā struktūrā galu galā jāietver arī specifikāciju kopums moduļiem, kas veido šo programmu. Specifikācija programmas modulis satur, pirmkārt, tā ievades sintaktisko specifikāciju, kas ļauj izveidot sintaktiski pareizu pievilcību tam (jebkurai tā ievadei) izmantotajā programmēšanas valodā, un, otrkārt, moduļa funkcionālo specifikāciju ( šī moduļa veikto funkciju semantikas apraksts katram no tā ievadiem). Moduļa funkcionālā specifikācija ir veidota tāpat kā PS funkcionālā specifikācija.

Programmas izstrādes gaitā tās modulāro struktūru var veidot dažādos veidos un izmantot, lai noteiktu šajā struktūrā norādīto moduļu programmēšanas un atkļūdošanas secību. Tāpēc mēs varam runāt par dažādām programmas struktūras izstrādes metodēm. Literatūrā parasti tiek aplūkotas divas metodes: augšupējas attīstības metode un augšupējās attīstības metode.

Metode augšupēja attīstība ir šāds. Pirmkārt, programmas modulārā struktūra ir veidota koka formā. Pēc tam programmas moduļi tiek programmēti pa vienam, sākot no zemākā līmeņa moduļiem (programmas moduļu struktūras koka lapām), tādā secībā, lai katram programmējamam modulim visi moduļi, kuriem tas var piekļūt ir ieprogrammēts. Pēc tam, kad visi programmas moduļi ir ieprogrammēti, tie pēc kārtas tiek pārbaudīti un atkļūdoti principā tādā pašā (augošā) secībā, kādā tie tika ieprogrammēti. No pirmā acu uzmetiena šāda programmu izstrādes secība šķiet gluži dabiska: programmējot katrs modulis tiek izteikts caur tieši ieprogrammētiem pakārtotajiem moduļiem, bet testējot izmanto jau atkļūdotus moduļus. tomēr modernās tehnoloģijas neiesaka šādu programmas izstrādes kārtību. Pirmkārt, jebkura moduļa programmēšanai tā izmantoto moduļu teksti vispār nav nepieciešami - šim nolūkam pietiek ar to, ka katrs izmantotais modulis ir tikai norādīts (tiktāl, ciktāl tas ļauj veidot pareizu pievilcību tam), un tā pārbaudei ir iespējams (un pat, kā mēs parādīsim tālāk, tas ir noderīgi) izmantotos moduļus tos aizstāt ar simulatoriem (stubs). Otrkārt, katra programma zināmā mērā ir pakļauta kaut kādiem tās iekšējiem apsvērumiem, bet globāliem saviem moduļiem (īstenošanas principiem, pieņēmumiem, datu struktūrām utt.), kas nosaka tās konceptuālo integritāti un veidojas tās izstrādes procesā. Augšupējas izstrādes laikā šī globālā informācija zemāka līmeņa moduļiem vēl nav pilnībā skaidra, tāpēc ļoti bieži ir nepieciešams tos pārprogrammēt, kad, programmējot citus moduļus, šī globālā informācija tiek būtiski precizēta (piemēram, globālā datu struktūra izmaiņas). Treškārt, testēšanas laikā no apakšas uz augšu katram modulim (izņemot galveno) ir jāizveido vadošā programma (modulis), kurai jāsagatavo testējamajam modulim nepieciešamais informācijas vides stāvoklis un jāveic nepieciešamais zvaniet uz to. Tas noved pie lielas "atkļūdošanas" programmēšanas un tajā pašā laikā nedod nekādu garantiju, ka moduļi tika pārbaudīti tieši tādos apstākļos, kādos tie tiks izpildīti darba programmā.

Metode attīstība no augšas uz leju ir šāds. Tāpat kā iepriekšējā metodē, programmas modulārā struktūra vispirms tiek veidota koka formā. Pēc tam programmas moduļi tiek programmēti pa vienam, sākot no augstākā līmeņa (galvas) moduļa, pārejot uz kāda cita moduļa programmēšanu tikai tad, ja modulis, kas tam piekļūst, jau ir ieprogrammēts. Kad visi programmas moduļi ir ieprogrammēti, tie tiek pārbaudīti un atkļūdoti pa vienam tādā pašā (dilstošā) secībā. Ar šādu programmu izstrādes kārtību visa nepieciešamā globālā informācija tiek ģenerēta savlaicīgi, t.i. ļoti nepatīkams kļūdainu aprēķinu avots, kad tiek novērsti programmēšanas moduļi. Ievērojami tiek atvieglota arī moduļu testēšana, kas tiek veikta programmas testēšanas no augšas uz leju laikā. Vispirms tiek testēts programmas galvas modulis, kas reprezentē visu testējamo programmu un tāpēc tiek testēts informācijas vides "dabiskajā" stāvoklī, kurā šī programma sāk darboties. Šajā gadījumā visi moduļi, kuriem var piekļūt ar galvu, tiek aizstāti ar to atdarinātājiem (tā sauktajiem stubiem). Katrs moduļa simulatorsšķiet ļoti vienkāršs programmas fragments, kas signalizē būtībā par piekļuvi simulētajam modulim ar tā ievades parametru vērtību apstrādi, kas nepieciešamas pareizai programmas darbībai (dažreiz ar to izdruku) un ar ja nepieciešams, iepriekš saglabāta piemērota rezultāta izdošana. Pēc galvas un jebkura nākamā moduļa testēšanas un atkļūdošanas pabeigšanas tiek veikta pāreja uz viena no moduļiem, kurus pašlaik attēlo simulatori, ja tādi ir, testēšanu. Lai to izdarītu, testēšanai izvēlētā moduļa simulators tiek aizstāts ar pašu moduli un tiek pievienoti to moduļu simulatori, kuriem var piekļūt testēšanai izvēlētais modulis. Turklāt katrs šāds modulis tiks pārbaudīts informācijas vides "dabiskajos" stāvokļos, kas rodas brīdī, kad šim modulim tiek piekļūts testējamās programmas izpildes laikā. Tādējādi liela daļa "atkļūdošanas" programmēšanas tiek aizstāta ar diezgan vienkāršu programmā izmantoto moduļu simulatoru programmēšanu. Turklāt simulatori ir noderīgi, lai spēlētu kopā ar testa atlases procesu, norādot vēlamos simulatoru radītos rezultātus.

Daži lejupējās attīstības trūkumi, kas rada zināmas grūtības tās piemērošanā, ir nepieciešamība abstrahēties pamata iespējas izmantotā programmēšanas valoda, izdomājot abstraktas darbības, kuras vēlāk būs jārealizē, izmantojot programmā izceltos moduļus. Tomēr šķiet, ka šādu abstrakciju spēja ir nepieciešams nosacījums lielu programmatūras rīku izstrādei, tāpēc tā ir jāattīsta.

Aplūkotajās augšupējās un lejupējās attīstības metodēs (kuras mēs sauksim klasika) pirms moduļu programmēšanas jāizstrādā programmas moduļu koka struktūra. Taču šāda pieeja rada virkni iebildumu: šķiet apšaubāmi, vai pirms moduļu programmēšanas būtu iespējams pietiekami precīzi un jēgpilni izstrādāt programmas struktūru. Faktiski tas nav jādara: programmatūras izstrādes konstruktīvajā un arhitektoniskajā pieejā moduļu programmēšanas procesā tiek veidota modulāra struktūra.

konstruktīva pieeja to programmu izstrāde ir lejupējas izstrādes modifikācija, kurā programmas modulārā koka struktūra tiek veidota moduļa programmēšanas laikā. Pirmkārt, galvas modulis tiek ieprogrammēts, pamatojoties uz visas programmas specifikāciju, un programmas specifikācija vienlaikus ir arī tās galvas moduļa specifikācija, jo pēdējais uzņemas pilnu atbildību par programmas funkciju izpildi. Galvas moduļa programmēšanas procesā, ja šī programma ir pietiekami liela, tiek izdalīti apakšuzdevumi (iekšējās funkcijas), kuru izteiksmē tiek programmēts galvas modulis. Tas nozīmē, ka katram izvēlētajam apakšuzdevumam (funkcijai) tiek izveidota to realizējošā programmas fragmenta specifikācija, kuru vēlāk var attēlot ar kādu moduļu apakškoku. Svarīgi atzīmēt, ka arī šeit šī apakškoka galvas (varbūt vienīgais) modulis uzņemas atbildību par iezīmētās funkcijas izpildi, tāpēc iezīmētās funkcijas specifikācija ir arī šī apakškoka galvas moduļa specifikācija. Programmas galvas modulī, lai izsauktu izvēlēto funkciju, tiek veikts izsaukums uz norādītā apakškoka galvas moduli atbilstoši tā specifikācijai. Tādējādi programmas izstrādes pirmajā solī (programmējot tā galvas moduli) tiek izveidota koka augšējā sākuma daļa, piemēram, tā, kas parādīta attēlā. 1.3.1.


Rīsi. 1.3.1. Pirmais solis programmas modulāras struktūras veidošanā ar konstruktīvu pieeju.

Līdzīgas darbības tiek veiktas, programmējot jebkuru citu moduli, kas tiek izvēlēts no programmas koka pašreizējā stāvokļa no norādītajiem, bet vēl neieprogrammētajiem moduļiem. Tā rezultātā tiek veikta nākamā programmas koka pabeigšana, piemēram, tā, kas parādīta attēlā. 1.3.2.

arhitektoniskā pieeja to programmas izstrāde ir augšupējas attīstības modifikācija, kurā programmas modulārā struktūra tiek veidota moduļa programmēšanas procesā. Bet tajā pašā laikā tiek izvirzīts ievērojami atšķirīgs attīstības mērķis: palielināt izmantotās programmēšanas valodas līmeni, nevis izstrādāt konkrētu programmu. Tas nozīmē, ka noteiktai priekšmeta jomai tiek identificētas tipiskās funkcijas, no kurām katra var tikt izmantota dažādu šīs jomas problēmu risināšanai, un tiek norādīti un pēc tam ieprogrammēti atsevišķi programmu moduļi, kas veic šīs funkcijas. Tā kā šādu funkciju izcelšanas process ir saistīts ar pieredzes uzkrāšanu un vispārināšanu problēmu risināšanā noteiktā mācību jomā, parasti vienkāršākas funkcijas vispirms tiek izdalītas un ieviestas ar atsevišķiem moduļiem, un pēc tam pakāpeniski parādās moduļi, kas izmanto iepriekš izdalītās funkcijas. Šāds moduļu komplekts tiek veidots, cerot, ka, izstrādājot konkrētas mācību priekšmetu jomas konkrētu programmu, konstruktīvas pieejas ietvaros, daži no šiem moduļiem var būt pieņemami. Tas ļauj būtiski samazināt darbaspēka izmaksas konkrētas programmas izstrādei, pieslēdzot tai iepriekš sagatavotas un praksē pārbaudītas zemāka līmeņa moduļu konstrukcijas. Tā kā šādas struktūras var atkārtoti izmantot dažādās īpašās programmās, arhitektūras pieeju var uzskatīt par veidu, kā cīnīties pret dublēšanos programmēšanā. Šajā sakarā programmatūras moduļi, kas izveidoti arhitektūras pieejā, parasti tiek parametrizēti, lai uzlabotu šādu moduļu pielietojamību, pielāgojot tos parametriem.


Rīsi. 1.3.2. Otrais solis programmas modulārās struktūras veidošanā ar konstruktīvu pieeju.

Klasiskajā lejupējās izstrādes metodē ieteicams vispirms ieprogrammēt visus izstrādājamās programmas moduļus un tikai pēc tam sākt to testēšanu no augšas uz leju. Tomēr šāds izstrādes pasūtījums nešķiet pietiekami pamatots: moduļu testēšana un atkļūdošana var izraisīt pakārtoto moduļu specifikācijas izmaiņas un pat izmaiņas programmas ļoti modulārajā struktūrā, tā ka šajā gadījumā daži moduļi var izrādīties bezjēdzīgi paveikts darbs. Mums šķiet racionālāka cita programmu izstrādes kārtība, kas literatūrā pazīstama kā lejupējas ieviešanas metode. Izmantojot šo metodi, katrs ieprogrammētais modulis tiek nekavējoties pārbaudīts, pirms pāriet uz cita moduļa programmēšanu.

Arī visām šīm metodēm ir dažādas variācijas atkarībā no secības, kādā programmas izstrādes procesā tiek šķērsoti programmas koka struktūras mezgli (moduļi). To var izdarīt, piemēram, slāņos (izstrādājot visus viena līmeņa moduļus pirms pārejas uz nākamo līmeni). Izstrādē no augšas uz leju koku var šķērsot arī leksikogrāfiskā secībā (no augšas uz leju, pa kreisi-pa labi). Ir arī citas iespējas, kā šķērsot koku. Tādējādi konstruktīvā īstenošanā programmas koka šķērsošanai ir ieteicams ievērot Fuksmana idejas, kuras viņš izmantoja savā piedāvātajā vertikālās foliācijas metodē. Šāda apvedceļa būtība ir šāda. Konstruktīvās pieejas ietvaros vispirms tiek realizēti tikai tie moduļi, kas nepieciešami programmas vienkāršākajai versijai, kuru normāli var izpildīt tikai ļoti ierobežotam ievaddatu kopu kopumam, bet šādiem datiem šis uzdevums tiks atrisināts. līdz beigām. Citu moduļu vietā, uz kuriem ir atsauce šādā programmā, šajā programmā tiek ievietoti tikai to atdarinātāji, kas galvenokārt nodrošina kontroli pār pāri šim konkrētajam gadījumam. Pēc tam šai programmai tiek pievienotas dažu citu moduļu implementācijas (jo īpaši dažu esošo simulatoru vietā), nodrošinot normālu izpildi dažām citām ievaddatu kopām. Un šis process turpinās pa posmiem līdz vajadzīgās programmas pilnīgai ieviešanai. Tādējādi tiek veikta programmu koka caurbraukšana, lai pēc iespējas īsākā veidā realizētu vienu vai otru normāli strādājošas programmas variantu (pirmo visvienkāršāko). Šajā sakarā šāda veida konstruktīvu ieviešanu sauc par metodi mērķtiecīga konstruktīva īstenošana. Šīs metodes priekšrocība ir tā, ka ar to jau ir pietiekami agrīnā stadijā tiek izveidota izstrādātās programmas darba versija. Psiholoģiski tas spēlē dopinga lomu, kas ievērojami palielina izstrādātāja efektivitāti. Tāpēc šī metode ir ļoti pievilcīga.


Rīsi. 1.3.3. Programmu struktūras izstrādes metožu klasifikācija.

Apkopojot teikto, attēlā. 1.3.3. ir sniegta vispārīga shēma aplūkoto metožu klasifikācijai programmas struktūras izstrādei.

1.3.5. Programmas struktūras kontrole.

Lai kontrolētu programmas struktūru, var izmantot trīs metodes:

  • statiskā vadība,
  • blakus esošā vadība,
  • pilnīga kontrole.

Statiskā kontrole sastāv no programmas struktūras novērtēšanas no viedokļa, vai programma ir labi sadalīta moduļos, ņemot vērā iepriekš apskatītās moduļa galveno raksturlielumu vērtības.

Blakus esošā vadība no augšas ir PS arhitektūras un ārējā apraksta izstrādātāju kontrole. Blakus esošā vadība no apakšas ir moduļu specifikāciju kontrole, ko veic šo moduļu izstrādātāji.

Pilnīga kontrole ir programmas struktūras garīga ritināšana (pārbaude), izpildot iepriekš izstrādātus testus. Tas ir dinamiskas vadības veids, tāpat kā manuāla PS funkcionālās specifikācijas vai arhitektūras imitācija.

Jāatzīmē, ka šo kontroles metožu ieviešanas raksturs ir atkarīgs no izvēlētās programmas struktūras izstrādes metodes: klasiskajā pieejā tās tiek pielietotas pirms moduļu programmēšanas, bet konstruktīvajā un arhitektoniskajā pieejā – procesā. programmēšanas moduļus (atbilstošā laikā).