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?
design
functions
readability
Devsman
quelle
quelle
std::clamp
Funktion oder ähnliches in Betracht ziehen .up_to
(fürmin
) undat_least
(fürmax
)? Ich denke, sie vermitteln die Bedeutung besser alsminimize
usw., obwohl es einen Moment dauern kann, bis klar wird, warum sie kommutativ sind.min
undmax
undminimize
undmaximize
sind völlig falsche Namen für die Funktionen, die Sie schreiben möchten. Der Standardmin
undmax
viel 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 vorschlagencapUpperBound
undcapLowBound
. Ich muss niemandem erklären, wer was tut, das liegt auf der Hand.Antworten:
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?
das tut was nötig ist und sagt es aus seinem Namen. (Sie können auch implementieren
cap
in Bezug aufmin
wie 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.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.
quelle
clamp
wird 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.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 Sieclamp(myNumber, -Infinity, 255)
.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.)
quelle
DO NOT
(von "NICHT spindeln, falten oder verstümmeln"). Jemand, der so etwas implementiert hat, würde eine Karte erhalten.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:
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.
quelle
min
undmax
das OP verwirrt. Es ist , wennmin
verwendet, um eine zu setzen feste obere Grenze auf einem bestimmten Wert.get_lower_value
wä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.supremum
für dieget_lower_value
oben definierte Funktion , um nur aufzurufenmin
. Es verursacht beim nächsten Programmierer genau das gleiche Problem wie beim Aufrufenmaximise
. Ich würde vorschlagen, es anzurufenapply_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.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:
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:
Dann, wenn jemand liest
Sie wissen, dass Sie einen Fehler gemacht haben.
quelle
FunctionWhichReturnsTheLargestOfItsParameters
eine gute Sache sind, möchte ich keinen Teil davon.FunctionWhichReturns
vor jede Funktion stellt (die keine Ausnahme auslöst oder beendet). Sie könnten am Ende mitgetMinimum
,getLarger
(odergetLargest
mit mehr als 2 Eingängen) jedoch durch folgende reale Beratung entlang der Linien , dass (a) reine Funktionen und / oder „Getter“ die Warze verwendet werden sollget
, (b) englische Worte sollten nicht abgekürzt werden Namen. Das ist natürlich zu ausführlich für diejenigen, die sich entscheiden, solche Funktionen aufzurufenmax
.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
max
ist "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 vonmax
inmaximum
kommuniziert 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 wirdmin
.quelle
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.
quelle
max
Funktion angemessener ist, aber logischmin
ist das, wonach er eigentlich sucht.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:
Sie werden verwirrt, weil Sie versuchen, Ihre Gehirnlogik auf diese Min / Max-Funktionen anzuwenden. Sprechen Sie stattdessen nur auf Englisch.
if
dasinput
istgreater than or equal to 255
then
return 255
sonstreturn
dasinput
.Welches ist:
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.
quelle
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.
quelle
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
quelle
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:
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
min
undmax
arbeiten.quelle
Es ist in Ordnung und nicht wirklich eingängig, Min, Max zu verwenden, um Über- und Unterschreiten einzudämmen. Dies geschieht auch mit:
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.
quelle
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
,clip
etc.quelle
Ich möchte lieber eine generische Funktion namens 'bounded' erstellen
oder mit der Verwendung von 'min' und 'max'
quelle
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.quelle
min(x+y, MAX_VALUE);
würde viel mehr bedeuten alsmyCustomFunction(x, y);
Die Antwort lautet also JA, es ist nicht ratsam . Es dient nur als Alias für Ihre Gehirnsprache.
quelle