JustDummies

Juste des dummies, mais redoutablement efficaces.

Sections de la documentation

JD024 : ConstraintWithNoEffect

PropriétéValeur
CatégorieContraintes (JustDummies.Constraints)
Sévérité🔵 Info
Activée par défautOui

La contrainte est légale et inerte : le domaine qu’elle produit est celui qui existait déjà.

C’est le seul membre de la famille des contraintes que l’exécution ne signale jamais. Toutes les autres contradictions finissent par lever, bruyamment ; une contrainte inerte laisse le test au vert alors qu’il exerce un domaine que l’auteur n’a pas écrit.

Le cas dangereux est l’exclusion d’une valeur sentinelle que le générateur n’aurait jamais pu tirer. Elle manque sa cible en silence — et se met à compter le jour où quelqu’un élargit la plage, moment où la sentinelle commence à apparaître et où un test lointain devient instable.

Non conforme

Any.Int32().Between(1, 10).Except(20)      // JD024 : 20 n'a jamais été dans [1, 10]
Any.Int32().Positive().GreaterThan(-5)     // JD024 : Positive() exige déjà ≥ 1

Conforme

Any.Int32().Between(1, 30).Except(20)      // l'exclusion retire maintenant quelque chose
Any.Int32().Positive().GreaterThan(100)    // la borne rétrécit maintenant

Info plutôt qu’avertissement

Une contrainte défensive ou documentaire est un style réel et raisonnable : une équipe écrit .Except(0) sur une plage qui exclut déjà 0 pour que l’intention survive à un élargissement futur. La règle énonce le fait sans prétendre qu’il s’agit d’un défaut.

Ce qui n’est pas signalé

  • Une exclusion qui retire au moins une valeur atteignable.
  • Une borne qui rétrécit réellement le domaine.
  • La même borne déclarée deux foisGreaterThanOrEqualTo(10).GreaterThanOrEqualTo(8). C’est un seul phénomène dans les deux ordres d’écriture et dans toutes les familles de générateurs, il a donc une règle à lui : JD032, en sévérité avertissement. Cette règle-ci garde une borne impliquée par une autre, qui est la forme que montrent ses exemples ci-dessus.
  • Quoi que ce soit sur un générateur non entier, ou une chaîne avec un argument non constant.
  • Un argument UInt64 au-delà de long.MaxValue — le modèle raisonne en long, la chaîne est donc laissée tranquille plutôt que jugée sur une valeur tronquée.

Lire la source, ou la corriger là-bas ouvre un nouvel onglet· Repris depuis lib-v1.0.0-preview.6