7
votes

Comment marquer du code qui doit être supprimé avant la production?

Parfois, à des fins de test / développement, nous apportons des modifications dans le code qui doivent être supprimés dans une construction de production. Je me demande s'il existe un moyen facile de marquer de tels blocs afin que la production de production échoue tant qu'elles sont présentes ou au moins elles vous avertiront pendant la construction.

SIMPLE "// TODO:" ne fonctionne pas vraiment car il est utile oublié et mélangé avec des tonnes d'autres Todos. Y a-t-il quelque chose de plus fort?

ou peut-être même si je peux créer un fichier TXT externe et y installer des instructions sur ce qu'il faut faire avant la production et que cette fourmi vérifie si ce fichier est présent, annulez la construction.

Nous utilisons Eclipse / Ant (et Java + Spring).

mise à jour: Je ne veux pas dire qu'il y a de gros morceaux de code différents dans les locaux et la production. En fait, tout le code est pareil et devrait être le même. Disons simplement que je commencez à commenter une ligne de code pour économiser beaucoup de temps pendant le développement et oublier de noter cela ou de quelque chose le long de ces lignes. Je veux juste pouvoir signaler le projet d'une manière ou d'une autre que quelque chose a besoin d'une attention et que la construction de la production échouerait ou montrerait un avertissement.


2 commentaires

+1 La première fois que j'ai vu quelque chose comme ceci était dans le code source de la première version d'un jeu appelé Wolfenstein. Ils avaient une constante de date qui commutée de code de test.


Audit les changements de chaque commit, ligne-ligne, IMHO corrige le problème. Vous n'oublierez pas cela, car votre outil de révision de code vous obligera à regarder le diff, et vous serez obligé de le reconnaître ou de rejeter le changement.


19 Réponses :


0
votes

Peut-être que si vous marquez ces classes / méthodes de dédommage, ils seraient alors marqués lors de la compilation?


0 commentaires

7
votes

Ajoutez un test d'unité qui échoue si le bloc est présent. Peut-être que le bloc définit une variable globale code_block_is_not_dleted = true; que le test de l'unité vérifie.

Cependant, votre plus grand problème est que vous testez / développez avec du code que vous n'avez pas besoin ni d'utiliser dans la production. Ça ne sonne pas bien.


1 commentaires

C'est vraiment intelligent. Je n'aurais jamais pensé à ça.



3
votes

Un en quelque sorte sale suggestion serait de créer une classe avec une méthode statique permettant de dire xxx

, puis marquez les endroits que vous souhaitez avec xxx

Puis avant la production, supprimez simplement la classe et vous obtiendrez des erreurs de compilateur si nécessaire: D


3 commentaires

Bien que cela soit sale, je ne suis pas d'accord avec le bowvote. Cela aiderait réellement.


Vote sérieusement le vote? Garçon sommes-nous grincheux aujourd'hui ... Merci Jorn .. (un vote vers le haut pourrait vous aider: p)


J'aime l'idée de cela, peut être utilisé n'importe où dans le code, ne nécessite pas d'accès au système de construction. Cela ne va pas bien au-dessus de l'individu, mais meh, rapide et sale et votre IDE peut vous emmener directement à la source du problème. +1 :-)



0
votes

Pour nos environnements de production, nous avons quelques outils simples C pour supprimer des sections en utilisant un commentaire très spécial. / * # begin_skip * / et / * # end_skip * / . Collez-le à la standard C Exécution, et vous pouvez compiler sur n'importe quel environnement.

Vous pouvez modifier tout votre cycle de construction pour répliquer le code source, le transformer et la compiler.


0 commentaires

1
votes

Les concepts d'inversion de TDD et de dépendance peuvent vous aider ici. En mettant le code qui varie en une classe qui implémente une interface, vous pouvez contrôler lorsque la version de test de ce code fonctionne et lorsque la version Prod est exécutée.

Ensuite, vous avez un fichier, clairement nommé comme étant pour tester, que vous pouvez laisser de votre construction.


0 commentaires

0
votes

J'essaierais d'éviter cela autant que possible. - une approche alternative consisterait à utiliser une injection de dépendance pour injecter des implémentations différentes pour les tests.

ou ...

ajoutez un champ booléen intesté aux objets et enveloppez le code facultatif dans une instruction IF. < / p> xxx

Vous pouvez définir cette injection de dépendance ou la lire à partir d'une propriété système transmise dans la propriété système (-DIntest = true)

espère que cela aide.


0 commentaires

0
votes

Vous pouvez utiliser un préprocesseur Java. Pour les applications J2ME, j'utilise le préprocesseur d'antenne. Le code ressemble à ce xxx


0 commentaires

13
votes

Évitez la nécessité. Si vous placez du code dans une classe qui ne devrait pas être là dans la production, déterminez comment procéder différemment. Fournissez un crochet, disons, de sorte que le code de test puisse faire ce dont il a besoin, mais laissez le code de test en dehors de la classe. Ou sous-classe pour tester ou utiliser une injection de dépendance ou toute autre technique qui laisse votre code valide et sans danger pour la production, tout en maintenant testable. Beaucoup de telles techniques sont bien documentées dans le livre fantastique de Michael Feathers, Efficacement avec le code hérité .


0 commentaires

0
votes

Eclipse permet d'ajouter d'autres marqueurs que simplement // TODO, vous pouvez ajouter, par exemple, // toBeramoved et lui donner une priorité élevée, il apparaît donc avant tous les autres marqueurs de TODO.


2 commentaires

Ce serait une solution parfaite si je peux vérifier en quelque sorte si ceux-ci existent de la fourmi.


Ce ne devrait pas être si difficile de le vérifier de la fourmi



0
votes

Le moyen évident de résoudre ce problème est d'avoir un test unitaire qui fonctionne uniquement sur la construction visant à créer les fichiers de production (ou de vérification si la version actuelle est ciblée pour la production et exécute le test si elle est) et échouer la construction si le test échoue.

Vous n'oublierez jamais. En ce qui concerne quel type de test, idéalement, il vérifierait réellement quel que soit le code. Si cela n'est pas possible, alors une statique mondiale en tant que Terry Lorber suggéré serait beaucoup mieux que ce que vous avez maintenant.


1 commentaires

@ Thorbjørnravnandersen, j'espère avoir clarifié ma réponse.



0
votes

Il suffit d'ajouter // TODO: - Ensuite, faites un script C # (CS-Script.net) qui recherche // TODO dans votre code et les affiche. Vous pouvez ensuite ajouter ce script à vos constructions automatisées (si vous faites cela), donc chaque fois que vous faites une construction, vous pouvez voir ce qu'il y a à faire. Examinez la liste TODO de votre code avant de déployer.

Alternativement à écrire votre propre script, il existe des instructions sur la manière d'intégrer Vstudio avec un outil qui indique également vos lignes de Todo: http://predicateet.blogspot.com/2006/12/show-all-tasks-in-visual-Studion- 2005-C.HTML

Cependant, il me semble que la mise en place de cet outil est plus une douleur que d'écrire un script C # simple avec une regex.


0 commentaires

1
votes

Dans les projets que j'ai travaillé, j'ai eu diverses tarits de code qui sont en place pour permettre des tests faciles pendant le développement. Je les enveloppe dans un bloc IF qui vérifie une finale booléenne. Lorsque le booléen est vrai, le code peut être consulté. Lorsque le booléen est faux, je dépend du compilateur en supprimant le code des fichiers .Class résultants comme optimisation. Par exemple:

public class Test {
    public static void main(String[] args) {
        final boolean TESTABLE = true;

        if (TESTABLE) {
            // do something
        }
    }
}


1 commentaires

FYI, cette méthode est expliquée plus en détail ici: JavaPracces.com/topic/topicaction .do? id = 64



12
votes

Vous pouvez également définir simplement des marqueurs de commentaires de tâches plus forts: Fixme (priorité élevée) et XXX (priorité normale) sont standard dans Eclipse, et vous pouvez définir plus d'étiquettes de tâches (Eclipse Properties -> Java -> Compiler -> Tags de tâches)

Si vous souhaitez échouer votre construction, vous pouvez utiliser la fourmi (1.7) contient sélecteur de fichier pour rechercher des fichiers contenant du texte spécifié: xxx

évidemment, modifier $ {pom.build.sourcedirectory} à Votre répertoire source et fixme au commentaire que vous souhaitez rechercher.

Quelqu'un peut-il connaître une bonne façon d'imprimer les fichiers trouvés dans ce fichier de fichiers dans le fichier de construction ( autre que de regarder à nouveau dans l'éclipse)?


0 commentaires

0
votes

J'utilise le mot-clé // fixme que Eclipse s'affiche, ainsi que // TODO, dans la vue Tâches (vous pouvez filtrer ce qu'il faut voir dessus). Vous ne devriez pas aller à la production s'il y a du // fixme autour de :)


0 commentaires

1
votes

En plus de toutes les suggestions ci-dessus (ce qui est avec toute la merde manuelle et ajout de Cruft au code? Automatisez les choses que les gens ...), je remarque que vous utilisez Eclipse, Spring et Ant. Eclipse prend en charge plusieurs dossiers sources - séparez votre code dans un dossier "Source" et "Test", placez quoi que ce soit pour la production dans le dossier source et mettre tout élément "pas de production" dans le dossier de test. Le printemps vous permet d'avoir plusieurs configurations qui font référence à différentes implémentations. Vous pouvez donc avoir une configuration de production qui ne fait référence que des classes uniquement en production et de tester la configuration (s) à utiliser avec votre code de test. Demandez au script ANT construit les versions de production et de test de votre application - pour les tests Ajoutez le dossier «Test» à votre chemin de compilation, pour la production le laissez. Si une classe fait référence à une classe de test de la production, vous obtenez une erreur de compilation - si une configuration de ressort de production fait référence à une classe à partir de tests en production, il échouera dès qu'il essaie de le charger.


1 commentaires

Cette solution fonctionne très bien si vous pouvez obtenir tout votre code "conditionnel" dans des fichiers / classes distincts.



0
votes

Ma solution consiste à travailler sur deux branches de code séparées. Une branche de production qui ne reçoit que le code de nettoyage sans aucun code de débogage et une autre (parfois j'en ai même plusieurs d'entre elles) pour tester, déboguer, essayer de nouvelles struff, etc.

Dans Eclipse, ce sont des projets distincts (ou groupes de projets).

Mercurial est une belle VCS pour ce type de travail, mais les CV et la subversion sont bonnes aussi.


0 commentaires

2
votes

Cependant, vous le résolvez techniquement, je vous recommanderais de le faire à l'inverse: faire pas faire quelque chose de spécial pour la production de production, mais structurer votre code et créer un environnement de telle sorte que la magie arrive pendant la construction de développement. La construction de la production doit être aussi infaillible (ou la preuve de murphy) que possible.

Si quelque chose ne va pas dans la construction de développement: alors quoi.

Tout ce qui ne va pas dans la construction de la production va mal beaucoup plus.


0 commentaires

2
votes

[EDIT:] fonctionne pour C ++ ...: -)

Utilisez ces définitions de préprocesseur et tous vos problèmes seront résolus: P>

#ifdef _DEBUG
#define COMMENT (code)  /* code */
#else
#define COMMENT (code) #error "Commented out code in release!"
#endif


1 commentaires

J'ai fait une chose similaire à Java en utilisant Final Static Final Debug = True. Je pense que le compilateur optimisera les blocs de code de test dans If (débogage) {...



2
votes

Nous avons ajouté un déclencheur à la subversion qui bloque \\ nocommet: Vous pouvez avoir un \\ Nodeploy: balise que votre script de construction rechercherait avant de permettre une construction.


0 commentaires