Bazı bağlamlarda min ve max işlevleri konusunda kafam karışıyor.
Bir bağlamda, iki değerden daha büyük veya daha azını almak için işlevleri kullanırken, sorun yoktur. Örneğin,
//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);
}
Kolay. Ama başka bir bağlamda kafam karıştı. Bir maksimum veya minimum ayarlamaya çalışıyorsam, geriye doğru alıyorum.
//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
}
Kendi işlevlerimi yapmam aşağıdaki gibi olmaz mı?
//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)
}
Açıkçası, yerleşikleri kullanmak daha hızlı olacak ama bu bana gereksiz bir mikro-optimizasyon gibi görünüyor. Bunun tavsiye edilemez olmasının başka bir nedeni var mı? Peki ya bir grup projesinde?
std::clampişlevini veya benzer bir şeyi düşünebilirsiniz .
up_to(için min) ve at_least(için max) olur? Sanırım anlamı, daha iyi ifade minimizeediyorlardı. Neden değişmeli olduklarının farkına varmak biraz zaman alabilir.
minve maxayrıca minimizeve maximizeyazmak istediğiniz işlevler için tamamen yanlış adlardır. Varsayılan minve maxçok daha mantıklı. Aslında ALMOST fonksiyon isimlerini doğru yaptınız. Bu işleme sıkıştırma veya kapatma denir ve iki kapatma işlevi yazdınız. Öneririm capUpperBoundve capLowBound. Hangisinin ne yaptığını kimseye açıklamak zorunda değilim, çok açık.