Fico confuso com as funções min e max, em certos contextos.
Em um contexto, quando você está usando as funções para obter o maior ou o menor de dois valores, não há problema. Por exemplo,
//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);
}
Fácil. Mas em outro contexto, fico confuso. Se estou tentando definir um máximo ou um mínimo, entendo de trás para frente.
//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
}
É desaconselhável fazer minhas próprias funções da seguinte maneira?
//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)
}
Obviamente, o uso dos componentes internos será mais rápido, mas isso me parece uma microoptimização desnecessária. Existe alguma outra razão pela qual isso seria desaconselhável? E em um projeto de grupo?
std::clamp
função C ++ 11 ou algo semelhante.
up_to
(para min
) e at_least
(para max
)? Eu acho que eles transmitem o significado melhor do que minimize
etc., embora possa levar um momento para entender por que eles são comutativos.
min
ee max
também minimize
e maximize
são nomes totalmente errados para as funções que você deseja escrever. O padrão min
e max
faz muito mais sentido. Você na verdade QUASE acertou os nomes das funções. Essa operação é chamada de fixação ou nivelamento e você escreveu duas funções de nivelamento. Eu sugiro capUpperBound
e capLowBound
. Não preciso explicar a ninguém qual faz qual, é óbvio.