Je viens de trouver cette fonction dans le projet sur lequel je travaille:
-- Just returns the text unchanged.
-- Note: <text> may be nil, function must return nil in that case!
function Widget:wtr(text)
return text
end
Dommage, le codeur ne travaille plus dans l'entreprise. Pourquoi créer une fonction qui ne fait rien, mais renvoie le paramètre avec lequel elle est appelée?
Y a-t-il une utilité à une telle fonction, non spécifiée dans cet exemple, mais globale dans tous les cas?
En raison de
function aFunction(parameter)
return parameter
end
Fini dans
aFunction(parameter) == parameter
Pourquoi devrais-je écrire quelque chose comme
aFunction(parameter) == whatIWantToCheck
au lieu de
parameter == whatIWantToCheck
?
this
.int getParam(int param) { //DO NOTHING return param; }
Du point de vue du chaînage de méthode, c'est un appel complètement redondant et inutile car vous pouvez laisser la fonction de l'OP hors d'une chaîne de méthodes et cela ne ferait aucune différence.new Foo()->method();
n'était pas une syntaxe valide, et des constructions commefunction with($what) { return $what; }; with(new Foo())->method();
ont été utilisées comme solution de contournement.Réponses:
Votre question revient à demander quel est le bien du nombre zéro si chaque fois que vous l'ajoutez à quelque chose, vous obtenez la même valeur. Une fonction d'identité est comme le zéro pour les fonctions. Un peu inutile en soi, mais parfois utile dans le cadre d'une expression utilisant des fonctions d'ordre supérieur, où vous pouvez prendre une fonction en paramètre ou la renvoyer en conséquence. C'est pourquoi la plupart des langages de programmation fonctionnels ont un
id
ouidentity
dans leur bibliothèque standard.Autrement dit, cela fait une fonction par défaut pratique. Tout comme vous pouvez définir
offset = 0
un entier par défaut, même si cela fait qu'un décalage ne fait rien, il peut être utile de pouvoir le définirfilterFunction = identity
comme fonction par défaut, même si cela fait que le filtre ne fait rien.la source
filter
fonction d'ordre supérieur. Une fonction de premier ordrefilter
a le type[a] -> [a]
,.OrderBy(x => x)
Sûr. Imaginez une API externe qui vous permet de récupérer des éléments dont vous avez absolument besoin, mais vous devez spécifier des critères de filtrage et des formateurs de sortie pour chaque requête, même si vous voulez tous les résultats et les obtenir exactement tels qu'ils sont stockés.
Ensuite, il faudrait inventer une fonction triviale "tout accepter" et une fonction triviale de "retour inchangé" pour accéder aux données.
wtr
est précisément un pseudo-formateur trivial. Si vous utilisez beaucoup cette API, il peut être très utile d'avoir cette fonction pseudo-assistante plutôt que de créer une fonction anonyme chaque fois que vous interrogez quelque chose. (Vous pourriez envisager de l'appeleridentity
plutôt quewtr
pour qu'il soit immédiatement clair qu'il ne fait rien.)la source
null
comme argument, vous utilisez une fonction de filtre vide qui filtre avec `` rien '' pour que le programme cesse de se plaindre.WHERE
clause? C'est vaguement une question de sucre syntaxique. Essentiellement, l'absence d'uneWHERE
clause est exactement la même que si vous aviez uneWHERE
clause qui va de l'avant et permet tout. Le fait que les concepteurs de SQL ne vous permettent pas de spécifier uneWHERE
clause, au lieu de vous en forcer une, même quand il accepte tout, est plus ou moins du sucre syntaxique, et ils vous ont juste fourni cette option pour plus de commodité. ..N'est-ce pas juste un polymorphisme?
D'après mon expérience avec Qt
tr()
et leswtr()
méthodes sont censées être utilisées (là, en Qt ) dans la localisation duWidget
texte de.Ainsi, en retournant le texte inchangé cette méthode dit simplement:
Widget does no localization (translation of the text) by default. Override this function to enable your own logic
.la source
Un cas très courant pour cela est «la fonctionnalité ajoutée ultérieurement». Le programmeur a donc pensé qu'il pourrait y avoir des changements à cette fonction plus tard. Puisque vous y accédez en tant que fonction et non en tant que paramètre lui-même, vous pouvez facilement le modifier globalement. Disons que vous avez un index avec:
et puisque votre index commence à 0, tout va bien. Vous modifiez plus tard un composant ailleurs, ce composant a besoin de vous pour traduire votre index pour commencer à 1. Vous devrez ajouter des centaines d'index + 1 partout dans votre code. Mais avec une méthode comme celle-ci, dites simplement:
et tu vas bien. Des fonctions comme celle-ci peuvent rapidement conduire à une sur-ingénierie mais à certains moments, elles ont beaucoup de sens!
la source
Les fonctions de remplacement comme celle-ci sont courantes dans les situations d'héritage de type. La classe de base peut ne rien faire d'utile, mais les classes dérivées peuvent faire diverses choses avec les entrées. La déclaration de la fonction stub dans la classe de base permet à toutes les classes dérivées d' avoir une fonction de ce nom, et aux classes dérivées individuelles de la remplacer par quelque chose de plus élaboré et utile.
la source
Un scénario supplémentaire est similaire à l'utilisation en python et C # des propriétés, mais dans les langages qui n'ont pas cette fonctionnalité.
En général, vous pouvez déclarer quelque chose comme un simple membre de la classe; disons, «nom» comme une chaîne. Cela signifie que vous y accédez comme ceci:
Plus tard, vous décidez que le nom doit vraiment dépendre de ce qui se trouve dans l'objet. Donc ça devrait vraiment être une fonction. Oups! Même sans argument, cela signifie que tout le code qui y accède doit maintenant être changé en
Mais si vous avez beaucoup d'exemples de cet appel, les chances que rien ne se passe mal avec cela sont assez faibles - quelque part ce changement ne sera pas effectué, le programme se bloquera lorsque vous arriverez à ce point, etc.
Les propriétés en C # / Python vous permettent de substituer une fonction à ce qui était auparavant un attribut, tout en permettant d'y accéder comme un attribut, c'est-à-dire sans changement. Vous n'avez même pas besoin d'avoir planifié à l'avance.
Si votre langue n'a pas cela, vous devez planifier à l'avance, mais vous pouvez toujours le soutenir comme les gens le faisaient auparavant en en faisant une fonction depuis le début qui ne fait rien. Au début, cela ne fera rien d'intéressant, et semble devoir être supprimé, et de nombreuses fonctions de ce type ne sont jamais modifiées. Mais plus tard, si vous réalisez que chaque fois que vous appelez,
Widget.wtr
vous devez supprimer certains caractères spéciaux, ce n'est pas grave - c'est déjà une fonction, il vous suffit d'ajouter cela et vous avez terminé.TL; DR Cela pourrait être un programmeur avisé qui planifie à l'avance les changements futurs.
la source
print data
. Plus tard, vous réalisez que toutes les chaînes doivent être en majuscules - vous devez aller chercher chaque impression dans votre programme et passer àprint data.upper()
. Mais si vous l'avezdef cdata(data): return data
et partout le ditprint cdata(data)
, alors vous passez simplement àdef cdata(data): return data.upper()
et c'est le seul changement.Ce n'est pas inutile, en fait il peut être extrêmement utile, car il rend votre code plus uniforme et flexible.
Supposons, par exemple, que vous ayez une liste de personnes et une liste déroulante pour que l'utilisateur puisse sélectionner si nous voulons voir "tous" ou seulement ceux qui sont "masculins" ou "féminins".
Vous pouvez soit gérer "tous" comme un cas spécial, auquel cas vous aurez besoin d'un supplément si et pour vérifier explicitement ce cas, soit vous pouvez avoir une fonction de filtre qui retourne simplement son paramètre (par exemple, permet à tout de passer), assigné pour être utilisé pour le cas "tous".
la source
Filter
classe ou une interface avecMaleFilter
et desFemaleFilter
sous - classes, et que votre code nécessite un filtre, un filtre qui ne fait rien (renvoie son paramètre inchangé) est la façon dont vous gérezAll
. La fonction ne fait jamais rien, mais peut être remplacée par celle qui le fait.