| Propriété | Valeur |
|---|---|
| Catégorie | Contraintes (JustDummies.Constraints) |
| Sévérité | 🔵 Info |
| Activée par défaut | Oui |
Un littéral ancré — préfixe, suffixe ou valeur contenue — porte un caractère que la famille de caractères, la soustraction ou la casse déclarée ne peut pas tirer.
La chaîne dit deux choses de ses caractères. Elle demande de l’alphanumérique, puis écrit un tiret. Lue seule, c’est une contradiction, et la bibliothèque la résout d’une façon précise : une contrainte de caractères gouverne les caractères que le générateur tire, et un littéral que vous avez écrit n’est pas tiré — il est donc conservé exactement tel quel (ADR-0079 ouvre un nouvel onglet). Cette règle nomme l’ambiguïté là où vous l’avez écrite, pour que vous sachiez quelle lecture s’applique sans avoir à lancer un tirage pour le constater.
C’est légal, et cela le reste — cette résolution est précisément ainsi qu’un séparateur fixe s’exprime, et la façon simple d’obtenir ORD-pDc8 :
string reference = Any.String().AlphaNumeric().StartingWith("ORD-").WithLengthBetween(8, 20).Generate();
// ORD-7K2P9QW — le tiret est le séparateur, et le corps reste alphanumérique
La règle rapporte donc un fait, pas une faute : ce caractère apparaît là où vous l’avez écrit et nulle part ailleurs. C’est une information et non un avertissement parce que la chaîne fait quelque chose d’utile — elle ne fait simplement pas la seule chose qu’on pourrait lui prêter.
Signalé
AnyString reference = Any.String().AlphaNumeric().StartingWith("ORD-").WithLength(12); // ne peut pas tirer le '-'
AnyString batch = Any.String().WithoutNumeric().StartingWith("ORD-1").WithLength(12); // retire le '1'
AnyString slug = Any.String().InUpperCase().StartingWith("ord-").WithLength(12); // ne peut pas tirer le 'o'
Les trois sont acceptés et les trois sont signalés. Les deux premiers sont presque certainement délibérés ; le troisième presque certainement pas. La règle ne cherche pas à les distinguer — elle énonce ce que la déclaration signifie et laisse le jugement où il doit être.
Non signalé
AnyString digits = Any.String().Numeric().StartingWith("123").WithLength(12); // la famille tire chaque caractère
AnyString plain = Any.String().StartingWith("ORD-").WithLength(12); // aucune famille : le tirage couvre l'ASCII
AnyString cased = Any.String().InUpperCase().StartingWith("ORD-").WithLength(12); // une casse régit les lettres ; '-' n'en est pas
AnyString pooled = Any.String().AlphaNumeric().OneOf("ORD-1"); // un ensemble de valeurs : voir ci-dessous
- Un littéral, une famille ou un pool non constants.
- Une chaîne répartie sur plusieurs instructions ou variables. Elle doit être écrite comme une seule expression : suivre un générateur à travers une variable locale exigerait une analyse de flot.
- Un test négatif vérifiant un conflit, où la chaîne constitue tout le corps d’une lambda passée en argument.
Pourquoi un ensemble de valeurs est muet ici
Dès qu’un OneOf(...) est déclaré, il n’y a plus de remplissage : l’appelant fournit la valeur entière, donc rien n’est tiré à côté du littéral et « n’apparaît que là où vous l’avez écrit » n’a plus de sujet. Une valeur fournie qu’une contrainte refuse n’est pas conservée telle quelle du tout — elle est retirée du pool, ce qui est un autre fait, rapporté à une autre sévérité. JD029 nomme les valeurs qu’une contrainte a retirées tant que la chaîne tire encore ; JD015 le signale en 🟠 Avertissement dès que toutes les valeurs ont disparu, parce que la chaîne lève alors au lieu de rétrécir.
C’est toute la forme de la chose : un littéral à côté d’un remplissage est une ambiguïté qui mérite une note, un ensemble de valeurs vidé par une contrainte est une chaîne qui échoue.
La désactiver
C’est une information : la laisser active ne coûte rien. Si une base de code écrit des formats à préfixe fixe partout et que la note cesse d’apprendre quoi que ce soit :
dotnet_diagnostic.JD033.severity = none
Pourquoi une règle signale-t-elle du code correct
Parce que le fait qu’elle porte est fixé par la bibliothèque, pas par le goût. L’ADR-0080 ouvre un nouvel onglet admet une telle règle sur exactement deux terrains : la bibliothèque nomme une forme plus courte exactement équivalente par construction — c’est JD031 — ou deux des déclarations de la chaîne elle-même se contredisent sur les mêmes caractères et une décision enregistrée tranche laquelle gouverne, ce qui est le cas ici. Les deux se vérifient sur un fichier source plutôt qu’ils ne s’argumentent.