L'Agilitateur - Faire des boucles sans "while" ni "for" pour les rendre plus lisibles et maintenables - CommentairesCréation de logiciels : de l'agilité à l'artisanat2021-10-09T15:11:31+02:00urn:md5:7668924f626a6543fa389f1b4e47e529DotclearFaire des boucles sans "while" ni "for" pour les rendre plus lisibles et maintenables - Oazurn:md5:ce3add8986f574699f3a6692b6760d4c2012-01-25T23:24:54+01:002012-01-25T23:32:40+01:00Oaz<p>Pour la syntaxe "à l'anglaise", j'en suis désolé mais c'est le lot des langages orientés objet... Ca ne choque plus grand monde d'écrire "document.ouvrir()", non ?</p>
<p>Par ailleurs, pour clarifier les choses, je n'ai pas pour objectif ici de me rapprocher du langage naturel de telle ou telle langue.<br />Ecrire du code, c'est manipuler des concepts de manière concise. A mon avis, l'ambiguité inhérente aux langages naturels fait qu'il ne pourront jamais réellement servir à écrire du code.</p>
<p>Le but de l'exercice présenté ici (<a href="https://agilitateur.azeau.com/post/2011/12/24/Boucles-%C3%A0-base-de-g%C3%A9n%C3%A9rateurs-et-de-transformations-%3A-un-exemple-plus-complet" rel="ugc nofollow">et poursuivi par là</a>) est de conserver dans le code les séparations claires et nettes déjà présentes dans les concepts que l'on veut exprimer.<br />Rien de plus...</p>
<p>Pour le reste, je suis bien d'accord que le développement logiciel est un métier encore jeune et qu'il reste beaucoup à faire...</p>Faire des boucles sans "while" ni "for" pour les rendre plus lisibles et maintenables - Jeannetteurn:md5:67ee942093fb5965f1fdee354721075f2012-01-25T16:23:55+01:002012-01-25T16:23:55+01:00Jeannette<p>Je comprends l'intention et la démarche.<br />
Ce qui me déplais c'est l'approche "à l'anglaise", cad que ce qu'on dit en langage naturel arrive à la fin ( en premier je veux... afficher ).<br />
C'est dommage de vouloir casser les codes pour en mettre d'autres qui sont de toute façon très éloigné du langage naturel.<br />
Ce qui me chagrine aussi c'est d'essayer de changer des habitudes et des usages qui, certes sont perfectibles, qui fonctionnent très bien et depuis longtemps.<br />
Alors qu'il y a de tels chantiers à lancer ! ( par exemple un vrai langage pour le web, des passerelles concrètes pour passer de la conception au code, de l'harmonie entre les langages etc. )</p>Faire des boucles sans "while" ni "for" pour les rendre plus lisibles et maintenables - Oazurn:md5:af540049e2732f5e9666a043f825ed692011-12-18T19:22:29+01:002011-12-18T19:53:26+01:00Oaz<p>@jojo76</p>
<p>Vous avez le droit d'avoir votre propre opinion mais ça serait encore mieux si vous pouviez nous proposer une implémentation avec une simple boucle, lisible et enseignable à des étudiants du programme dont j'ai proposé les spécifications ci-dessus...</p>
<p>Par ailleurs, votre référence à EWD concernant mon goto pour faire une boucle infinie sur un générateur me laisse perplexe...</p>Faire des boucles sans "while" ni "for" pour les rendre plus lisibles et maintenables - jojo76urn:md5:121b1899fe1f360fb37b6d2e8d96cc382011-12-15T09:33:37+01:002011-12-15T09:33:37+01:00jojo76<p>Cette démonstration de comment transformer une simple boucle en une structure linéaire complexe et illisible ne me semble pas aller vers une amélioration de la programmation et de la lisibilité des programmes. Je ne parle même pas des trésors de pédagogie, qu'il faudrait déployer pour enseigner cette méthode à des étudiants. Enfin, l'utilisation de Goto est un comble. Sa nocivité a été démontrée depuis longtemps par E. Dijkstra. Pour moi, la solution présentée est verbeuse, inutilement complexe.</p>Faire des boucles sans "while" ni "for" pour les rendre plus lisibles et maintenables - Oazurn:md5:adbe196105f4385d8272e0382881d3bf2011-11-30T20:56:51+01:002011-11-30T21:09:21+01:00Oaz<p>Bonjour Loïc,</p>
<p>Bien évidemment l'écriture que tu reprends est moins lisible que la simple boucle lorsqu'il n'y a pas de complexité supplémentaire.<br />Comme je l'écris dans le billet, la réalité est souvent plus complexe et il n'est pas toujours facile de représenter cette complexité sur des exemples que l'on souhaite garder assez courts.</p>
<p>Je vais essayer un autre exemple.</p>
<p>Soit un programme qui :</p>
<ol><li>demande à l'utilisateur de choisir une fonction parmi les suivantes :<br />- mettre un entier au carré<br />- calculer la somme des entiers inférieurs ou égaux à un entier donné<br />- calculer le k-ième terme de la suite de Syracuse à partir d'un entier donné, k étant un entier saisi par l'utilisateur</li>
<li>demande à l'utilisateur de choisir un filtre parmi les suivants :<br />- prendre les k premiers éléments, k étant un entier saisi par l'utilisateur<br />- prendre les éléments inférieurs ou égaux à k, k étant un entier saisi par l'utilisateur<br />- prendre les éléments impairs inférieurs ou égaux à k, k étant un entier saisi par l'utilisateur</li>
<li>Lorsque l'utilisateur a fait ces choix, affiche les images par la fonction choisie précédemment des entiers naturels strictement positifs restreints au filtre lui aussi choisi précédemment</li>
</ol>
Exemples d'utilisation:<br /><br />L'utilisateur choisit "mise au carré", puis "4 premiers éléments"<br />Le programme affiche : 1, 4, 9, 16<br /><p>L'utilisateur choisit "somme des entiers inférieurs ou égaux", puis "impairs inférieurs à 17"<br />
Le programme affiche : 1, 3, 15</p>
<p>L'utilisateur choisit "3ème terme de la suite de Syracuse", puis "éléments inférieurs à 6"<br />
Le programme affiche : 2, 4, 5, 1</p>
<p>Ma proposition d'implémentation d'un tel programme sera dans un prochain billet...</p>
<p>Et j'espère à bientôt lors d'une rencontre SigmaT !</p>Faire des boucles sans "while" ni "for" pour les rendre plus lisibles et maintenables - Loicurn:md5:b0c2e774d7483c24ab69773495e815e52011-11-30T10:21:50+01:002011-11-30T10:21:50+01:00Loic<p>Olivier, je suis en fait tombé sur ton blog par hasard, mais je viens de réaliser que nous nous sommes rencontrés lors de l'agile tour -l'exercice ballon de rugby dans lequel j'étais un de tes cobayes ;-) -.</p>
<p>Je pense adhérer au SigmaT et je crois que tu en fais partie, suite à mon précédent commentaire je serai ravi de discuter de vive voix de ce passionnant exercice de suppression des for/while/foreach avec toi un de ces jours ;)</p>Faire des boucles sans "while" ni "for" pour les rendre plus lisibles et maintenables - Loicurn:md5:f01e5a4b0617aa00d4356d7e6d5cfb1b2011-11-30T10:16:02+01:002011-11-30T10:16:02+01:00Loic<p>Je ne vois pas en quoi "Sequence.OfN().TakeWhile( n => n<=10 ).Select( n => n*n ).Apply( n2 => { Console.WriteLine(n2); } ).Now();" est plus lisible et maintenable que "for(var i=0; i<=10; i++) Console.WriteLine( i*i );" .</p>
<p>L'exercice est intéressant mais remplacer un code clair, qui fonctionne, compréhensible par un enfant de 10 ans par un code abstrait, verbeux et qui nécessite de connaitre par coeur une API ainsi que les caractéristiques les moins connues d'un langage donné.</p>
<p>Il faut 10 secondes pour comprendre la boucle si l'on connait un tout petit peu la programmation. 10 minutes minimum pour comprendre le code si l'on connait très bien le C#.</p>
<p>Sans compter la multiplication des lignes de code et donc du risque d'erreur, et celui d'avoir des codeurs qui ne maitrisent pas bien l'API et qui l'utilisent mal. Par exemple je ne comprends pas le Now().</p>
<p>Je reste fasciné par cet exercice que je trouve passionant et j'en remercie l'auteur mais je reste dubitatif sur son intéret final.</p>Faire des boucles sans "while" ni "for" pour les rendre plus lisibles et maintenables - Oazurn:md5:c044137bde7fa35a7a433b3c319a4c432011-10-18T01:20:09+02:002011-10-18T00:20:09+02:00Oaz<p>C'est vrai dans l'exemple proposé !</p>
<p>Mais je préfère rester dans un cadre plus général où je ne couple pas génération d'un ensemble, potentiellement "infini", d'éléments et filtrage de ces éléments.</p>
<p>Suis-je trop extremiste ?</p>Faire des boucles sans "while" ni "for" pour les rendre plus lisibles et maintenables - Denisurn:md5:718c98bfcacdf963c5c2de9af79e66df2011-10-18T00:06:55+02:002011-10-17T23:06:55+02:00Denis<p>Je pense que les methodes statiques de Enumerable font l'afffaire pour generer la sequence :</p>
<p>Sequence.OfN().TakeWhile( n => n<=10 ) devient<br />
Enumerable.Range(0,10)</p>