Question

Un de mes démons de la programmation personnelle a toujours été la logique complexe qui doit être contrôlée par des déclarations if (ou similaires). Pas toujours nécessairement aussi complexe non plus, parfois seulement quelques États à prendre en compte.

Existe-t-il des outils ou des étapes qu'un développeur peut exécuter pendant la phase de conception pour aider à visualiser les "états" et prendre des mesures pour restructurer le code afin de simplifier le code résultant? Je pense élaborer une matrice ou quelque chose du genre ...?

Était-ce utile?

La solution

Je recommanderais un cours de base en logique propositionnelle pour tous les programmeurs en herbe. Au début, la notation et les lettres grecques peuvent sembler rebutantes face à l'aversion pour les mathématiques, mais il s'agit en réalité de l'un des outils les plus puissants (et souvent négligés) de votre ensemble de compétences et plutôt simple.

Les opérateurs de base , de Morgan's et autres lois fondamentales , tables de vérité et l'existence de, par exemple, disjonctif et les formes normales conjonctives m'ont ouvert les yeux. Avant que je ne les connaisse, les expressions conditionnelles me semblaient être des bêtes dangereuses. Depuis, je sais que je peux les soumettre à la soumission chaque fois que cela est nécessaire en ouvrant l'artillerie lourde!

Autres conseils

Les tables de vérité sont fondamentalement une approche exhaustive et souligneront (espérons-le) toutes les possibilités.

Vous pouvez consulter Microsoft Pex , qui peut être utile pour repérer les cas marginaux auxquels vous n'aviez pas pensé.

Je pense que le développeur demande comment lui faciliter la vie lorsqu'il traite avec du code complexe if.

La façon dont je traite les cas complexes si le code consiste à coder le plus plat possible et à éliminer toutes les négations en premier. Si vous pouvez vous débarrasser du composé si en en plaçant une partie au-dessus, faites-le.

La beauté de la simplicité réside dans le fait qu’il ne faut pas un livre ou une classe pour l’apprendre. Si vous pouvez le casser, faites-le. Si vous pouvez en supprimer une partie, faites-le. Si vous ne le comprenez pas, faites-le différemment. Et plat est presque toujours mieux que niché (merci python!).

C'est plus simple à lire:

if(broken){
  return false;
}
if (simple){
  doit();
  return true;
}
if(complicated){
  divide();
  conquor();
}
if(extra){
  extra();
}

qu'il se lit comme suit:

if(!broken && (simple || complicated)){
 ....
}
return false;

Tables de vérité et tests unitaires - établissez les tables (n dimensions pour n variables), puis utilisez-les comme entrées pour votre test unitaire, qui permet de tester chaque combinaison de variables et de vérifier les résultats.

Le plus gros problème que j'ai constaté au fil des ans avec les FI complexes est que les gens ne testent pas toutes les branches. Assurez-vous d’écrire un test pour chaque branche possible, aussi improbable que cela puisse paraître.

Vous pouvez également essayer les cartes de Karnaugh , qui peuvent contenir jusqu'à 4 variables. .

Si vous ne l'avez pas déjà fait, je vous suggère fortement de lire Code complet . Il propose de nombreux conseils sur des sujets tels que celui-ci. Je n'ai pas ma copie sous la main pour le moment, sinon je posterais un résumé de cette section dans le livre.

Divisez la logique en unités discrètes (a & amp; b, etc.), chacune avec sa propre variable. Puis construisez-les en utilisant la logique dont vous avez besoin. Nommez chaque variable avec quelque chose d’approprié, de sorte que votre déclaration complexe soit assez lisible (bien qu’elle puisse prendre plusieurs lignes supplémentaires et quelques variables temporaires).

Vous ne pouvez pas gérer la logique avec des instructions de garde pour une raison quelconque?

Les

les cartes de Karnaugh peuvent être un bon moyen de prendre des informations d'une table de vérité (suggéré par Visage ) et en les transformant en expressions compactes et / ou / non. Celles-ci sont généralement enseignées dans un cours de logique numérique EE.

Avez-vous essayé un motif de conception? Vous pouvez examiner ce que l’on appelle le modèle de stratégie: http://fr.wikipedia.org/wiki/ Strategy_pattern

Découvrez l'option nucléaire: Drools . Il y a beaucoup de choses là-dedans - il m'a fallu un jour ou deux pour parcourir la littérature simplement pour avoir une idée de ses capacités. Mais si vous avez des applications où votre logique complexe si-alors constitue une partie évolutive du projet (par exemple, une application avec des algorithmes modulaires), elle pourrait bien être la solution.

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