Pourquoi MongoDB pilote Java utiliser un générateur de nombre aléatoire dans une condition?
J'ai vu le code suivant dans ce commit pour MongoDB est Java pilote de Connexion, et il semble à première vue être une blague de quelque sorte. Que fait le code suivant ne?
if (!((_ok) ? true : (Math.random() > 0.1))) {
return res;
}
(EDIT: le code a été mis à jour depuis l'affichage de cette question)
- La partie qui est en train de vous confondre?
- lire ce stackoverflow.com/questions/10336899/...
- je pense que c'est déroutant. ce code est exécuté dans un bloc catch !
- S'agit-il? Il pourrait être écrit beaucoup plus clairement que
if (!ok || Math.random() < 0.1)
(ou quelque chose de similaire). - Oui, j'allais écrire la même chose 🙂 La négation et l'utilisation gratuite de l'opérateur ternaire n'indiquent en effet intentionnel de la dissimulation.
- github.com/mongodb/mongo-java-driver/commit/... vous n'êtes pas la première, voir le commentaire de la ligne
- Ces gars-là semblent être de critiquer la logique, pas le style de codage.
- Ils ont fixé: jira.mongodb.org/browse/JAVA-836
Vous devez vous connecter pour publier un commentaire.
Après l'inspection de l'histoire de cette ligne, ma principale conclusion est qu'il y a eu une certaine incompétence de la programmation au travail.
Que la ligne est inutilement compliquée. La forme générale
pour
boolean a, b
est l'équivalent de la simpleLes environs de la négation et de l'excès de parenthèses spire encore plus les choses. En gardant à l'esprit Les lois De De Morgan c'est une simple observation que ce morceau de code s'élève à
Le commit que lancé à l'origine de cette logique avait
—un autre exemple de l'incompétence de codage, mais l'avis de l' logique inverse: ici, l'événement est enregistré, si
_ok
ou dans 10% des cas, tandis que le code en 2. retourne 10% du temps, et les journaux de 90% du temps. De sorte que le plus tard commettre ruiné pas seulement de la clarté, mais la justesse de lui-même.Je pense que dans le code que vous avez posté, nous pouvons voir comment l'auteur a l'intention de transformer l'original
if-then
en quelque sorte littéralement dans sa négation nécessaires pour les premiersreturn
condition. Mais ensuite, il a foiré et inséré un "double négatif" en inversant le signe de l'inégalité.Style de codage, en dehors du stochastique de journalisation est assez douteux en pratique par elle-même, surtout depuis l'entrée de journal ne renseigne pas sur son propre comportement. L'intention est, de toute évidence, la réduction des retraitements du même fait: le fait que le serveur est actuellement en panne. La solution appropriée est d'enregistrer uniquement les changements de l'état du serveur, et non pas chacun de son observation, en plus d'une sélection aléatoire de 10% de ces observations. Oui, ça prend juste un peu plus d'effort, donc nous allons voir quelques.
Je ne peux qu'espérer que tous ces éléments de preuve de l'incompétence, le cumul de l'inspection seulement trois lignes de code, ne parlent pas assez de l'ensemble du projet, et que ce morceau de travail seront nettoyés dès que possible.
https://github.com/mongodb/mongo-java-driver/commit/d51b3648a8e1bf1a7b7886b7ceb343064c9e2225#commitcomment-3315694
11 heures par gareth-rees:
Sans doute l'idée est de vous connecter seulement 1/10 de la défaillance d'un serveur (et donc éviter massivement de spammer le journal), sans encourir le coût du maintien d'un comptoir ou de la minuterie. (Mais sûrement, le maintien d'une minuterie serait abordable?)
Ajouter un membre de la classe initialisé à négative 1:
Dans le bloc try, faites le test:
Ce sont toujours les journaux de la première erreur, puis tous les dix ultérieure d'erreur. Opérateurs logiques "court-circuit", donc logit seulement est incrémenté sur une erreur réelle.
Si vous souhaitez que le premier et le dixième de tous erreurs, indépendamment de la connexion, faire logit classe statique au lieu d'un membre.
Comme l'avait noté ce doit être thread-safe:
Dans le bloc try, faites le test:
Remarque: je ne pense pas que jeter de 90% des erreurs est une bonne idée.
J'ai vu ce genre de chose avant.
Il y avait un morceau de code qui pourrait répondre à certaines questions "qui sont venus d'une autre" boîte noire " morceau de code. Dans le cas où il ne pourrait pas y répondre, ce serait de les transférer à un autre morceau de "boîte noire" du code qui était vraiment lent.
Donc parfois inédites de nouvelles "questions", se présentent, et ils se présentent dans un lot, à l'instar de 100 d'entre eux dans une rangée.
Le programmeur a été heureux avec la façon dont le programme fonctionne, mais il voulait d'une certaine façon peut-être d'améliorer le logiciel dans le futur, si possible, de nouvelles questions ont été découverts.
Donc, la solution était de journal inconnu des questions, mais comme il s'est avéré, il n'y avait plus de 1000 différents. Les journaux est devenu trop gros, et il n'y a pas de bénéficier de l'accélération de ces éléments, car ils n'avaient pas de réponses évidentes. Mais à chaque fois dans un tout, un lot de questions, ne serait que pourrait être répondu.
Depuis les journaux étaient trop grandes, et l'enregistrement se faisait dans la manière de se connecter le réel des choses importantes il est arrivé à cette solution:
Seul journal aléatoire de 5%, ce sera de nettoyer les journaux, alors que dans le long terme continue de montrer quelles sont les questions/réponses pourraient être ajoutés.
Donc, si un événement inconnu s'est produite, à un montant aléatoire de ces cas, il serait connecté.
Je pense que c'est similaire à ce que vous voyez ici.
Je n'ai pas aimé cette façon de travailler, j'ai donc enlevé ce morceau de code, et juste enregistré ces
des messages vers un autre fichier, de sorte qu'ils étaient tous présents, mais pas de casser le grand journal.