Je suis essentiellement du monde de la programmation linguistique C, en train de plonger dans le monde des langages de script comme Ruby et Python. P>
Je me demande comment faire du débogage. Actuellement, les étapes que je suive est, P>
Bien que cela fonctionne, je ne suis pas en mesure de déboguer comme comment je voudrais faire, disons, un environnement VC ++ ou quelque chose comme ça. P>
Ma question est, y a-t-il un meilleur moyen de déboguer? p>
Remarque: je suppose que cela peut être une question répétée, si oui, veuillez me pointer la réponse. P>
11 Réponses :
On dirait que le problème ici est que votre environnement (Visual Studio) ne prend pas en charge ces langues, et non que ces langues ne prennent pas en charge les débuggeurs en général. P>
Perl, Python et Ruby ont tous des débuggeurs entièrement présentés; Vous pouvez trouver d'autres idées qui vous aident aussi. Pour Ruby, il y a rubymine ; Pour Perl, il y a Komodo . Et c'est juste sur le dessus de ma tête. P>
Si vous travaillez avec Python, vous pouvez trouver une liste d'outils de débogage ici A> auquel je veux juste ajouter Eclipse avec le Extension Pydev , qui fait fonctionner avec des points d'arrêt, etc. également très simple. P>
Les langues de script n'ont aucune différence par rapport à d'autres langues en ce sens que vous devez toujours briser vos problèmes en pièces gérables - c'est-à-dire des fonctions. Ainsi, au lieu de tester l'ensemble du script après avoir terminé l'ensemble du script, je préfère tester ces petites fonctions avant de les intégrer. TDD aide toujours. P>
Votre séquence semble être entièrement reculée vers moi. Voici comment je le fais: p>
Plus précisément, je l'exécute avant em> je complète. C'est bien trop tard à ce moment-là. P>
Il y a des difficultés, bien sûr, mais avec de bons tests et un bon design, je n'ai presque jamais besoin d'un. P>
Tout le monde n'est pas tout à fait de ce gung-ho à ce sujet (tests d'écriture avant le code réel), mais des tests unitaires sont extrêmement importants pour ce type de chose à Ruby.
Le débogage est essentiel à la recherche de bugs câblés, mais de vérifier que votre code fait en réalité ce que vous souhaitez pendant le processus de développement Les tests d'unités sont bien meilleurs et que vous obtenez la possibilité de les reproduire.
TDD est essentiel pour prévenir les bugs, supprimer tout besoin de pratiques de débogage complexes.
Les debuggers ont définitivement leurs utilisations
@ S.Lott Exactement, mais les debuggers ont toujours un sens lorsque le code écrit par d'autres échoue. Lorsque TDD a laissé passer des bugs, vous pourriez toujours avoir besoin d'un débogueur pour les réparer.
Il y a une question si question sur des ides rubis ici - et à la recherche de " Ruby IDE "offre plus. P>
Je complète un grand script p> blockQuote>
C'est ce qui a attiré mon attention: "Terminé", signifie "fait", "fini", "publié". Si vous écrivez ou non des tests avant d'écrire les fonctions qui les transmettent, ou si vous écrivez ou non des tests de tous (et je vous recommande de le faire) Vous ne devez pas écrire de code qui ne peut pas être exécuté (qui est un test en soi ) jusqu'à ce qu'il soit devenu grand. Ruby et Python offrent une multitude de façons d'écrire de petits morceaux de code individuellement testables (ou exécutables), de sorte que vous n'avez pas à attendre (?) Jours avant de pouvoir exécuter la chose. P>
Je construis un script de traduction / de transformation de la base de données (ruby) en ce moment - il s'agit d'environ 1000 lignes et toujours pas faite. Je gagne rarement plus de 5 minutes sans l'exécuter, ni du moins à courir la partie sur laquelle je travaille. Quand il se casse (je ne suis pas parfait, cela brise beaucoup ;-p) Je sais où le problème doit être - dans le code que j'ai écrit au cours des 5 dernières minutes. Le progrès est assez rapide. P>
Je ne fais pas affirmer que les IDES / Detchuggers n'ont pas de place: certains problèmes ne font pas surface avant que un grand corps de code soit publié: il peut être vraiment utile à l'occasion de lâcher le tout dans un environnement de débogage pour découvrir que se passe-t-il. Lorsque des bibliothèques et des cadres tiers sont impliqués, il peut être extrêmement utile de déboguer dans leur code pour localiser les problèmes (qui sont généralement - mais pas toujours liés à la compréhension défectueuse de la fonction de bibliothèque). P>
Vous pouvez déboguer vos scripts Python à l'aide du module PDB inclus. Si vous voulez un débogueur visuel, vous pouvez télécharger WinPDB - Ne soyez pas reporté par ce préfixe "gagnant", WinPDB est une plate-forme croisée. P>
Ma question est, y a-t-il un meilleur moyen de déboguer? " P>
oui. p>
Votre approche, "1. Je remplis un grand script, 2. Commenter tout sauf la partie que je veux vérifier, 3. Exécuter le script" n'est pas vraiment le meilleur moyen d'écrire un logiciel dans une langue (désolé, mais C'est la vérité.) p>
N'écrivez pas une grande chose. Jamais. P>
fais cela. P>
décompose votre problème dans des classes d'objets. p> li>
pour chaque classe, écrivez la classe par p>
2a. Décrivez la classe, concentrez-vous sur l'interface externe et non aux détails de la mise en œuvre. P>
2b. Écrire des tests pour prouver que l'interface fonctionne. P>
2c. Exécutez les tests. Ils échoueront, puisque vous ne décrivez que la classe. P>
2d. Réparer la classe jusqu'à ce qu'il passe le test. P>
2e. À certains moments, vous réaliserez que vos conceptions de classe ne sont pas optimales. Réfacteur votre conception, assurant que vos tests passent toujours. P> li>
Maintenant, écrivez votre script final. Cela devrait être court. Toutes les classes ont déjà été testées. P>
3a. Décrivez le script. En effet, vous pouvez généralement écrire le script. P>
3b. Écrivez certains cas de test qui prouvent les travaux de script. P>
3c. Runt les tests. Ils peuvent passer. Vous avez terminé. P>
3d. Si les tests ne passent pas, les choses fixes jusqu'à ce qu'ils font. P> li> ol>
Ecrire beaucoup de petites choses. Il fonctionne beaucoup mieux à long terme que l'écriture d'une grande chose et de commenter les parties de sortir. P>
TDD est une méthodologie, et non un outil de débogage comme l'OP est question.
@Josh Smeaton: Le débogage est une technique; Donc, TDD est TDD. Je préfère la technique TDD sur la technique d'écriture et de débogage. Ça marche mieux pour moi.
S. Lott, le débogage n'est pas une "technique" - et même s'il s'agissait d'une "technique" (UGH), il n'est pas complètement remplacé par TDD.
@Banister: Si le débogage n'est pas une technique, qu'est-ce que c'est? Cela semble certainement comme une chose que les gens qui nécessitent des compétences. Ce n'est pas une méthodologie. Et, le débogage change de façon spectaculaire avec TDD à un exercice d'écriture de plus en plus de tests pour surmonter un problème. Cela ressemble à une technique pour moi.
Le débogage est une tâche, pas une technique. Juste comme code d'écriture est un code de débogage de tâche est une autre tâche de fixer des choses. TDD est comment écrire du code de manière à ne pas avoir à le déboguer. Pourtant, TDD ne résout pas le problème créé par le code que vous n'avez pas écrit. Disons que vous utilisez une fonction ajoutez code> qui ajoute correctement tous les nombres sauf
12324 + 54532 code> donnerait
12 code> car un idiot a fait que l'un des identiques improbables est un cas spécial quelque part. .. C'est quand un débogueur a beaucoup de sens ...
La méthode de débogage que vous avez décrite est parfaite pour une langue statique comme C ++, mais étant donné que la langue est si différente, les méthodes de codage sont similaires différentes. L'une des grandes choses très importantes dans une langue dynamique telle que Python ou Ruby est la couche de topletelle interactive (ce que vous obtenez en tapant, disons Même si vous avez écrit un grand programme avant de tester (ce qui est une mauvaise idée), il est espéremment séparé en plusieurs fonctions. Ainsi, ouvrez votre niveau de toplevel interactif, faites une chose Bien sûr, pour un projet plus mature, vous souhaitez probablement écrire une suite de tests réelle et la plupart des langues ont une méthode pour le faire (en python, c'est python code> sur la ligne de commande). Cela signifie que l'exécution d'une partie de votre programme est très facile. P>
importation code> (pour quelque chose
code> se trouve être), puis vous pouvez facilement commencer à tester vos fonctions un par un, appelez-les simplement sur le nombril. p>
doctest code> et
et
Nez code>, je ne sais pas d'autres langues). Au début, cependant, lorsque vous écrivez quelque chose de pas particulièrement formel, rappelez-vous simplement quelques règles simples de débogage de langues dynamiques: p>
imprimer code>. Si vous utilisez uniquement une seule fonction, le débogage avec
impression code> n'est pas si gênant et vous libère de glisser le long d'une IDE. LI>
ul>
Il y a beaucoup de bons conseils ici, je recommande de faire passer des meilleures pratiques: p>
http://github.com/edgecase/ruby_koans P>
http://blog.rubybestpractices.com/ p>
http: // sur -Ruby.blogspot.com/2009/01/Ruby-Best-Protacties-Mini-interview-2.html P>
(et lire le livre de Greg Brown, c'est superbe) p>
Vous parlez de gros scripts. Beaucoup de mon flux de travail traverse la logique en IRB ou à la coquille Python, puis les capturer dans une cascade de petites méthodes ciblées à une tâche à une seule tâche, avec des tests appropriés (pas 100% de couverture, plus de concentration sur les caisses de bord et de coin). < / p>
http: //binstock.blogspot .COM / 2008/04 / Perfectionning-Oos-Small-Classes-and-short.html P>
Si vous pensez que cela pourrait être une question de répétition, pourquoi ne pas la chercher sur le débordement de la pile avant de le demander?
@Chris Lutz, j'ai cherché avant de poser cette question et n'a pas pu trouver de succès. Mais j'étais sûr que c'est un sujet aussi générique qu'il devrait y avoir quelques questions posées plus tôt ...