2009-02-05 6 views
23

Trovo che finisca spesso per scrivere una funzione che chiamo sempre "clamp()", che è una specie di combinazione di min() e max(). Esiste un nome standard, "canonico" per questa funzione?Esiste un nome "canonico" per una funzione che combina min() e max()?

Si guarda sempre qualcosa di simile:

function clamp($val, $lower, $upper) 
{ 
    if ($val < $lower) 
    return $lower; 
    else if ($val > $upper) 
    return $upper; 
    else 
    return $val; 
} 

O semplicemente utilizzando built-in min() e max() funzioni:

function clamp($val, $lower, $upper) 
{ 
    return max($lower, min($upper, $val)); 
} 

Variazioni esistono: Si può anche verificare la presenza di input non valido, dove lower > upper, e lanciare un'eccezione o invertire gli input. Oppure puoi ignorare l'ordine degli input e chiamarlo funzione di mediana di tre, ma ciò può essere fonte di confusione.

+0

Eviterei di dare ai parametri gli stessi nomi delle funzioni utilizzate, in particolare perché non vengono utilizzati in coppie corrispondenti (vale a dire $ min viene utilizzato con max() e viceversa). Forse $ lower e $ upper, invece. –

+0

@BenBlank: buona idea. ha modificato la domanda – Kip

+0

Io uso il nome InRange() ma il mio commento non riguarda il nome, riguarda l'ordinamento dei parametri. Trovo più facile leggere: InRange (min, value, max) rispetto a (value, min, max) –

risposta

35

morsetto è un buon nome.

Facciamolo lo standard.

+2

Sembra essere standard (almeno nella grafica) già: http://en.wikipedia.org/wiki/Clamping_%28graphics%29 –

+0

Hmm .. forse ho scelto "clamp" fino ad un certo punto e ho dimenticato dove l'ho preso da .. – Kip

+0

Tipo di grande nome dopo aver capito di cosa si trattava. Più uno allo standard. – Rodrigo

0

avevo appena andare per un nome di funzione "rangeCheck"

+1

non buono, rangeCheck suona come se fosse CONTROLLI. Ma ciò che fa è CAMBIARE i valori in un intervallo. – Thorsten79

5

In alcune lingue che hanno la funzione di limite di

num = limite (val, min, max)

3
clip(val, lo, hi) 
0

mediana

Perché generalizza a più valori.

+1

Non si tratta di trovare informazioni statistiche su un set di campioni. Si tratta di forzare un numero a trovarsi in un determinato intervallo. – MSN

+2

@MSN: tecnicamente mediana (val, min, max) farà la stessa cosa di clamp (val, min, max). inoltre, l'ordine dei parametri su mediana() non avrebbe importanza. ma questo non è immediatamente ovvio (almeno, non era per me). – Kip

+0

Median ha il vantaggio di essere auto-descrittivo. Ottieni indietro l'elemento mediano. Ad esempio, "clamp" genererà un'eccezione se il mio min è inferiore al mio massimo? In tal caso, quale argomento è il minimo? Primo o secondo? Questi dettagli potrebbero cambiare da un posto all'altro. –

1

Qui viene utilizzato pin. In realtà, usiamo pin per intervalli semplici e clamp per altre cose.

0

Che dire di legato?

bound(min, val, max) 

Oppure constrain?

constrain(val, min, max) 
0

Cosa pensi di cose come InRangeClosestTo (Numero, RangeLowerBound, RangeUpperBound), o ClosestInRange (Numero, LowerBoundOfRange, UpperBoundOfRange)? Significano "Fammi l'elemento dell'intervallo più vicino al numero", come spero sia ovvio.

Il concetto è più preciso di un morsetto che sì ha due lati, ma non molto di più, o un limite o Bound che potrebbero non voler restituire nulla se il numero non è all'interno della gamma,

A me sono più chiari poi il resto che ho visto; sebbene possano essere necessari un paio di secondi per capirli, è sufficiente ragionare sul nome e, al massimo, dare una breve occhiata al commento per la conferma; ed è bello vedere quanto è preciso (è preciso, vero?).

Potresti avere solo dei dubbi sul fatto che l'intervallo sia inclusivo o meno, ma penso che la maggior parte delle persone ritenga correttamente che sia inclusivo. In alternativa è possibile utilizzare InInclRangeClosestTo e InExclRangeClosestTo, anche se non vedo molti usi per intervalli esclusivi.

Ovviamente si dovrebbe avere un IDE di completamento automatico se si desidera utilizzarli.