2009-02-05 8 views
23

Me parece que con frecuencia termino escribiendo una función que siempre llamo "clamp()", que es una especie de combinación de min() y max(). ¿Hay un nombre "canónico" estándar para esta función?¿Hay un nombre "canónico" para una función que combine min() y max()?

siempre se ve algo como esto:

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

O simplemente utilizando una función de min() y max() funciones:

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

Variaciones: También puede comprobar si hay una entrada no válida, donde lower > upper, y arrojar una excepción o invertir las entradas. O puede ignorar el orden de las entradas y llamarlo una función de la mediana de tres, pero eso puede ser confuso.

+0

Evitaría dar a sus parámetros los mismos nombres que las funciones utilizadas, particularmente porque no se usan en pares coincidentes (es decir, $ min se usa con max() y viceversa). Tal vez $ más bajo y $ superior, en cambio. –

+0

@BenBlank: buena idea. editó la pregunta – Kip

+0

Utilizo el nombre InRange() pero mi comentario no es sobre el nombre, se trata del orden de los parámetros. Me resulta más fácil de leer: InRange (min, value, max) than (value, min, max) –

Respuesta

35

pinza es un buen nombre.

Déjennos convertirlo en el estándar.

+2

Ya parece ser estándar (al menos en gráficos): http://en.wikipedia.org/wiki/Clamping_%28graphics%29 –

+0

Hmm ... tal vez elegí "abrazadera" en algún momento y olvidé dónde lo conseguí de .. – Kip

+0

Tipo de un gran nombre después de haber entendido lo que era. Más uno al estándar. – Rodrigo

0

yo sólo iría a por un nombre de función "rangeCheck"

+1

no es bueno, rangeCheck suena como CHECKS. Pero lo que hace es cambiar los valores para estar en un rango. – Thorsten79

5

En algunos idiomas que tienen el límite de la función

num = límite (val, min, max)

3
clip(val, lo, hi) 
0

mediana

Debido a que se generaliza a más valores.

+1

No se trata de encontrar información estadística sobre un conjunto de muestra. Se trata de forzar a un número a estar en un rango particular. – MSN

+2

@MSN: técnicamente la mediana (val, min, max) hará lo mismo que la abrazadera (val, min, max). Además, el orden de los parámetros a la mediana() no importaría. pero eso no es inmediatamente obvio (al menos, no fue para mí). – Kip

+0

Median tiene la ventaja de ser autodescriptivo. Usted recupera el elemento mediano. Por ejemplo, "abrazadera" arrojará una excepción si mi mínimo es menor que mi máximo? En ese caso, ¿cuál argumento es el mínimo? ¿Primero o segundo? Estos detalles pueden cambiar de un lugar a otro. –

1

Utilizamos pin aquí. En realidad, usamos pin para rangos simples y clamp para otras cosas.

0

¿Qué hay de obligado?

bound(min, val, max) 

O constrain?

constrain(val, min, max) 
0

¿Qué piensa de las cosas como InRangeClosestTo (Número, RangeLowerBound, RangeUpperBound), o ClosestInRange (Número, LowerBoundOfRange, UpperBoundOfRange)? Quieren decir 'Obtener el elemento del rango más cercano al número', como espero que sea obvio.

El concepto es más precisa que una pinza que sí tiene dos lados, pero no mucho más, o un límite o Bound que podrían no querer devolver nada si el número no está dentro del rango,

Para mí son más claros que el resto que vi; aunque puede tomar un par de segundos entenderlos, solo necesita razonar sobre el nombre y, a lo sumo, echar un breve vistazo al comentario para confirmarlo; y es agradable cuando se ve qué tan preciso es (es preciso, ¿verdad?).

Es posible que solo tenga dudas sobre si el rango es inclusivo o no, pero creo que la mayoría de la gente asumiría correctamente que es inclusivo. Alternativamente, puede utilizar InInclRangeClosestTo e InExclRangeClosestTo, aunque no veo muchos usos para rangos exclusivos.

Por supuesto, debe tener un IDE autocompletado si desea utilizarlos.

Cuestiones relacionadas