Ist es nicht ratsam, eine Funktion zu erstellen, die im Wesentlichen eine integrierte Funktion umbenennt?

40

Ich bin in bestimmten Zusammenhängen verwirrt über die Min- und Max-Funktionen.

In einem Kontext gibt es kein Problem, wenn Sie die Funktionen verwenden, um den größeren oder kleineren von zwei Werten zu übernehmen. Zum Beispiel,

//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);
}

Einfach. Aber in einem anderen Kontext bin ich verwirrt. Wenn ich versuche, ein Maximum oder ein Minimum festzulegen, verstehe ich es rückwärts.

//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
}

Ist es nicht ratsam, meine eigenen Funktionen wie folgt zu erstellen?

//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)
}

Die Verwendung der eingebauten Funktionen ist natürlich schneller, aber dies scheint mir eine unnötige Mikrooptimierung zu sein. Gibt es einen anderen Grund, warum dies nicht ratsam wäre? Was ist mit einem Gruppenprojekt?

Devsman
quelle
72
Wenn Min und Max Ihre Lesbarkeit beeinträchtigen, sollten Sie die Werte durch reguläre "Wenn" ersetzen. Manchmal lohnt es sich, etwas mehr Code zu schreiben, um die Lesbarkeit zu verbessern.
T. Sar - Reinstate Monica
23
mit einem kurzen post hast du das ganze konzept von "clean coding" zerstört. Ich grüße Sie, Sir!
Ewan
21
Vielleicht können Sie die C ++ 11- std::clampFunktion oder ähnliches in Betracht ziehen .
Rwong
15
Vielleicht wären bessere Namen up_to(für min) und at_least(für max)? Ich denke, sie vermitteln die Bedeutung besser als minimizeusw., obwohl es einen Moment dauern kann, bis klar wird, warum sie kommutativ sind.
Warbo
59
minund maxund minimizeund maximizesind völlig falsche Namen für die Funktionen, die Sie schreiben möchten. Der Standard minund maxviel sinnvoller. Sie haben tatsächlich fast die richtigen Funktionsnamen. Diese Operation wird als Clamping oder Capping bezeichnet, und Sie haben zwei Capping-Funktionen geschrieben. Ich würde vorschlagen capUpperBoundund capLowBound. Ich muss niemandem erklären, wer was tut, das liegt auf der Hand.
Slebetman

Antworten:

120

Wie andere bereits erwähnt haben: Erstellen Sie keine Funktion mit einem Namen, der dem einer eingebauten Standardbibliothek oder einer allgemein verbreiteten Funktion ähnelt, sondern ändern Sie ihr Verhalten. Es ist möglich, sich an eine Namenskonvention zu gewöhnen, auch wenn dies für Sie auf den ersten Blick wenig sinnvoll ist, es jedoch unmöglich ist, über die Funktionsweise Ihres Codes nachzudenken, wenn Sie die anderen Funktionen einführen, die das Gleiche tun, aber haben ihre Namen wurden getauscht.

Anstatt die von der Standardbibliothek verwendeten Namen zu "überladen", sollten Sie neue Namen verwenden, die genau das wiedergeben, was Sie meinen. In Ihrem Fall sind Sie nicht wirklich an einem „Minimum“ interessiert. Vielmehr möchten Sie die Kappe einen Wert. Mathematisch ist dies die gleiche Operation, aber semantisch ist es nicht ganz. Warum also nicht einfach eine Funktion?

int cap(int value, int limit) { return (value > limit) ? limit : value; }

das tut was nötig ist und sagt es aus seinem Namen. (Sie können auch implementieren capin Bezug auf minwie in gezeigt timster ‚s Antwort ).

Ein weiterer häufig verwendeter Funktionsname ist clamp. Es werden drei Argumente verwendet, und ein bereitgestellter Wert wird in das Intervall eingeklemmt, das durch die beiden anderen Werte definiert wird.

int clamp(int value, int lower, int upper) {
    assert(lower <= upper);  // precondition check
    if (value < lower) return lower;
    else if (value > upper) return upper;
    else return value;
}

Wenn Sie einen solchen allgemein bekannten Funktionsnamen verwenden, wird jede neue Person, die Ihrem Team beitritt (einschließlich der Zukunft, in der Sie nach einer Weile wieder zum Code zurückkehren), schnell verstehen, was vor sich geht, anstatt Sie zu verfluchen, weil Sie sie durch ihre Unterbrechung verwirrt haben Erwartungen an Funktionsnamen, die sie zu kennen glaubten.

5gon12eder
quelle
2
Sie können es auch getValueNotBiggerThan (x, limit) nennen. Dies ist der richtige Ansatz, und mit einem anständigen Compiler wird die Funktion eingebunden und der resultierende Maschinencode ist genau der gleiche wie bei Verwendung von eingebauten Funktionen
Falco
20
@ Falco Ich würde sagen, dass "Kappe" fast ein Synonym für "Wert nicht größer als" ist, aber ich werde diesen Fahrradschuppen heute nicht streichen. ;-)
5gon12eder
1
clampwird ausgiebig bei allen Arten von Signalverarbeitungen und ähnlichen Vorgängen (Bildverarbeitung usw.) eingesetzt. Obwohl ich nicht sagen würde, dass es obere und untere Schranken erfordert: Ich habe es auch ziemlich oft für nur eine Richtung gesehen.
Voo
1
Ich wollte auch erwähnen clamp. Und wenn es richtig geschrieben ist, können Sie einfach eine Grenze von Unendlichkeit / negative Unendlichkeit verwenden, wenn Sie es nur in einer Richtung gebunden haben möchten. Um beispielsweise sicherzustellen, dass eine Zahl nicht größer als 255 ist (aber keine Untergrenze hat), verwenden Sie clamp(myNumber, -Infinity, 255).
Kat
115

Wenn Sie eine Funktion wie diese erstellen , bei minimize(4, 10)der 10 zurückgegeben wird , würde ich sagen, dass dies nicht ratsam ist, da Ihre Programmierkollegen Sie möglicherweise erwürgen.

(Okay, vielleicht werden sie dich nicht buchstäblich zu Tode erwürgen, aber im Ernst ... Tu das nicht.)

Telastyn
quelle
2
Es ist auch durchaus möglich, dass Sie, wenn Sie in ein paar Jahren wieder an diesem Code arbeiten, selbst mehrere Stunden damit verbringen, herauszufinden, warum Ihre Zahlen falsch sind, wenn Sie minimieren ...
Paddy
Aww ... diese Antwort hatte früher einen wirklich coolen (und ziemlich hoch bewerteten) Kommentar. (Es war auch der erste Kommentar zur Antwort, der dem humorvollen Ablauf half.)
TOOGAM
Ich möchte immer Lochkarten holen und die durchstreichen DO NOT(von "NICHT spindeln, falten oder verstümmeln"). Jemand, der so etwas implementiert hat, würde eine Karte erhalten.
Clockwork-Muse
26

Das Aliasing einer Funktion ist in Ordnung, aber versuchen Sie nicht, die Bedeutung vorhandener Begriffe zu ändern

Es ist in Ordnung, einen Alias ​​für die Funktion zu erstellen - das tun die gängigen Bibliotheken ständig .

Es ist jedoch eine schlechte Idee, Begriffe in einer Weise zu verwenden, die der allgemeinen Verwendung widerspricht, wie beispielsweise das Beispiel, in dem Ihrer Meinung nach Max und Min vertauscht werden sollten. Es ist verwirrend für andere Programmierer, und Sie werden sich selbst einen schlechten Dienst erweisen, indem Sie sich darin üben, diese Begriffe weiterhin auf eine nicht standardmäßige Weise zu interpretieren.

Lassen Sie also in Ihrem Fall die für Sie verwirrende "Mininum / Maximum" -Richtung hinter sich und erstellen Sie Ihren eigenen, leicht verständlichen Code.

Refactoring Ihres Beispiels:

int apply_upper_bound(int x, int y)
{
    return min(x, y);
}


int apply_lower_bound(int x, int y)
{
    return max(x, y)
}

Als zusätzlichen Bonus werden Sie sich bei jedem Blick auf diesen Code daran erinnern, wie min und max in Ihrer Programmiersprache verwendet werden. Irgendwann wird es in deinem Kopf Sinn machen.

Tim Grant
quelle
4
Ich denke, Sie haben die Anwendung von missverstanden minund maxdas OP verwirrt. Es ist , wenn minverwendet, um eine zu setzen feste obere Grenze auf einem bestimmten Wert. get_lower_valuewäre in dieser anwendung genauso eingängig. Wenn ich einen alternativen Namen für diese Operation wählen würde, würde ich ihn als überragend bezeichnen , obwohl ich nicht sicher bin, wie viele Programmierer das sofort verstehen würden.
linksum den
3
@leftaroundabout: Das Oberste der Menge {1, 2} ist 2, verwenden Sie also nicht den Namen supremumfür die get_lower_valueoben definierte Funktion , um nur aufzurufen min. Es verursacht beim nächsten Programmierer genau das gleiche Problem wie beim Aufrufen maximise. Ich würde vorschlagen, es anzurufen apply_upper_bound, aber ich bin nicht sicher, ob das perfekt ist. Es ist immer noch seltsam, weil es unabhängig von der Art und Weise, in der Sie die Parameter eingeben, gleich funktioniert, aber der Name impliziert, dass einer der Parameter "der Wert" und der andere "die Grenze" ist und dass sie sich irgendwie unterscheiden.
Steve Jessop
1
Ich denke, Sie verlassen sich im Wesentlichen darauf, dass der Leser mit dem Wort supremum nicht zu vertraut ist, so dass sie eher Ihre Bedeutung als die englische Bedeutung annehmen. Es ist in Ordnung, Jargon lokal für Ihren Code zu definieren, aber der eigentliche Punkt der Frage ist, was zu tun ist, wenn der gewünschte Jargon direkt einer bereits bekannten Bedeutung widerspricht, und ich fürchte, Sie tun das immer noch (z eine Version von "Englisch", die nur für diejenigen relevant ist, die MINT-Fächer studiert haben
Steve Jessop
3
Diese Richtlinie "Aliasing einer Funktion ist in Ordnung, aber versuchen Sie nicht, die Bedeutung vorhandener Begriffe zu ändern" ist perfekt und wird wunderschön ausgedrückt. Zweitens ist die Idee, dass Sie nicht in einer Weise umbenennen sollten, die in Bezug auf eingebaute Funktionen verwirrend ist (und: auch wenn die eingebauten Funktionen schlecht benannt / dumm / verwirrend sind), eine perfekte Idee. Bezüglich des Max / Min- Beispiels, das auf dieser Seite auftauchte, ist es total verwirrend, heh.
Fattie
1
OK, ich habe die Antwort bearbeitet, um "apply_upper_bound" zu verwenden, was sowohl der Argumentation des OP entspricht als auch eine Überlastung der Terminologie vermeidet. Ausführlichkeit ist kein Problem. Ich möchte hier nicht den perfekten Methodennamen schreiben, sondern nur einige Grundregeln für die Benennung von Aliasnamen festlegen. Das OP kann es so bearbeiten, wie es ihm am klarsten und prägnantesten erscheint.
Tim Grant
12

Ich liebe diese Frage. Lassen Sie es uns aber brechen.

1: Sollten Sie eine einzelne Codezeile umbrechen?

Ja, ich kann mir viele Beispiele vorstellen, wo Sie dies tun könnten. Möglicherweise erzwingen Sie eingegebene Parameter oder verstecken eine konkrete Implementierung hinter einer Schnittstelle. In Ihrem Beispiel verstecken Sie im Wesentlichen einen statischen Methodenaufruf.

Außerdem können Sie heutzutage eine Menge Dinge in einer einzigen Zeile erledigen.

2: Sind die Namen 'Min' und 'Max' verwirrend?

Ja! Sie sind total! Ein sauberer Programmierer würde sie in "FunctionWhichReturnsTheLargestOfItsParameters" oder so etwas umbenennen. Zum Glück haben wir Dokumentation und (wenn Sie Glück haben) IntelliSense und Kommentare, die uns helfen, damit jeder, der durch die Namen verwirrt ist, nachlesen kann, was er tun soll.

3: Sollten Sie sie selbst in etwas anderes umbenennen.

Yup, mach es. Zum Beispiel könnten Sie haben:

class Employee
{
    int NumberOfHolidayDaysIShouldHave(int daysInLue, int maxAllowableHolidayDays)
    {
         // Return the number of days in lue, but keep the value under the max allowable holiday days!
         // Don't use max, you fool!!
         return Math.Max(daysInLue, maxAllowableHolidayDays)
    }
}

Es fügt eine Bedeutung hinzu und der Aufrufer muss oder möchte nicht wissen, wie er den Wert berechnet.

4: Solltest du "min" in "maximieren" umbenennen

Nein!! bist du verrückt?! Aber ja, die Frage unterstreicht den Punkt, dass verschiedene Personen unterschiedliche Bedeutungen in Funktions- und Objektnamen lesen. Was eine Person klar und konventionell findet, findet eine andere undurchsichtig und verwirrend. Deshalb haben wir Kommentare. Sie sollten stattdessen schreiben:

// Add x and y, but don't let it go over 255
s = min(x + y, 255);

Dann, wenn jemand liest

// Add x and y, but don't let it go over 255
s = max(x + y, 255);

Sie wissen, dass Sie einen Fehler gemacht haben.

Ewan
quelle
6
Lustig! In Ihrem Beispiel haben Sie den genauen Fehler gemacht, um den es bei der Operation geht: Sie möchten, dass die Anzahl der Feiertage nicht größer als maxHolidaysAllowed ist. Sie müssen also mindestens (a, b)
Falco
14
Wenn sauberer Code wirklich darauf hindeutet, dass lächerliche Namen wie FunctionWhichReturnsTheLargestOfItsParameterseine gute Sache sind, möchte ich keinen Teil davon.
David Hammen
1
@ Falco lol oops !!!
Ewan
4
@DavidHammen: Wirklich nicht, da kein wirklicher Programmierstil die Warze FunctionWhichReturnsvor jede Funktion stellt (die keine Ausnahme auslöst oder beendet). Sie könnten am Ende mit getMinimum, getLarger(oder getLargestmit mehr als 2 Eingängen) jedoch durch folgende reale Beratung entlang der Linien , dass (a) reine Funktionen und / oder „Getter“ die Warze verwendet werden soll get, (b) englische Worte sollten nicht abgekürzt werden Namen. Das ist natürlich zu ausführlich für diejenigen, die sich entscheiden, solche Funktionen aufzurufen max.
Steve Jessop
1
Ja, siehe @ Falcos Kommentar. danach konnte ich es nicht wirklich korrigieren!
Ewan
4

Nein . Machen Sie keine Funktionen mit Namen, die den eingebauten Funktionen sehr ähnlich sind, die aber tatsächlich das Gegenteil bewirken . Es mag Ihnen intuitiv erscheinen, wird aber für andere Entwickler und sogar für sich selbst in Zukunft sehr verwirrend sein, wenn Sie über mehr Erfahrung verfügen.

Die Bedeutung von maxist "das Maximum von", aber Ihr "intuitives" Verständnis ist so etwas wie "bis zum Maximum von". Dies ist jedoch einfach ein falsches Verständnis der Funktion, und das Ändern des Namens von maxin maximumkommuniziert nicht Ihre unterschiedliche Interpretation. Auch wenn Sie der festen Überzeugung sind, dass die Sprachdesigner einen Fehler begangen haben, tun Sie so etwas nicht.

Aber cap(x, limit)es wäre in Ordnung, den Namen so zu ändern, wie es vorgeschlagen wurde, da dies die Absicht klar kommuniziert, auch wenn es nur umbrochen wird min.

JacquesB
quelle
3

Was Sie verwirren könnte, ist entweder die Verwendung von Capped in Ihrem Funktionsnamen oder Ihr Verständnis dafür, was das Platzieren einer Kappe bedeutet. Es ist ein Begrenzer und erfordert nicht das Maximum von irgendetwas.

Wenn Sie nach der niedrigsten, kleinsten oder frühesten Funktion gefragt werden, ist Max für Sie die geeignete Funktion?

Lass min und max in Ruhe. Schreiben Sie Tests, damit Sie sie zumindest beim zweiten Mal richtig machen.

Wenn Sie diese Funktionen in Ihrem Projekt so oft verwenden müssen, finden Sie einen Hinweis, der Ihnen hilft, zu klären, welche Funktionen verwendet werden sollen. Ähnlich wie <oder> steht der breite Teil des Mundes dem größeren Wert gegenüber.

JeffO
quelle
1
+1 für mögliche terminologische Verwirrung als zugrunde liegendes Problem. Ich denke, die Verwirrung beginnt mit dem Kommentar "Gib die Summe zurück, mit dem Maximum von 255", also denkt er, dass die maxFunktion angemessener ist, aber logisch minist das, wonach er eigentlich sucht.
Revenant
2

Um Ihre Frage zu beantworten: Gibt es einen anderen Grund, warum dies nicht ratsam wäre? Was ist mit einem Gruppenprojekt? Es ist sinnvoll, dass Sie Ihre eigenen Funktionen wollen, was kein Problem ist. Stellen Sie einfach sicher, dass sie zu Ihrer eigenen Helferklasse gehören und für andere nur dann aufrufbar sind, wenn sie diese importieren. (Joes.Utilities.)

Aber um noch einmal auf Ihr Problem zu schauen, würde ich stattdessen denken:

return (input >= 255) ? 255 : input;

Sie werden verwirrt, weil Sie versuchen, Ihre Gehirnlogik auf diese Min / Max-Funktionen anzuwenden. Sprechen Sie stattdessen nur auf Englisch. ifdas inputist greater than or equal to 255 then return 255sonst returndas input.

Welches ist:

if (input >= 255) {
   255 
} else {
   input
}

Meine Meinung. Sie gehen aus den falschen Gründen für die max \ min-Funktionen, die Geschwindigkeit dieser Dinge ist vernachlässigbar. Mach was Sinn macht.

Würdig7
quelle
1
Einer meiner älteren Kollegen pflegte immer zu sagen: "Lassen Sie den Computer das Denken für Sie tun".
1

Während ich Ihr Problem verstehe, würde ich dies nur ungern tun. Es wäre besser, einfach in deinen Schädel zu bohren, was min () und max () tun.

Die meisten Programmierer wissen, was die Funktionen min () und max () tun - auch wenn sie wie Sie manchmal mit ihrer Intuition zu kämpfen haben, um welche Funktion sie sich zu einem bestimmten Zeitpunkt bedienen müssen. Wenn ich ein Programm lese und max (x, y) sehe, weiß ich sofort, was es tut. Wenn Sie eine eigene "Alias" -Funktion erstellen, weiß niemand, der Ihren Code liest, was dieser Alias ​​bewirkt. Sie müssen Ihre Funktion finden. Es unterbricht unnötigerweise den Lesefluss und zwingt den Leser zu zusätzlichen Überlegungen, um Ihr Programm zu verstehen.

Wenn Sie Probleme haben, herauszufinden, welche zu einem bestimmten Zeitpunkt verwendet werden sollen, sollten Sie einen Kommentar hinzufügen, der dies erklärt. Dann, wenn ein zukünftiger Leser ähnlich verwirrt ist, sollte Ihr Kommentar es klären. Oder wenn Sie es falsch machen, aber der Kommentar erklärt, was Sie versucht haben, hat die Person, die versucht, es zu debuggen, eine Ahnung.

Sobald Sie eine Funktion als Alias ​​verwenden, weil der Name mit Ihrer Intuition nicht übereinstimmt ... ist dies der einzige Fall, bei dem dies ein Problem ist? Oder werden Sie andere Funktionen alias? Vielleicht sind Sie durch "Lesen" verwirrt und finden es einfacher, es als "Akzeptieren" zu betrachten. Sie ändern "Anhängen" in "StringTogether", "Runden" in "DropDecimals" usw. usw. Bringen Sie dies auf ein lächerliches Extrem und Ihre Programme werden unverständlich sein.

In der Tat habe ich vor Jahren mit einem Programmierer zusammengearbeitet, dem die Zeichensetzung in C nicht gefiel. Also schrieb er eine Reihe von Makros, damit er "THEN" anstelle von "{" und "END-IF" anstelle von "}" schrieb. und Dutzende anderer solcher Substitutionen. Als Sie dann versuchten, seine Programme zu lesen, sah es nicht mehr wie C aus, es war, als müsste man eine ganz neue Sprache lernen. Ich erinnere mich jetzt nicht, ob "AND" in "&" oder "&&" übersetzt wurde - und genau darum geht es. Sie untergraben die Investitionen, die Menschen in das Erlernen der Sprache und der Bibliothek getätigt haben.

Trotzdem würde ich nicht sagen, dass eine Funktion, die nichts anderes tut als eine Standardbibliotheksfunktion aufzurufen, notwendigerweise schlecht ist. Wenn der Zweck Ihrer Funktion nicht darin besteht, einen Alias ​​zu erstellen, sondern Verhalten zu kapseln, das zufällig nur eine einzelne Funktion ist, kann dies gut und richtig sein. Ich meine, wenn du logisch und unvermeidlich an dieser Stelle im Programm ein max machen musst, dann rufe einfach direkt max auf. Wenn Sie jedoch eine Berechnung durchführen müssen, die heute ein Maximum erfordert, die jedoch in Zukunft möglicherweise geändert wird, um etwas anderes zu tun, ist eine Zwischenfunktion angemessen.

Jay
quelle
0

Es ist in Ordnung, eingebaute Funktionen umzubenennen, vorausgesetzt, die neuen Namen machen Ihren Code sehr klar und werden von niemandem übersehen. (Wenn Sie C / C ++ verwenden, verwenden Sie kein #define, da es schwierig ist zu sehen, was gerade passiert.) Der Name einer Funktion sollte wie ein Kommentar wirken, der erklärt, was der aufrufende Code tut und warum er tut .

Sie sind nicht die einzige Person, die dieses Problem mit min und max hatte, aber ich habe noch keine gute allgemeine Lösung gefunden, die in allen Domänen funktioniert. Ich denke, ein Problem bei der Benennung dieser Funktionen ist, dass die beiden Argumente unterschiedliche logische Bedeutungen haben, aber als gleichbedeutend dargestellt werden.

Wenn Ihre Sprache es zulässt, können Sie es versuchen

return  calculatedDiscount.ButNoMoreThen(maxAllowedDiscount)

return  CDsInStocked.ButNoMoreThen(CasesInStock)
Ian
quelle
0

Nein.

Sie schreiben nicht Ihre Wrapper. Die Namen dieser Wrapper sind nicht sehr bedeutend.

Was Sie versuchen, ist eine Art Code-Verschleierung. Sie erfinden eine zusätzliche Ebene, die zwei Zwecken dient:

  1. Andere Leute können Ihren Code nicht verstehen.
  2. Man lernt nie, den Code anderer Leute zu verstehen.

Indem Sie Dinge verstecken, mit denen Sie sich nicht wohl fühlen, verletzen Sie jetzt und in Zukunft nur sich selbst. Sie können nicht wachsen, indem Sie in Ihrer Komfortzone bleiben. Was Sie brauchen, ist zu lernen, wie minund maxarbeiten.

Agent_L
quelle
-1

Es ist in Ordnung und nicht wirklich eingängig, Min, Max zu verwenden, um Über- und Unterschreiten einzudämmen. Dies geschieht auch mit:

  • Boden () und Decke ()
  • klemmen, begrenzen, grenzen
  • und natürlich Mod mit Kürzungen höherer Ordnung.

In der Firmware geht es weiter zurück als MMX, das selbst der modernen 3D-Grafik voraus ist, die auf diesem Extensivley beruht.

Das Ersetzen einer Industriestandardfunktion selbst vor Ort würde mich beunruhigen, ein abgeleiteter Name könnte besser sein. C ++ Schüler könnten für ihre obskure Klasse vielleicht überladen sein.

mckenzm
quelle
Es tut mir leid, was ist mit MMX?
Tobia Tesan
Ich habe an "gesättigte Werte" gedacht, bei denen das Ergebnis auf ein Limit begrenzt ist. Die Idee war, dass Code einfacher sein könnte, wenn er keine Grenz- und Überlauftests enthalten müsste (in Grafiken, um das Radfahren zu vermeiden oder positiv zu werden, indem die Grenzen des Negativen überschritten werden). PSUBSB / PSUBSW. Ich gebe zu, dass der Mechanismus vielleicht nicht derselbe ist, aber die Wirkung und die Absicht der Funktion sind.
McKenzm
-1

Es ist gut , in einigen Fällen, aber nicht in Ihrem Beispiel, denn es gibt viel bessere Möglichkeiten zu Wort sind es:
saturate, clamp, clipetc.

Mehrdad
quelle
-1

Ich möchte lieber eine generische Funktion namens 'bounded' erstellen

//Assumes lower_bound <= upper_bound
template <typename T>
T bounded(T value, T lower_bound, T upper_bound){
    if (value < lower_bound)
        return lower_bound;
    if (value > upper_bound)
        return upper_bound;
    return value;
}

//Checks an upper (by default) or lower bound
template <typename T>
T bounded(T value, T bound, bool is_upper_bound = true){
    if (is_upper_bound){
        if (value > bound)
            return bound;
    }
    else {
        if (value < bound)
            return bound;
    }
    return value;
}

oder mit der Verwendung von 'min' und 'max'

//Assumes lower_bound <= upper_bound
template <typename T>
T bounded(T value, T lower_bound, T upper_bound){
    return max(min(value, upper_bound), lower_bound);
}

//Checks an upper (by default) or lower bound
template <typename T>
T bounded(T value, T bound, bool is_upper_bound = true){
    if (is_upper_bound)
        return min(value, bound);
    else
        return max(value, bound);
}
David Ferrer
quelle
-1

Was ist mit dem Aufrufen Ihrer Funktionen:

atmost(x,255): Geben Sie den unteren Wert von x oder höchstens 255 zurück.

atleast(10,x): Gib den höheren Wert von x oder mindestens 10 zurück.

Rohrkolben
quelle
-1

min(x+y, MAX_VALUE); würde viel mehr bedeuten als myCustomFunction(x, y);

Die Antwort lautet also JA, es ist nicht ratsam . Es dient nur als Alias ​​für Ihre Gehirnsprache.

Funke
quelle