Jenom dodám, že v klasickým kódu (C apod.) se to řeší pomocí
dependency injection. Ta je základem efektivního řešení třeba pro takový věci, jako jednoduchý operační systém (předání vykonávané funkce do context switche), hierarchický stavový automat (řeší to dynamicky hierarchie), u univerzálníchtřídících algoritmů se tak dá měnit za běhu porovnávací funkce, v objektovce je na tom principu postavená VMT a dá se s tím užít ještě další obrovský kopec srandy. A pěkně učesat kód, samožřejmě.
Řekněme, že máme dvě čísla, který mají být ořezány na rozsah -9999 až +9999, má s nimi být udělána nějaká neznámá operace a výsledek ořezán na na stejný rozsah. Takže to ořezání si vytkneme do funkce
int orez(int a) {
if(a < -9999) return -9999;
if(a > 9999) return 9999
else return a
}
V příkladu je to jenom jako společná část kódu, která se nemění, s DI zatím nemá co do činění, ale opakující se část ve funkci by měla být samozřejmost.Vlastní operace bude asi nejaká funkce, která si vezme dva inty a vrátí int. Takže ukazatel na ni bude jednoduše
int(*funkce)(int a, int b);
a vlastní implementace funkcí pro jednotlivý operace budou třeba
int soucet(int a, int b) {return a+b;}
int rozdil(int a, int b) {return a-b;}
Těch může být, kolik je potřeba. Rozhoduje jenom počet a typ parametrů a typ návratové hodnoty.
Pak se to všechno bude volat z programu nějak slepený a zapouzdřený, dáme to tedy do funkce. Ta si vezme tři parametry, operaci a dva operandy. Vrací zase int.
int mojeOperace(funkce typ, int a, int b) {
int a1 = orez(a);
int b1 = orez(b);
int x = funkce(a1, b1);
return orez(x);
}
No a nakonec jak to celý použít. Prostě, jako volání funkce.
int main() {
int a = 100; int b = 200;
printf("Soucet je %d", mojeOperace(&soucet, a, b);
printf("Rozdil je %d", mojeOperace(&rozdil, a, b);
return 0;
}
Zkus vymyslet, jak s pomocí mojeOperace() uděláš x=a^2/b bez toho, že bys v ní samotné změnil jediný řádek kódu