Modulær programmering - Modular programming

Modulær programmering er en softwaredesignteknik , der understreger adskillelse af et programs funktionalitet i uafhængige, udskiftelige moduler , således at hver indeholder alt, hvad der er nødvendigt for kun at udføre et aspekt af den ønskede funktionalitet.

Et modul interfacet udtrykker de elementer, der leveres og kræves af modulet. De elementer, der er defineret i grænsefladen, kan detekteres af andre moduler. Den implementeringen indeholder arbejdsmiljøet kode, som svarer til de elementer erklæret i grænsefladen. Modulær programmering er tæt forbundet med struktureret programmering og objektorienteret programmering , der alle har samme mål om at lette konstruktionen af ​​store softwareprogrammer og -systemer ved nedbrydning i mindre stykker, og alle med oprindelse omkring 1960'erne. Selvom den historiske brug af disse udtryk har været inkonsekvent, refererer "modulær programmering" nu til nedbrydning på højt niveau af et helt program i stykker: struktureret programmering til lavniveau-kodebrug af struktureret kontrolflow , og objekt- orienteret programmering til dataanvendelse af objekter , en slags datastruktur .

I objektorienteret programmering er brugen af ​​grænseflader som et arkitektonisk mønster til at konstruere moduler kendt som grænsefladebaseret programmering .

Terminologi

Udtrykket samling (som i .NET -sprog som C# , F# eller Visual Basic .NET ) eller pakke (som i Dart , Go eller Java ) bruges undertiden i stedet for modul . I andre implementeringer er disse forskellige begreber; i Python er en pakke en samling af moduler, mens introduktionen af ​​det nye modulkoncept (en samling pakker med forbedret adgangskontrol) i Java 9 blev implementeret.

Endvidere har udtrykket "pakke" andre anvendelser i software (f.eks. .NET NuGet -pakker ). En komponent er et lignende koncept, men refererer typisk til et højere niveau; en komponent er et stykke af et helt system , mens et modul er et stykke af et individuelt program. Omfanget af udtrykket "modul" varierer betydeligt mellem sprog; i Python er det meget lille og hver fil er et modul, mens det i Java 9 er planlagt at være i stor skala, hvor et modul er en samling af pakker, som igen er samlinger af filer.

Andre udtryk for moduler inkluderer enhed , der bruges i Pascal -dialekter.

Sprogstøtte

Sprog, der formelt understøtter modulkonceptet, inkluderer 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 , flere derivater af Pascal ( Component Pascal , Object Pascal , Turbo Pascal , UCSD Pascal ), Perl , PL/I , PureBasic , Python , R , Ruby , Rust , JavaScript , Visual Basic .NET og WebDNA .

Fremtrædende eksempler på sprog, der mangler understøttelse af moduler, er C og har været C ++ og Pascal i deres oprindelige form, men C og C ++ gør det dog muligt at specificere separat kompilering og deklarative grænseflader ved hjælp af header -filer . Moduler blev tilføjet til Objective-C i iOS 7 (2013); til C ++ med C ++ 20 , og Pascal blev afløst af Modula og Oberon, som inkluderede moduler fra starten, og forskellige derivater, der inkluderede moduler. JavaScript har haft native moduler siden ECMAScript 2015.

Modulær programmering kan udføres, selvom programmeringssproget mangler eksplicitte syntaktiske funktioner til at understøtte navngivne moduler, f.eks. I C. Dette gøres ved at bruge eksisterende sprogfunktioner sammen med for eksempel kodningskonventioner , programmeringsformsprog og de fysiske kode struktur. IBM i bruger også moduler, når de programmerer i det integrerede sprogmiljø (ILE).

Vigtige aspekter

Med modulær programmering adskilles bekymringer, så moduler udfører logisk diskrete funktioner, der interagerer gennem veldefinerede grænseflader. Ofte danner moduler en rettet acyklisk graf (DAG); i dette tilfælde ses en cyklisk afhængighed mellem moduler som et tegn på, at disse skal være et enkelt modul. I det tilfælde, hvor moduler udgør en DAG, kan de arrangeres som et hierarki, hvor modulerne på laveste niveau er uafhængige, afhængigt af ingen andre moduler, og moduler på højere niveau afhænger af dem på lavere niveau. Et bestemt program eller bibliotek er et modul på topniveau i sit eget hierarki, men kan igen ses som et modul på et lavere niveau i et program, bibliotek eller system på et højere niveau.

Når du opretter et modulsystem, i stedet for at oprette en monolitisk applikation (hvor den mindste komponent er helheden), skrives flere mindre moduler separat, så når de er sammensat sammen, konstruerer de det eksekverbare applikationsprogram. Typisk kompileres disse også separat, via separat kompilering og derefter forbundet med en linker . En just-in-time-kompilator udfører muligvis noget af denne konstruktion "on-the-fly" i løbetid .

Disse uafhængige funktioner klassificeres almindeligvis som enten programkontrolfunktioner eller specifikke opgavefunktioner. Programkontrolfunktioner er designet til at fungere for ét program. Specifikke opgavefunktioner er tæt forberedt på at være anvendelige til forskellige programmer.

Dette gør modulopbyggede systemer, hvis de er bygget korrekt, langt mere genanvendelige end et traditionelt monolitisk design, da alle (eller mange) af disse moduler derefter kan genbruges (uden ændringer) i andre projekter. Dette letter også "nedbrydning" af projekter til flere mindre projekter. Teoretisk set vil et modulopbygget softwareprojekt lettere samles af store teams, da ingen teammedlemmer opretter hele systemet eller endda behøver at vide om systemet som helhed. De kan fokusere bare på den tildelte mindre opgave.

Historie

Modulær programmering, i form af delsystemer (især til I/O) og softwarebiblioteker, stammer fra tidlige softwaresystemer, hvor den blev brugt til genbrug af kode . Modulær programmering i sig selv, med et mål om modularitet, udviklet i slutningen af ​​1960'erne og 1970'erne, som en analog i større skala til begrebet struktureret programmering (1960'erne). Udtrykket "modulær programmering" stammer mindst fra det nationale symposium om modulær programmering, organiseret på Information and Systems Institute i juli 1968 af Larry Constantine ; andre nøglebegreber var informations skjul (1972) og adskillelse af bekymringer (SoC, 1974).

Moduler var ikke inkluderet i den originale specifikation for ALGOL 68 (1968), men blev inkluderet som udvidelser i tidlige implementeringer, ALGOL 68-R (1970) og ALGOL 68C (1970), og senere formaliseret. Et af de første sprog designet fra starten til modulær programmering var den kortvarige Modula (1975), af Niklaus Wirth . Et andet tidligt modulsprog var Mesa (1970'erne), af Xerox PARC , og Wirth trak på Mesa såvel som den originale Modula i dens efterfølger, Modula-2 (1978), som påvirkede senere sprog, især gennem dens efterfølger, Modula-3 ( 1980'erne). Modulas brug af prikkvalificerede navne , som M.aat henvise til objekt afra modul M, falder sammen med notation for at få adgang til et felt i en post (og tilsvarende for attributter eller metoder til objekter), og er nu udbredt, set i C#, Dart, Go, Blandt andet Java og Python. Modulær programmering blev udbredt fra 1980'erne: det originale Pascal -sprog (1970) omfattede ikke moduler, men senere versioner, især UCSD Pascal (1978) og Turbo Pascal (1983) inkluderede dem i form af "enheder", ligesom Pascal gjorde -påvirket Ada (1980). Den udvidede Pascal ISO 10206: 1990 -standard holdt tættere på Modula2 i sin modulære understøttelse. Standard ML (1984) har et af de mest komplette modulsystemer, inklusive funktorer (parametriserede moduler) til kortlægning mellem moduler.

I 1980'erne og 1990'erne blev modulær programmering overskygget af og ofte i konflikt med objektorienteret programmering , især på grund af populariteten af ​​C ++ og Java. F.eks. Havde sprogfamilien C støtte til objekter og klasser i C ++ (oprindeligt C med klasser , 1980) og Objective-C (1983), der kun understøttede moduler 30 år eller mere senere. Java (1995) understøtter moduler i form af pakker, selvom den primære enhed for kodeorganisation er en klasse. Imidlertid brugte Python (1991) fremtrædende både moduler og objekter fra starten ved hjælp af moduler som den primære enhed for kodeorganisation og "pakker" som en større enhed; og Perl 5 (1994) inkluderer understøttelse af både moduler og objekter, idet en lang række moduler er tilgængelige fra CPAN (1993).

Modulær programmering er nu udbredt og findes på stort set alle større sprog udviklet siden 1990'erne. Modulernes relative betydning varierer mellem sprog, og i klassebaserede objektorienterede sprog er der stadig overlapning og forvirring med klasser som en enhed for organisation og indkapsling, men disse er begge veletablerede som adskilte begreber.

Se også

Noter

Referencer

eksterne links