Gestructureerd programmeren

Uit Wikipedia, de vrije encyclopedie
Naar navigatie springen Naar zoeken springen

Gestructureerd programmeren kan worden gezien als een subdiscipline van procedureel programmeren, een van de belangrijke programmeerparadigma's (en waarschijnlijk het populairste) voor het programmeren van computers.

In dit concept beperkt de programmeur zich in de programma afloop tot de 4 basis controlstructuren en past het concept abstractie consequent toe; d.w.z. het vermijden van lange programmablokken door het veelvuldig, hiërarchisch, toepassen van relatief kleine subroutines.

In de jaren zestig werd het langzaamaan duidelijk dat de omvang en complexiteit van computerprogramma's uit de hand begon te lopen. Programmeurs zagen door de bomen het bos niet meer.

Goede programmeurs wisten door gestructureerd te werken echter toch code te produceren die veel makkelijker te doorzien was en waarvan de correctheid eenvoudiger was aan te tonen. Het viel op dat bekwame programmeurs met name veel minder GOTO-statements gebruikten en veelvuldig gebruik maakten van subroutines. Wetenschappers in de informatica, waaronder met name Edsger Dijkstra, Jean-Dominique Warnier en Michael A. Jackson, zagen de oplossing in het gestructureerd programmeren, waarbij het door het gebruik van abstractie en nieuwe constructies in programmeertalen o.a. onnodig zou worden om onoverzichtelijke constructies met het goto-statement te gebruiken, waardoor de leesbaarheid van code veel beter werd.

Dijkstra probeerde daarbij generieke correctheidsbewijzen van programma's te leveren; hierin is hij gedeeltelijk geslaagd.

Daarnaast werd beoogd parallel werken in grote teams aan grote projecten mogelijk te maken; dit is wel gelukt door deze aanpak.

Een gestructureerde aanpak leidt ook tot software waarin functies meer afzonderlijk van elkaar zijn gebouwd; dit maakt onderhoud, zowel correctief als adaptief, aanzienlijk eenvoudiger en minder risicovol.


De essentie van gestructureerd programmeren[bewerken | brontekst bewerken]

De vier basis controlstructuren in gestructureerd programmeren zijn:

  • sequentie = opeenvolging (S1 S2)
  • selectie = keuzestructuur (if B then S1 else S2)
  • iteratie = herhaling (met de herhalingsvoorwaarde voor- of achteraf; meestal while B do S en do S until B)
  • recursie = het steeds aanroepen van een functie/procedure door zichzelf, totdat een eindconditie wordt bereikt.

Hierbij staat S voor een opdracht (Statement) en B voor een logische expressie (Boolean). Belangrijk is hierbij dat zowel een opdracht als een logische expressie willekeurig complex mag zijn. In programmeertalen is dat voor opdrachten gerealiseerd door begin…end-constructies:

Tenslotte is de toepassing van het concept van abstractie en daarmee van de subroutine een essentieel onderdeel van de gestructureerde aanpak.

Als alternatief voor het stroomdiagram werd het Nassi-Shneiderman-diagram uitgevonden. De restricties hiervan werken in het voordeel van het programmeren, het zijn dezelfde restricties die men moet hanteren met gestructureerd programmeren.

Dit gestructureerde programmeren leidde tot een nieuwe generatie programmeertalen. Vrijwel al deze talen kennen het goto-statement en het label nog wel, maar het gebruik ervan wordt sterk afgeraden en bemoeilijkt door extra declaratieverplichtingen.

Enkelvoudige keuzestructuur[bewerken | brontekst bewerken]

Bij een keuzestructuur wordt een bepaald stuk code, afhankelijk van een voorwaarde, al dan niet uitgevoerd door de computer.

structuur beschrijving
if v then xxx xxx wordt alleen uitgevoerd als aan de voorwaarde voldaan wordt
if v then xxx else yyy als aan de voorwaarde voldaan wordt, wordt xxx uitgevoerd; zo niet wordt yyy uitgevoerd
if v1 then xxx elseif v2 ... als niet aan de eerste voorwaarde voldaan wordt, worden vervolgacties afhankelijk van een tweede voorwaarde
voorbeeld van een if
 <?
 $humeur = "slecht";
 if ($humeur == "slecht") {
   echo ("ik ben slechtgehumeurd");
 }
 ?>
voorbeeld van een elseif
 <?
 $humeur = "goed";
 if ($humeur == "slecht") {
   echo "ik ben slechtgehumeurd";
 }
 elseif ($humeur == "verveeld") {
   echo "ik verveel mij";
 }
 else {
   echo "ik ben goedgeluimd";
 }
 ?>

Meervoudige keuzestructuur[bewerken | brontekst bewerken]

Bij een meervoudige keuzestructuur (of: switch) kan gereageerd worden op verschillende waarden. Dit kan ook geïmplementeerd worden met een aantal enkelvoudige keuzestructuren (en de kans is groot dat daar dan "elseif"-statements in voorkomen), maar met een switch gaat het eenvoudiger:

 <?
 $humeur = "goed";
 switch ($humeur) {
 case "slecht":
   echo "ik ben slechtgehumeurd";
   break;
 case "verveeld":
   echo "ik verveel mij";
   break;
 default:
   echo "ik ben goedgeluimd";
 }
 ?>

Voorwaardelijke herhalingsstructuur of Iteratie[bewerken | brontekst bewerken]

Als statements voorwaardelijk herhaald moeten worden zijn er twee mogelijkheden:

  • eerst testen, daarna de opdracht uitvoeren en vervolgens opnieuw testen (en eventueel de opdracht uitvoeren, opnieuw testen enzovoorts)
  • eerst de opdracht uitvoeren, daarna testen, eventueel de opdracht herhalen, opnieuw testen enzovoorts.

In het eerste geval kan het zijn dat de opdracht helemaal nooit uitgevoerd wordt (herhaling van 0 of meer keren), in het tweede geval wordt de opdracht minimaal één keer uitgevoerd.

PHP-voorbeeld van eerste mogelijkheid
 <?
 $teller = 0;
 while ($teller <= 12) {
   echo "de teller zit nu aan: $teller <br />";
   $teller++;
 }
 ?>
PHP-voorbeeld van de tweede mogelijkheid
 <?
 $teller = 0;
 do {
   $teller++;
   echo "de teller zit nu aan: $teller <br />";
 } while ($teller <= 12);
 ?>

Abstractie en Subroutines[bewerken | brontekst bewerken]

Subroutines zijn opvraagbare eenheden zoals procedures, functies, methoden of subprogramma’s die worden gebruikt om naar een reeks instructies te verwijzen door een enkele instructie: de “call” instructie. Zij staan voor het uitvoeren van meer gedetailleerde algoritmes of bewerkingen en voeren daarmee een functie uit.

Het hiërarchisch gebruik van het concept van de subroutine is analoog aan het concept van abstractie in de systeemtheorie. Door het samenbouwen van vele subroutines kunnen toch betrouwbare extreem complexe software systemen worden gebouwd, omdat het gehele systeem is opgebouwd uit van elkaar geïsoleerde kleine overzichtelijke systeem componenten die afzonderlijk gebouwd en getest kunnen worden. Op deze wijze worden gedetailleerde datastructuren, algoritmes en bewerkingen verborgen gehouden data hiding en encapsulation voor subroutines op hogere systeemniveaus.

Edsger Dijkstra wees als eerste in augustus 1969 op de noodzaak van deze aanpak vanwege de beperkte vermogens van de menselijke geest: "het is onmogelijk om de correctheid van een programma van vele pagina’s te doorgronden". Hij pleitte er daarom voor om programma's en hun subroutines altijd te beperken in omvang en te voorzien van een heldere, goed afgebakende, bij voorkeur enkelvoudige functionaliteit. Later is dit concept van abstractie en gebruik van subroutines terecht gekomen in de Object Oriented OO aanpak, waarbij subroutines vervangen zijn door "Methods" die werken op Objecten of Klassen.

Ole-Johan Dahl, E.W. Dijkstra en C.A.R. Hoare publiceerden in 1972 gezamenlijk een boek waarin de basisprincipes van programmacorrectheid, gestructureerde data, programma hiërarchie en lagen van abstractie fundamenteel werden behandeld. Ook het denken in klassen met data hiding en encapsulation werd hierin geïntroduceerd. Deze 3 vroege computerprogramma wetenschappers hebben daarmee de basis gelegd voor alle latere wetenschappelijke en commerciële werken over gestructureerd programmeren en de object oriented aanpak.

Bron[bewerken | brontekst bewerken]

Zie ook[bewerken | brontekst bewerken]

Wikibooks heeft meer over dit onderwerp: Programmeren, de basis/De controlestructuren.