Voici un problème de programmation / langage sur lequel j'aimerais avoir votre avis.
Nous avons développé des conventions que la plupart des programmeurs (devraient) suivre qui ne font pas partie de la syntaxe des langages mais servent à rendre le code plus lisible. Ce sont bien sûr toujours un sujet de débat mais il y a au moins quelques concepts de base que la plupart des programmeurs trouvent agréables. Nommer vos variables de manière appropriée, nommer en général, rendre vos lignes pas excessivement longues, éviter les longues fonctions, les encapsulations, ces choses.
Cependant, il y a un problème sur lequel je n'ai encore trouvé personne commentant et qui pourrait bien être le plus important du groupe. C'est le problème des arguments qui sont anonymes lorsque vous appelez une fonction.
Les fonctions proviennent des mathématiques où f (x) a une signification claire car une fonction a une définition beaucoup plus rigoureuse qu'elle ne le fait habituellement en programmation. Les fonctions pures en mathématiques peuvent faire beaucoup moins que ce qu'elles peuvent en programmation et elles sont un outil beaucoup plus élégant, elles ne prennent généralement qu'un seul argument (qui est généralement un nombre) et elles renvoient toujours une valeur (également généralement un nombre). Si une fonction prend plusieurs arguments, ce ne sont presque toujours que des dimensions supplémentaires du domaine de la fonction. En d'autres termes, un argument n'est pas plus important que les autres. Ils sont explicitement ordonnés, bien sûr, mais à part cela, ils n'ont pas d'ordre sémantique.
En programmation, cependant, nous avons plus de fonctions définissant la liberté, et dans ce cas, je dirais que ce n'est pas une bonne chose. Une situation courante, vous avez une fonction définie comme ceci
func DrawRectangleClipped (rectToDraw, fillColor, clippingRect) {}
En regardant la définition, si la fonction est écrite correctement, c'est parfaitement clair quoi. Lors de l'appel de la fonction, vous pourriez même avoir une magie d'intellisense / complétion de code en cours dans votre IDE / éditeur qui vous dira quel devrait être l'argument suivant. Mais attendez. Si j'en ai besoin lorsque j'écris l'appel, n'y a-t-il pas quelque chose qui nous manque ici? La personne qui lit le code n'a pas l'avantage d'un IDE et à moins qu'elle ne passe à la définition, elle ne sait pas lequel des deux rectangles passés comme arguments est utilisé pour quoi.
Le problème va encore plus loin. Si nos arguments proviennent d'une variable locale, il peut y avoir des situations où nous ne savons même pas quel est le deuxième argument car nous ne voyons que le nom de la variable. Prenons par exemple cette ligne de code
DrawRectangleClipped(deserializedArray[0], deserializedArray[1], deserializedArray[2])
Cela est atténué à divers degrés dans différentes langues, mais même dans des langues strictement typées et même si vous nommez vos variables de manière judicieuse, vous ne mentionnez même pas le type de la variable lorsque vous la passez à la fonction.
Comme c'est généralement le cas avec la programmation, il existe de nombreuses solutions potentielles à ce problème. Beaucoup sont déjà implémentés dans les langues populaires. Paramètres nommés en C # par exemple. Cependant, tout ce que je sais présente des inconvénients importants. Nommer chaque paramètre sur chaque appel de fonction ne peut pas conduire à un code lisible. On dirait presque que nous dépassons peut-être les possibilités que nous offre la programmation en texte brut. Nous sommes passés du texte JUST dans presque tous les domaines, mais nous codons toujours le même. Plus d'informations sont nécessaires pour être affichées dans le code? Ajoutez plus de texte. Quoi qu'il en soit, cela devient un peu tangentiel, donc je vais m'arrêter ici.
Une réponse que j'ai obtenue au deuxième extrait de code est que vous décompressez probablement d'abord le tableau dans certaines variables nommées, puis les utilisez, mais le nom de la variable peut signifier beaucoup de choses et la façon dont elle est appelée ne vous indique pas nécessairement la façon dont elle est censée être interprété dans le contexte de la fonction appelée. Dans la portée locale, vous pouvez avoir deux rectangles nommés leftRectangle et rightRectangle car c'est ce qu'ils représentent sémantiquement, mais il n'a pas besoin de s'étendre à ce qu'ils représentent lorsqu'ils sont donnés à une fonction.
En fait, si vos variables sont nommées dans le contexte de la fonction appelée, vous introduisez moins d'informations que vous ne le pourriez potentiellement avec cet appel de fonction et à un certain niveau si cela conduit à un code pire. Si vous avez une procédure qui aboutit à un rectangle que vous stockez dans rectForClipping, puis une autre procédure qui fournit rectForDrawing, alors l'appel réel à DrawRectangleClipped n'est qu'une cérémonie. Une ligne qui ne signifie rien de nouveau et qui est là juste pour que l'ordinateur sache exactement ce que vous voulez, même si vous l'avez déjà expliqué avec votre nom. Ce n'est pas une bonne chose.
J'aimerais vraiment entendre de nouvelles perspectives à ce sujet. Je suis sûr que je ne suis pas le premier à considérer cela comme un problème, alors comment est-il résolu?