2009-02-05 9 views
23

Ich finde, dass ich am Ende eine Funktion schreibe, die ich immer "clamp()" nenne, das ist eine Art Kombination aus min() und max(). Gibt es einen standardmäßigen "kanonischen" Namen für diese Funktion?Gibt es einen "kanonischen" Namen für eine Funktion, die min() und max() kombiniert?

Es sieht immer so etwas wie dieses:

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

Oder einfach mit der integrierten in min() und max() Funktionen:

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

Variationen existieren: Sie können auch für ungültige Eingaben überprüfen können, wo lower > upper, und entweder eine Ausnahme auslösen oder die Eingaben umkehren. Oder Sie können die Reihenfolge der Eingaben ignorieren und sie als eine Median-von-drei-Funktion bezeichnen, aber das kann verwirrend sein.

+0

Ich würde vermeiden, Ihren Parametern die gleichen Namen wie die Funktionen zu geben, vor allem, da sie nicht in passenden Paaren verwendet werden (d. H. $ Min wird mit max() verwendet und umgekehrt). Vielleicht $ niedriger und $ höher, stattdessen. –

+0

@BenBlank: gute Idee. die Frage bearbeitet – Kip

+0

Ich benutze den Namen InRange(), aber mein Kommentar ist nicht über den Namen, es geht um die Reihenfolge der Parameter. Ich finde es einfacher zu lesen: InRange (min, value, max) als (value, min, max) –

Antwort

35

Klemme ist ein guter Name.

Lassen Sie uns es zum Standard machen.

+2

Scheint schon Standard (zumindest in Grafik) zu sein: http://en.wikipedia.org/wiki/Clamping_%28graphics%29 –

+0

Hmm .. vielleicht habe ich irgendwann "clamp" abgeholt und vergessen wo ich es bekommen habe von .. – Kip

+0

Art von einem großen Namen, nachdem ich verstanden habe, was es war. Plus eins zum Standard. – Rodrigo

0

ich nur für einen Funktionsnamen gehen würde "Rangecheck"

+1

nicht gut, RangeCheck hört sich an wie CHECKS. Aber was es tut, ist, Werte in einem Bereich zu ändern. – Thorsten79

5

In einigen Sprachen haben Sie die Funktion Limit

num = Grenze (val, min, max)

3
clip(val, lo, hi) 
0

Median

Weil es mehr Werte verallgemeinert.

+1

Hier geht es nicht darum, statistische Informationen über einen Stichprobensatz zu finden. Es geht darum, eine Zahl in einen bestimmten Bereich zu zwingen. – MSN

+2

@MSN: technisch Median (val, min, max) wird das gleiche tun wie Klemme (val, min, max). plus, die Reihenfolge der Parameter zu Median() wäre egal. aber das ist nicht sofort offensichtlich (zumindest war es nicht für mich). – Kip

+0

Median hat den Vorteil, selbstbeschreibend zu sein. Sie erhalten das Median-Element zurück. Zum Beispiel wird "clamp" eine Ausnahme werfen, wenn mein min ist kleiner als mein max? In diesem Fall, welches Argument ist das min? Erster oder zweiter? Diese Details können sich von Ort zu Ort ändern. –

1

Wir verwenden pin hier. Tatsächlich verwenden wir für einfache Bereiche und clamp für andere Sachen.

0

Wie wäre es mit gebunden?

bound(min, val, max) 

Oder constrain?

constrain(val, min, max) 
0

Was denken Sie an Dinge wie InRangeClosestTo (Nummer, RangeLowerBound, RangeUpperBound) oder ClosestInRange (Nummer, LowerBoundOfRange, UpperBoundOfRange)? Sie meinen "Hol mir das Element der Reihe, die der Zahl am nächsten ist", wie ich hoffe, ist offensichtlich.

Das Konzept ist präziser als eine Klammer, die ja zwei Seiten hat, aber nicht viel mehr, oder ein Limit oder Bound, die nichts zurückgeben möchten, wenn die Zahl nicht innerhalb des Bereichs liegt,

Für mich sie sind klarer als der Rest, den ich sah; obwohl es ein paar Sekunden dauern kann, sie zu verstehen, müssen Sie nur über den Namen nachdenken, und höchstens einen kurzen Blick auf den Kommentar für die Bestätigung; und es ist schön, wenn Sie sehen, wie genau es ist (es ist präzise, ​​oder?).

Sie haben vielleicht nur Zweifel, ob der Bereich inklusive ist oder nicht, aber ich denke, die meisten Leute würden richtigerweise davon ausgehen, dass es inklusive ist. Alternativ können Sie auch InInclRangeClosestTo und InExclRangeClosestTo verwenden, obwohl ich für exklusive Bereiche nicht viele Verwendungen sehe.

Natürlich sollten Sie eine automatisch vervollständigende IDE haben, wenn Sie sie verwenden wollten.