Page 1 sur 1
[R] Return : concis ou lisible ?
Posté : ven. 04 sept. 2015 11:19
par jpascal
Bonjour,
Désolé pour le titre peu explicite.
Les fonctions suivantes obtiennent le même résultat.
Code : Tout sélectionner
test1("a")
test2("a")
Func test1($goo)
If $goo = "a" Then Return MsgBox("", "", "Egal")
MsgBox("", "", "Différent")
EndFunc ;==>test1
Func test2($goo)
If $goo = "a" Then
MsgBox("", "", "Egal")
Return
EndIf
MsgBox("", "", "Différent")
EndFunc ;==>test2
La première est plus concise (une ligne au lieu de quatre) tandis que la seconde est plus lisible.
Quels sont les autres désavantages apportés par l'utilisation de Return en une seule ligne ?
Re: [..] Return : concis ou lisible ?
Posté : ven. 04 sept. 2015 12:06
par jguinch
Dans l'état, test1 renvoi 1 et test2 renvoi 0

Re: [..] Return : concis ou lisible ?
Posté : ven. 04 sept. 2015 14:31
par mikell
Code : Tout sélectionner
Msgbox(0,"", test3("a"))
Func test3($goo)
Return ($goo == "a") ? "Egal" : "Different"
EndFunc ;==>test2
Re: [..] Return : concis ou lisible ?
Posté : ven. 04 sept. 2015 16:59
par jpascal
Désolé si je n'ai pu me faire comprendre.
Le but de cette discussion n'est pas le résultat obtenu par les fonctions test qui ne sont là que pour l'exemple mais bel et bien de savoir si utiliser Return sur une seule ligne est une "bonne" pratique si tant est que la valeur retournée par la fonction ne nous intéresse pas.
Concrètement, je me sers de Return pour quitter les fonctions dont la valeur retournée m'importe peu. Vaut-il mieux que je sois dans la concision (une ligne) ou est-il préférable que je reste sur 4 lignes ?
Re: [..] Return : concis ou lisible ?
Posté : ven. 04 sept. 2015 23:34
par mikell
Return n'a que 2 intérêts, faire retourner une valeur par une fonction et forcer la sortie d'une fonction
Si ce n'est que le cas n°2 qui t'intéresse alors les 2 manières de faire sont parfaitement équivalentes
La lisibilité étant une notion subjective (d'ailleurs il y a eu récemment un topic bien chaud sur la question

) personnellement je ne vois pas une pratique "meilleure" que l'autre
La "bonne" pratique pourrait même plutôt être de
ne pas utiliser Return
Code : Tout sélectionner
Func test2($goo)
If $goo = "a" Then
MsgBox("", "", "Egal")
Return
EndIf
MsgBox("", "", "Différent")
EndFunc ;==>test2
Func test2($goo)
If $goo = "a" Then
MsgBox("", "", "Egal")
Else
MsgBox("", "", "Différent")
EndIf
EndFunc ;==>test2
Re: [..] Return : concis ou lisible ?
Posté : sam. 05 sept. 2015 00:03
par jchd
On en revient à la distinction stricte "à la Pascal" entre procédure (ne retournant aucune valeur) et fonction (en retournant une). Sans faire une épistémologie exhaustive des langages de programmation, on voit bien que C par exemple et parmi les langages répandus ayant eu une influence énorme, a complètement érodé cette distinction.
La théorie montre qu'on peut parfaitement se passer des deux (lambda-calcul), mais AutoIt ne possède pas les caractéristiques d'un langage fonctionnel et ce n'est pas demain qu'il risque de les acquérir.
Re: [..] Return : concis ou lisible ?
Posté : sam. 05 sept. 2015 15:07
par mdanielm
Pour moi, si une Func doit retourner une valeur, Return ne doit apparaître qu'une seule fois dans la Func, à l'avant dernière ligne.
Je suis le premier à enfreindre la règle, lorsqu'il y a des cas particuliers à traiter au début (par exemple dans une Func récurvive) ce qui m'évite un 'if then' et une indentation de la partie principale.
Re: [..] Return : concis ou lisible ?
Posté : sam. 05 sept. 2015 15:53
par orax
mdanielm, est-ce vraiment ton opinion ou est-ce que ce sont encore tes profs qui t'ont dit de faire comme ça ?
(Je n'ai pas dit que c'est bien ou mauvais, je n'ai pas donné mon point de vue, c'est juste une question.)
Re: [..] Return : concis ou lisible ?
Posté : sam. 05 sept. 2015 17:54
par mdanielm
Les deux, Orax. Les livres d'enseignement de la programmation sont farcis de règles de ce genre, les objectifs étant:
-se prémunir au maximum des erreurs de programmation
-rendre le programme lisible... et là on peut discuter longtemps
C'est une règle que j'ai toujours appliquée donc c'est aussi mon opinion. Bien que parfois, ....
L'idée générale, que je fais mienne, est d'éviter les sorties multiples des blocs: Func et boucles.
Re: [..] Return : concis ou lisible ?
Posté : sam. 05 sept. 2015 19:09
par mikell
Et comment tu fais par exemple pour faire de la gestion d'erreur multiple informative ? avoir différentes valeurs de retour pour @error ça peut être utile
Les UDF sont truffées de "If Not Machin Then Return SetError(n, 0, 0)"
Personnellement j'admets volontiers que pour me débarasser d'une chiée de If...then , souvent je pose un "If not (ou pas not) Machin Then Return Truc" et basta
[Mode Troll ON]
Et même chose d'ailleurs pour les boucles, mais avec un Exitloop (n)
Re: [..] Return : concis ou lisible ?
Posté : sam. 05 sept. 2015 22:04
par Tlem
Il serait quand même dommageable d'exécuter un tas de lignes de code pour rien.
Imaginons une fonction qui doit exécuter des dizaines ou des centaines de lignes de code avant de retourner une erreur connue depuis le début de la fonction ....
Envoyé de mon appareil mobile avec Tapatalk.
Re: [..] Return : concis ou lisible ?
Posté : sam. 05 sept. 2015 22:45
par jguinch
Moi je suis pour la solution la plus courte.
Comme l'a dit mikell, les UDF sont bourrés de Return/ExitLoop/ContinueLoop et perso je trouve ça très bien. Pareil pour l'opérateur ternaire (mais faut pas non plus tomber dans l'extrême...)