Je suppose que je ne vais pas me renseigner sur cette question, mais je suis très programmeur expérimenté, et j'espère que certains des lecteurs les plus ouverts d'esprit y prêteront attention.
Je pense que cela convient mieux aux langages de programmation orientés objet que leurs procédures de retour de valeur (VRP) soient déterministes et pures.
«VRP» est le nom académique moderne d'une fonction appelée dans le cadre d'une expression, et a une valeur de retour qui remplace théoriquement l'appel lors de l'évaluation de l'expression. Par exemple, dans une instruction telle que x = 1 + f(y)
la fonction f
sert de VRP.
«Déterministe» signifie que le résultat de la fonction dépend uniquement des valeurs de ses paramètres. Si vous l'appelez à nouveau avec les mêmes valeurs de paramètres, vous êtes certain d'obtenir le même résultat.
«Pure» signifie pas d'effets secondaires: l'appel de la fonction ne fait rien d'autre que calculer le résultat. Cela peut être interprété comme ne signifiant aucun effet secondaire important , en pratique, donc si le VRP sort un message de débogage à chaque fois qu'il est appelé, par exemple, cela peut probablement être ignoré.
Ainsi, si, en C #, votre fonction n'est pas déterministe et pure, je dis que vous devriez en faire une void
fonction (en d'autres termes, pas un VRP), et toute valeur qu'elle doit retourner doit être retournée dans un out
ou un ref
paramètre.
Par exemple, si vous avez une fonction pour supprimer certaines lignes d'une table de base de données et que vous voulez qu'elle renvoie le nombre de lignes qu'elle a supprimées, vous devez la déclarer comme ceci:
public void DeleteBasketItems(BasketItemCategory category, out int count);
Si vous souhaitez parfois appeler cette fonction sans obtenir le count
, vous pouvez toujours déclarer une surcharge.
Vous voudrez peut-être savoir pourquoi ce style convient mieux à la programmation orientée objet. En gros, il s'inscrit dans un style de programmation qui pourrait être (un peu imprécisément) appelé «programmation procédurale», et c'est un style de programmation procédurale qui convient mieux à la programmation orientée objet.
Pourquoi? Le modèle classique des objets est qu'ils ont des propriétés (aka attributs), et vous interrogez et manipulez l'objet (principalement) en lisant et en mettant à jour ces propriétés. Un style de programmation procédurale a tendance à faciliter cette tâche, car vous pouvez exécuter du code arbitraire entre les opérations qui obtiennent et définissent des propriétés.
L'inconvénient de la programmation procédurale est que, parce que vous pouvez exécuter du code arbitraire partout, vous pouvez obtenir des interactions très obtuses et vulnérables aux bogues via des variables globales et des effets secondaires.
Donc, tout simplement, il est bon de signaler à quelqu'un qui lit votre code qu'une fonction pourrait avoir des effets secondaires en la rendant sans valeur.