Question

J'ai souvent code basé sur un algorithme spécifique bien définie. Cela devient bien commenté et semble bon. Pour la plupart des ensembles de données, l'algorithme fonctionne très bien.

Mais les cas limites, les cas particuliers, les heuristiques sont ajoutés à résoudre des problèmes particuliers avec des ensembles particuliers de données. Comme nombre de cas particuliers poussent, les commentaires deviennent de plus en plus floue. Je crains d'aller en arrière et regarder ce code dans un an et d'essayer de se rappeler pourquoi chaque cas particulier ou heuristique a été ajouté en particulier.

Je souhaite parfois il y avait un moyen d'intégrer ou graphiques lien dans le code source, pour que je puisse dire effectivement, « dans le graphique de cet ensemble de données, cette caractéristique particulière ici était à l'origine de la routine de déclencher de manière incorrecte, c'est pourquoi ce morceau de code a été ajouté ».

Quelles sont les meilleures pratiques pour gérer les situations comme celle-ci?

Cas particuliers semblent être toujours nécessaire pour traiter ces cas inhabituels / bord. Comment peuvent-ils être gérés à conserver le code relativement lisible et compréhensible?

Prenons un exemple traitant de la reconnaissance des caractéristiques de photos (pas exactement ce que je travaille, mais l'analogie semble apt). Quand je trouve une image particulière pour laquelle l'algorithme général échoue et un cas particulier est nécessaire, j'enregistre mieux que je peux cette information dans un commentaire, (ou quelqu'un a suggéré ci-dessous, un nom de fonction descriptive). Mais ce qui manque souvent est un lien permanent vers le fichier de données particulier qui présente le comportement en question. Alors que mon commentaire doit décrire la question, et je dirais que probablement « voir fichier foo.jp pour un exemple de ce comportement », ce fichier est jamais dans l'arbre source, et peut facilement se perdre.

Dans les cas comme celui-ci, les gens ajouter des fichiers de données à l'arbre source de référence?

Était-ce utile?

La solution

Si vous avez une base de connaissances ou un wiki pour le projet, vous pouvez ajouter le graphique en elle, un lien vers elle dans le procédé par Fowler Matthew quot e et aussi dans le contrôle de code source message pour le commettre changement de cas limite.

//See description at KB#2312
private object SolveXAndYEdgeCase(object param)
{
   //modify param to solve for edge case
   return param;
}

Commit Message: Solution for X and Y edge case, see description at KB#2312

Il est plus de travail, mais un moyen de documenter les cas les plus simples à fond que des cas de test ou des commentaires pouvaient. Même si on pourrait faire valoir que les cas de test doivent être suffisamment la documentation, vous pourriez ne pas vouloir stocker l'ensemble en elle, par exemple les données ne.

Rappelez-vous, les problèmes vagues conduisent à des solutions vagues.

Autres conseils

Martin Fowler a dit dans son livre de refactoring que lorsque vous vous sentez le besoin d'ajouter un commentaire à votre code, voir d'abord si vous pouvez résumer ce code dans une méthode et donner la méthode un nom qui remplacerait le commentaire.

afin d'un résumé, vous pouvez créer une méthode nommée.

private bool ConditionXAndYHaveOccurred(object param)
{
   // code to check for conditions x and y
   return result;
}

private object ApplySolutionForEdgeCaseWhenXAndYHappen(object param)
{
   //modify param to solve for edge case
   return param;
}

Ensuite, vous pouvez écrire du code comme

if(ConditionXAndYHaveOccurred(myObject))
{
    myObject = ApplySolutionForEdgeCaseWhenXAndYHappen(myObject);
}

Pas un exemple concret dur et rapide, mais cela aiderait à la lisibilité dans un an ou deux.

Les tests unitaires peuvent aider ici. des tests qui simulent ayant effectivement les cas particuliers peuvent souvent servir de documentation pourquoi le code fait ce qu'il fait. Cela peut souvent être mieux que décrire simplement la question dans un commentaire.

Non que cela remplace déplacer le cas particulier de manutention à leurs propres fonctions et commentaires décents ...

Je ne suis pas habituellement un défenseur du développement piloté par les tests et les styles similaires stress tests trop, mais cela semble être un cas parfait où un groupe de test unitaire peut aider beaucoup. Et même pas en premier lieu pour attraper des insectes de changements plus tard, mais simplement de documenter tous les cas particuliers qui doivent être pris en compte.

A quelques bons tests unitaires avec des commentaires en eux sont en soi la meilleure description des cas particuliers. Et commentant du code lui-même devient plus facile aussi. On peut simplement indiquer quelques tests unitaires qui illustrent le problème qui est résolu à ce moment-là dans le code.

A propos de la

  

Je souhaite parfois il y avait un moyen d'intégrer ou de graphiques lien dans le code source,   pour que je puisse dire effectivement, « dans le graphique de cet ensemble de données, ce particulier   ici en vedette était à l'origine de la routine pour déclencher de manière incorrecte, c'est pourquoi ce morceau de   le code a été ajouté ».

partie:

Si le « graphique » que vous souhaitez intégrer est un graphique, et si vous utilisez Doxygen , vous dot commandes dans votre commentaire pour générer un graphique dans la documentation:

/**
If we have a subgraph looking like this:
\dot
digraph g{
A->B;
A->C;
B->C;
}
\enddot
the usual method does not work well and we use this heuristic instead.
*/

Don Knuth inventé programmation littéraire pour le rendre facile pour la documentation de votre programme pour inclure les parcelles, les graphiques, les graphiques, équations mathématiques, et tout ce que vous devez faire comprendre. Un programme lettré est un excellent moyen d'expliquer pourquoi quelque chose est la façon dont il est et comment il est arrivé de cette façon au fil du temps. Il y a beaucoup, beaucoup d'outils alphabétisés programmation; l'outil « noweb » est l'un des plus simples et est livré avec des distributions Linux.

Sans connaître la spécificité de votre problème n'est pas facile de donner une réponse, mais dans ma propre expérience, le traitement des cas particuliers sur le code dur doit être évité. Avez-vous pensé à ne pas mettre en œuvre un moteur de règles ou quelque chose comme ça pour le traitement des cas particuliers en dehors de votre algorithme de traitement principal?

Il semble que la documentation plus approfondie que des commentaires du code. Cette façon, quelqu'un pourrait regarder la fonction en question dans la documentation et être présenté avec une image par exemple qui nécessite un cas particulier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top