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::clamp
iş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 minimize
ediyorlardı. Neden değişmeli olduklarının farkına varmak biraz zaman alabilir.
min
ve max
ayrıca minimize
ve maximize
yazmak istediğiniz işlevler için tamamen yanlış adlardır. Varsayılan min
ve 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 capUpperBound
ve capLowBound
. Hangisinin ne yaptığını kimseye açıklamak zorunda değilim, çok açık.