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::clampfunçã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 minimizeetc., embora possa levar um momento para entender por que eles são comutativos.
minee maxtambém minimizee maximizesão nomes totalmente errados para as funções que você deseja escrever. O padrão mine maxfaz 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 capUpperBounde capLowBound. Não preciso explicar a ninguém qual faz qual, é óbvio.