Question

Je suis un peu abasourdi par beaucoup de réactions sur des questions qui indiquent que les développeurs se soucient plus sur les octets compilés résultant que sur le sens de leur code. Je tends à petite bête à propos de postfix / incrément de préfixe, comme je l'ai tendance à petite bête sur l'utilisation d'un booléen pour un type énuméré avec deux valeurs, et sur les noms de bon fonctionnement, et ...

La question est donc plus un sondage rethorical: quand est-on autorisé à ignorer la sémantique de ce que l'on écrit? Où est la frontière?

  • opérateur ++ (postfix / préfixe)
  • String.Empty () par rapport à la chaîne == ""
  • vector.empty () vs. vector.size () == 0
  • énumérer {on, off} vs booléen sur = true; off = false
  • ...

le nom.

EDIT -

Je ne voulais pas à la question sur la nécessité de (micro) -optimizations. Au contraire, je veux des opinions sur la façon dont vous devriez être conscient de ce que vous écrivez, et des déclarations comme « mais il Compile à un dword, de toute façon, alors pourquoi devrais-je faire un ENUM? » (C'est un cas extrême ...).

Était-ce utile?

La solution

J'ai écrit un beaucoup de code dans ma carrière. Certainement pas autant que beaucoup de gens ici, mais beaucoup de code quand même. Pendant ce temps, je l'ai appris une chose qui est prouvé vrai maintes et maintes fois. Lorsque vous obtenez bâclée, lorsque vous ignorez les détails, défauts dans fluage

Les défauts coûtent du temps et de l'argent pour réparer. Vous pouvez passer le temps d'écrire le code proprement et clairement à l'avant, quand il est pas cher de le faire, ou vous pouvez passer beaucoup de temps et d'argent plus tard pourchassant un défaut dans le code que vous avez probablement ne vous souvenez pas bien tout cela parce que vous giflé ensemble pressé ou parce qu'il ne se conforme pas à la norme de codage. Le résultat final est, vous perdez du temps et de l'argent. De plus, vous perdez du temps et de l'argent que vous ne devez pas perdre pour commencer, car il aurait pu être évitée par un peu d'avance investissement.

Je ne l'ai jamais regretté d'être méticuleux au sujet de la façon dont j'écrire du code. Il est jamais venu me hanter. Être bâclée a toujours revenir me hanter.

Autres conseils

Définir "ok". Est-il correct si cela fonctionne à la date de livraison initiale, mais chaque fois que vous avez besoin de faire un changement, il faut trois semaines supplémentaires pour comprendre l'ancien code?

Il y a votre réponse: aussi longtemps que vous pouvez comprendre le code et il ne blesse pas votre capacité à maintenir

.

Lorsque vous commencez à se soucier des choses ésotériques qui ont aucun effet sur le Bottomline, je pense que ça va trop loin. Des discussions comme si vous voulez utiliser l'opérateur ternaire ou écrire explicitement si les déclarations sont bonnes pour les jours où vous avez rien à faire, mais asseyez-vous, mettez vos pieds, bière gorgée / vin / soda et de discuter des questions de « grande importance »:)

Mais la création d'une énumération pour booléenne est tout simplement faux.

dépend de votre fonction de coût

Voici une dimension couple gens aiment discuter, et souvent amalgament. Vraiment, la réponse est que cela dépend. Qu'est-ce que vous avez vraiment la valeur?

  • Nombre de caractères
  • Nombre d'opérations créées
  • Run-time
  • La portabilité
  • maintenabilité
  • Clarté
  • Cleverness
  • Stabilité (sans insectes?)
  • extensibilité

Je vise toujours les choses d'ordre supérieur d'abord, comme la clarté. La perte de clarté est payée dans les cycles de l'homme, dont il y a toujours une pénurie de. Les gens se soucient rarement le temps d'horloge cru, et les gens qui disent qu'ils ne sont presque toujours prématurément optimisent.

S'il vous aide à tout, je me plais à penser que nous faisons des progrès en remontant la pile, prise en charge plus sur la sémantique et le travail se fait plutôt que d'être esclaves à des bits et des nombres. Cependant, ce n'est pas une excuse pour oublier les fondamentaux et rappelez-vous comment certains bits sémantiques sont mis en œuvre. Vous ne voulez pas être pris avec votre pantalon vers le bas au cours de ces rares occasions où la vitesse commence à la matière et la convention va par la fenêtre.

« quand est-on autorisé à ignorer la sémantique de ce que l'on écrit? Où est la frontière? »

Je pense une question raisonnable est: « quand devrait un mépris la sémantique de ce que l'on écrit »

Depuis que je considère la programmation comme une activité humaine, je dirais que la seule fois un devrait ne pas tenir compte de la sémantique d'un énoncé est lorsque le système lui-même vous oblige - quand une déclaration incompréhensible est le seule façon de faire quelque chose . De telles déclarations sont bonnes à documenter.

La frontière est quand vous avez affaire à écriture unique, lecture jamais code. Seulement il finalement pas d'importance ce que vous faites (dans ce cas) parce que vous ne l'utiliser à nouveau. Malheureusement, cela ne traite pas de la rétroaction indirecte de la pratique des choses que vous préférez ne pas répéter.

La ligne frontalière est des effets secondaires.

Si une fonction encapsulée fait tout ce que vous voulez avec 0 effets secondaires inattendus, et le code est lisible, c'est tout ce qui compte. Si vous êtes prévisible à un utilisateur extérieur et une fonctionnalité « bizarre » est tenue en interne, qui est tout ce qui compte.

Il change légèrement si vous ajoutez dans l'optimisation, mais puisque vous ne devriez jamais optimiser prématurément, c'est à peu près tout.

Micro optimisations sont inutiles 99% du temps. Par exemple, si vos stagiaires du compilateur « tous » à une seule instance de toute façon, vous n'êtes pas augmenter les performances en aucune façon en utilisant String.Empty. Ne pas avoir un effet mesurable est généralement le meilleur que vous pouvez espérer aussi, je constate que la performance de diminution « optimisations », en raison du compilateur fait un meilleur travail, et l'optimisation interférer avec elle.

La plupart du code n'a pas besoin d'être optimisé. L'identification où cela doit se produire ne peut être fait avec le diagnostic après le code est en cours d'exécution, et même alors la plupart du temps, il se fait grâce à l'optimisation algorithmique, pas de micro optimisation.

Je pense que ces jours-ci la plupart des gens conviennent que, en supposant qu'il fonctionne correctement, la lisibilité est le facteur le plus important. Il y a des exceptions, bien sûr - certaines applications doivent courir aussi vite que possible, et certaines applications peuvent jamais être autorisés à se bloquer, mais en général il est lisibilité

.

L'observation des exemples que vous avez fournis - Ce qui suit:

operator++ (suffixe / préfixe)

string.empty() c string == ""

ne semblent pas être de bons exemples, car ils comparent les opérations qui sont différentes dans functionality. Par conséquent, une meilleure pas ne pas tenir compte des distinctions sémantiques.

En revanche, les exemples suivants:

vector.empty() c vector.size() == 0

enum {erate on, contre} off boolean on=true; off=false

sont parfaitement raisonnable.

indeterminate est préférable si le contexte de son utilisation est uniquement pour déterminer si le vecteur est vide. Au condescendant sondage de risque (que je fais pas l'intention d'être): cela se résume au bon sens. Pourquoi si vous voulez seulement demander la taille du vecteur de savoir si elle est vide? C'est comme demander à quelqu'un combien d'argent ils ont dans leur portefeuille lorsque vous souhaitez simplement savoir s'ils ont assez d'argent par un Coca-Cola.

En ce qui concerne erate {<=> <=>, contre} <=> <=> <=>; <=>, demandez-vous ceci: comment vous pouvez est-il probable que ajouter une autre valeur à l'énumération, à l'avenir? Il semble raisonnable que l'on pourrait désirer erate {<=> <=>, <=>,} `<=> (ou une variante), de sorte que la réponse peut être oui. Dans le cas contraire, un booléen simple serait suffisante.

Cela me conduit au cœur de votre question: ce qui semble être le cas il y a une approche déterministe / algorithmiques de décider d'une façon ou d'une autre sur des questions telles que celles-ci, ou leur pertinence? Ma réponse est que jusqu'au jour où Machines sont Turing en mesure de passer le test de Turing , je dirais Non, c'est la raison pour laquelle les humains sont nécessaires pour concevoir le logiciel.

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