Programare modulară - Modular programming

Programarea modulară este o tehnică de proiectare software care pune accentul pe separarea funcționalității unui program în module independente, interschimbabile , astfel încât fiecare conține tot ceea ce este necesar pentru a executa doar un aspect al funcționalității dorite.

O interfață a modulului exprimă elementele furnizate și solicitate de modul. Elementele definite în interfață sunt detectabile de alte module. Implementarea conține codul de lucru care corespunde elementelor declarate în interfața. Programarea modulară este strâns legată de programarea structurată și programarea orientată pe obiecte , toate având același scop de a facilita construcția de programe și sisteme software mari prin descompunere în bucăți mai mici și toate având originea în jurul anilor 1960. În timp ce utilizarea istorică a acestor termeni a fost inconsistentă, „programarea modulară” se referă acum la descompunerea la nivel înalt a codului unui întreg program în bucăți: programare structurată la utilizarea codului de nivel scăzut al fluxului de control structurat și obiect- programare orientată către utilizarea datelor a obiectelor , un fel de structură a datelor .

În programarea orientată obiect, utilizarea interfețelor ca model arhitectural pentru a construi module este cunoscută sub numele de programare bazată pe interfață .

Terminologie

Termenul asamblare (ca în limbaje .NET precum C # , F # sau Visual Basic .NET ) sau pachet (ca în Dart , Go sau Java ) este uneori folosit în locul modulului . În alte implementări, acestea sunt concepte distincte; în Python un pachet este o colecție de module, în timp ce în Java 9 a fost implementată introducerea noului concept de modul (o colecție de pachete cu control de acces îmbunătățit).

Mai mult, termenul „pachet” are alte utilizări în software (de exemplu, pachetele .NET NuGet ). O componentă este un concept similar, dar de obicei se referă la un nivel superior; o componentă este o bucată dintr-un întreg sistem , în timp ce un modul este o bucată dintr-un program individual. Scara termenului „modul” variază semnificativ între limbi; în Python este foarte mic și fiecare fișier este un modul, în timp ce în Java 9 este planificat să fie pe scară largă, unde un modul este o colecție de pachete, care sunt la rândul lor colecții de fișiere.

Alți termeni pentru module includ unitate , utilizată în dialectele Pascal .

Suport lingvistic

Limbile care acceptă formal conceptul de modul includ Ada , Algol , BlitzMax , C ++ , C # , Clojure , COBOL , Common_Lisp , D , Dart , eC , Erlang , Elixir , Elm , F , F # , Fortran , Go , Haskell , IBM / 360 Assembler , Control Language (CL), IBM RPG , Java , MATLAB , ML , Modula , Modula-2 , Modula-3 , Morpho, NEWP , Oberon , Oberon-2 , Objective-C , OCaml , mai mulți derivați ai lui Pascal ( Component Pascal , Object Pascal , Turbo Pascal , UCSD Pascal ), Perl , PL / I , PureBasic , Python , R , Ruby , Rust , JavaScript , Visual Basic .NET și WebDNA .

Exemple evidente de limbaje care nu au suport pentru module sunt C și au fost C ++ și Pascal în forma lor originală, C și C ++ permit totuși să fie specificate interfețe de compilare și declarative folosind fișiere antet . Module au fost adăugate la Objective-C în iOS 7 (2013); la C ++ cu C ++ 20 , iar Pascal a fost înlocuit de Modula și Oberon, care au inclus module de la început și diverse derivate care au inclus module. JavaScript are module native de la ECMAScript 2015.

Programarea modulară poate fi realizată chiar și atunci când limbajul de programare nu are caracteristici sintactice explicite pentru a sprijini modulele denumite, cum ar fi, de exemplu, în C. Acest lucru se realizează prin utilizarea caracteristicilor de limbaj existente, împreună cu, de exemplu, convențiile de codare , expresiile de programare și structura codului. IBM i folosește și module atunci când programează în mediul de limbă integrat (ILE).

Aspecte cheie

Cu programarea modulară, preocupările sunt separate astfel încât modulele să îndeplinească funcții discrete logic, interacționând prin interfețe bine definite. Adesea modulele formează un grafic aciclic direcționat (DAG); în acest caz, o dependență ciclică între module este văzută ca indicând faptul că acestea ar trebui să fie un singur modul. În cazul în care modulele formează un DAG, acestea pot fi aranjate ca o ierarhie, unde modulele de nivel inferior sunt independente, în funcție de alte module, iar modulele de nivel superior depind de cele de nivel inferior. Un anumit program sau bibliotecă este un modul de nivel superior al propriei ierarhii, dar poate fi la rândul său văzut ca un modul de nivel inferior al unui program, bibliotecă sau sistem de nivel superior.

Când creați un sistem modular, în loc să creați o aplicație monolitică (unde cea mai mică componentă este întreaga), mai multe module mai mici sunt scrise separat, astfel încât atunci când sunt compuse împreună, ele construiesc programul de aplicație executabil. De obicei, acestea sunt de asemenea compilate separat, prin compilare separată , și apoi legate de un linker . Un compilator just-in-time poate efectua o parte din această construcție „din mers” în timpul rulării .

Aceste funcții independente sunt clasificate în mod obișnuit fie ca funcții de control al programului, fie ca funcții specifice de activitate. Funcțiile de control al programului sunt proiectate să funcționeze pentru un singur program. Funcțiile specifice ale sarcinii sunt pregătite îndeaproape pentru a fi aplicabile pentru diferite programe.

Acest lucru face ca sistemele proiectate modulare, dacă sunt construite corect, să fie mult mai reutilizabile decât un design monolitic tradițional, deoarece toate (sau multe) dintre aceste module pot fi apoi refolosite (fără modificări) în alte proiecte. Acest lucru facilitează, de asemenea, „descompunerea” proiectelor în mai multe proiecte mai mici. Teoretic, un proiect software modularizat va fi asamblat mai ușor de către echipe mari, deoarece niciun membru al echipei nu creează întregul sistem sau chiar nu trebuie să știe despre sistemul în ansamblu. Se pot concentra doar pe sarcina mai mică atribuită.

Istorie

Programarea modulară, sub formă de subsisteme (în special pentru I / O) și biblioteci de software, datează de la primele sisteme software, unde a fost utilizată pentru reutilizarea codului . Programarea modulară în sine, cu un obiectiv de modularitate, s-a dezvoltat la sfârșitul anilor 1960 și 1970, ca un analog la scară mai mare al conceptului de programare structurată (anii 1960). Termenul „programare modulară” datează cel puțin din Simpozionul național de programare modulară, organizat la Institutul de informații și sisteme în iulie 1968 de Larry Constantine ; alte concepte cheie au fost ascunderea informațiilor (1972) și separarea preocupărilor (SoC, 1974).

Modulele nu au fost incluse în specificația inițială pentru ALGOL 68 (1968), dar au fost incluse ca extensii în implementările timpurii, ALGOL 68-R (1970) și ALGOL 68C (1970) și ulterior formalizate. Unul dintre primele limbaje concepute de la început pentru programarea modulară a fost Modula de scurtă durată (1975), de Niklaus Wirth . Un alt limbaj modular timpuriu a fost Mesa (1970), de Xerox PARC , iar Wirth s-a bazat pe Mesa, precum și pe Modula originală în succesorul său, Modula-2 (1978), care a influențat limbile ulterioare, în special prin succesorul său, Modula-3 ( Anii 1980). Utilizarea de către Modula a unor nume calificate cu puncte , cum ar fi M.areferirea la obiectul adin modul M, coincide cu notația pentru a accesa un câmp al unei înregistrări (și în mod similar pentru atributele sau metodele obiectelor) și este acum răspândită, văzută în C #, Dart, Go, Java și Python, printre altele. Programarea modulară a devenit răspândită din anii 1980: limbajul Pascal original (1970) nu a inclus module, dar versiunile ulterioare, în special UCSD Pascal (1978) și Turbo Pascal (1983) le-au inclus sub formă de „unități”, la fel ca și Pascal -A influențat Ada (1980). Standardul Extended Pascal ISO 10206: 1990 s-a menținut mai aproape de Modula2 în suportul său modular. Standard ML (1984) are unul dintre cele mai complete sisteme de module, incluzând funcții (module parametrizate) pentru maparea între module.

În anii 1980 și 1990, programarea modulară a fost umbrită și deseori combinată cu programarea orientată pe obiecte , în special datorită popularității C ++ și Java. De exemplu, familia de limbaje C avea suport pentru obiecte și clase în C ++ (inițial C cu clase , 1980) și Objective-C (1983), suportând doar module cu 30 de ani sau mai mult. Java (1995) acceptă module sub formă de pachete, deși unitatea principală de organizare a codului este o clasă. Cu toate acestea, Python (1991) a folosit în mod proeminent atât module, cât și obiecte de la început, folosind module ca unitate primară de organizare a codului și „pachete” ca unitate la scară mai mare; și Perl 5 (1994) include suport pentru module și obiecte, o gamă largă de module fiind disponibile de la CPAN (1993).

Programarea modulară este acum răspândită și se găsește în practic toate limbile majore dezvoltate începând cu anii 1990. Importanța relativă a modulelor variază între limbi, iar în limbile orientate pe obiecte bazate pe clase există încă suprapuneri și confuzii cu clasele ca unitate de organizare și încapsulare, dar ambele sunt bine stabilite ca concepte distincte.

Vezi si

Note

Referințe

linkuri externe