Vier bewaarde patronen voor gebruiksgedefinieerde functies in C
Vier bewaarde patronen voor gebruiksgedefinieerde functies in C
Ontdek vier verschillende manieren om een gebruiksgedefinieerde functie te implementeren die controleert of een getal een priemgetal is, en leer welke benadering de grootste duidelijkheid en herbruikbaarheid biedt.
Hieronder tonen vier complete programma's hoe dezelfde logische taak kan worden uitgedrukt met verschillende functiesignaturen. Alle vier produceren identieke output, maar de ontwerpkeuzes variëren, wat de belangrijke afwegingen in functie-ontwerp illustreert.
Voorbeeld 1: Geen argumenten, geen retourwaarde
#include <stdio.h>
void checkPrimeNumber();
int main() {
checkPrimeNumber(); // geen argument wordt doorgegeven
return 0;
}
// return type is void, dus het retourneert geen waarde
void checkPrimeNumber() {
int n, i, flag = 0;
printf("Voer een positief geheel getal in: ");
scanf("%d", &n);
for(i = 2; i <= n/2; ++i) {
if(n % i == 0) {
flag = 1;
}
}
if (flag == 1)
printf("%d is geen priemgetal.", n);
else
printf("%d is een priemgetal.", n);
}
De checkPrimeNumber()-functie is verantwoordelijk voor het lezen van gebruikersinvoer, het uitvoeren van de priemtest en het printen van het resultaat. Omdat het retourtype void is, communiceert het de uitsluitend via bijwerkingen (side effects).
Voorbeeld 2: Geen argumenten, wel een retourwaarde
#include <stdio.h>
int getInteger();
int main() {
int n, i, flag = 0;
// geen argument wordt doorgegeven
n = getInteger();
for(i = 2; i <= n/2; ++i) {
if(n % i == 0) {
flag = 1;
break;
}
}
if (flag == 1)
printf("%d is geen priemgetal.", n);
else
printf("%d is een priemgetal.", n);
return 0;
}
// retourneert het door de gebruiker ingevoerde gehele getal
int getInteger() {
int n;
printf("Voer een positief geheel getal in: ");
scanf("%d", &n);
return n;
}
Hier kapselt getInteger() de invoerroutine in en retourneert de waarde naar main, die vervolgens de logica voor de priemcontrole afhandelt. Deze scheiding maakt de invoerstap herbruikbaar in verschillende contexten.
Voorbeeld 3: Argument doorgegeven, geen retourwaarde
#include <stdio.h>
void checkPrimeAndDisplay(int n);
int main() {
int n;
printf("Voer een positief geheel getal in: ");
scanf("%d", &n);
// n wordt aan de functie doorgegeven
checkPrimeAndDisplay(n);
return 0;
}
// return type is void, dus het retourneert geen waarde
void checkPrimeAndDisplay(int n) {
int i, flag = 0;
for(i = 2; i <= n/2; ++i) {
if(n % i == 0) {
flag = 1;
break;
}
}
if(flag == 1)
printf("%d is geen priemgetal.", n);
else
printf("%d is een priemgetal.", n);
}
In dit patroon wordt de verantwoordelijkheid voor het weergeven van het resultaat naar de helper-functie verplaatst. Hoewel dit main slank houdt, koppelt de functie nu het algoritme aan I/O, wat de herbruikbaarheid vermindert.
Voorbeeld 4: Argument doorgegeven en een retourwaarde
#include <stdio.h>
int checkPrimeNumber(int n);
int main() {
int n, flag;
printf("Voer een positief geheel getal in: ");
scanf("%d", &n);
// n wordt aan de checkPrimeNumber()-functie doorgegeven
// de geretourneerde waarde wordt toegewezen aan de flag-variabele
flag = checkPrimeNumber(n);
if(flag == 1)
printf("%d is geen priemgetal", n);
else
printf("%d is een priemgetal", n);
return 0;
}
// int wordt geretourneerd vanuit de functie
int checkPrimeNumber(int n) {
int i;
for(i = 2; i <= n/2; ++i) {
if(n % i == 0)
return 1;
}
return 0;
}
Dit ontwerp houdt het geïsoleerd en retourneert een simpele statusvlag. De aanroeper beslist hoe het resultaat gepresenteerd wordt, wat de functie hoogst herbruikbaar maakt in bibliotheken of grotere applicaties.
Het optimale patroon kiezen
Hoewel alle vier implementaties dezelfde output produceren, is de meest onderhoudbare en testbare benadering Voorbeeld 4: het doorgeven van het getal als argument en het retourneren van een Booleaanse-stijl vlag. Dit patroon volgt het single-responsibility-principe, stelt unit-testing van checkPrimeNumber toe zonder I/O-afhankelijkheden, en kan eenvoudig geïntegreerd worden in complexere systemen.
Uiteindelijk hangt de keuze af van de architectuur van je project. Als de functie direct met de gebruiker moet interageren, kan Voorbeeld 3 volstaan. Voor bibliotheekcode of services waar I/O elders wordt afgehandeld, biedt Voorbeeld 4 de grootste flexibiliteit.
C Taal
- Namespaces in C#: organisatie, scope en best practices
- C Datatypes Uitgelegd: int, float, char en Meer – Een Complete Gids
- C Programmeeroperatoren Beheersen: Een Uitgebreide Gids
- C Standaardbibliotheek-functies onder de knie krijgen: Een praktische gids
- C++ Variabelen en Datatypes: Expert‑handleiding voor int, double, char, string, bool
- Pointers in C: Een Uitgebreide Gids naar Typen, Gebruik en Best Practices
- C-programmeren leren: Uitgebreide tutorial voor beginners
- C-datatypes begrijpen: Een complete gids
- C-functies: Structuur, declaratie, aanroep en argumenten
- Variabele Argumenten in C: Een Praktische Gids
- Variabelen in C# Begrijpen: Typen, Opslag en Gebruik