W niektórych kontekstach jestem zdezorientowany funkcjami min i max.
W jednym kontekście, gdy używasz funkcji do przyjęcia większej lub mniejszej z dwóch wartości, nie ma problemu. Na przykład,
//how many autographed CD's can I give out?
int howManyAutographs(int CDs, int Cases, int Pens)
{
//if no pens, then I cannot sign any autographs
if (Pens == 0)
return 0;
//I cannot give away a CD without a case or a case without a CD
return min(CDs, Cases);
}
Łatwo. Ale w innym kontekście jestem zdezorientowany. Jeśli próbuję ustawić maksimum lub minimum, otrzymuję je wstecz.
//return the sum, with a maximum of 255
int cappedSumWRONG(int x, int y)
{
return max(x + y, 255); //nope, this is wrong
}
//return the sum, with a maximum of 255
int cappedSumCORRECT(int x, int y)
{
return min(x + y, 255); //much better, but counter-intuitive to my mind
}
Czy nie jest wskazane, aby tworzyć własne funkcje w następujący sposób?
//return x, with a maximum of max
int maximize(int x, int max)
{
return min(x, max);
}
//return x, with a minimum of min
int minimize(int x, int min)
{
return max(x, min)
}
Oczywiście korzystanie z wbudowanych będzie szybsze, ale wydaje mi się to niepotrzebną mikrooptymalizacją. Czy jest jakiś inny powód, dla którego byłoby to niewskazane? A co z projektem grupowym?
std::clamp
funkcji lub coś podobnego.
up_to
(dla min
) i at_least
(dla max
)? Myślę, że przekazują znaczenie lepiej niż minimize
itp., Chociaż może chwilę zastanowić się, dlaczego są przemienni.
min
a max
także minimize
i maximize
są całkowicie błędnymi nazwami funkcji, które chcesz napisać. Domyślne min
i max
mają znacznie większy sens. W rzeczywistości PRAWIE masz prawidłowe nazwy funkcji. Ta operacja nazywa się zaciskaniem lub zamykaniem i napisałeś dwie funkcje zamykania. Sugerowałbym capUpperBound
i capLowBound
. Nie muszę nikomu wyjaśniać, co robi, co jest oczywiste.