jankyValidation [#2]: Obiettivi

Obiettivi della Janky.Validation
Gli obiettivi della libreria in breve sono:
1. Ottenere più tempo libero per le pause caffè e per stuzzicare le segretarie o le consulenti carine dei rispettivi posti di lavoro
2. Supportare la Validazione per Contesto
3. Fornire una libreria di Rules pronte all'uso
4. Dare la possibilità di estendere la libreria delle Rules definendo delle Custom Rule
5. Supportare la validazione per gruppi di regole in OR, oltre che in AND
6. Dare la possibilità di ereditare un custom ValidationContext da altri custom ValidatorContext con nuove regole, favorendo il riutilizzo
7. Dare la possibilità ai designer di interfaccia di poter continuare a usare errorProvider e/o validator control.

Come potete vedere, gli obiettivi sono ordinati per Importanza decrescente...:-)

ecco la jankySoluzione:

Tutto ruota attorno a due classi astratte, come prevedibile: RuleBase, ValidationContext.
La libreria di rules fornite e le eventuali custom rules devono ereditare da RuleBase, mentre per definire un proprio contesto di validazione bisogna ereditare da ValidationContext. Ogni context ha una lista di rules definibili, un metodo initialize (di cui fare l'override) in cui creare rules e semplicemente aggiungere alla lista.
Il contesto fornisce quindi dei metodi di istanza quali BrokenRule() che restituisce le regole non valide, vari metodi ToString() per restituire tutti gli errori di validazione in modo formattato e altre particolarità.

Come usare i contesti di validazione? Ecco cosa può fare lo sviluppatore:

Creiamo una classe concreta SavingValidation() e dentro il metodo Initialite() mettiamo le nostre regole. Se il nostro applicativo prevede altri contesti di validazione che aumentano le regole di SavingValidation() possiamo estendere quest'ultimo e sempre in Initialize() (con un piccolo accorgimento) aggiungere le sole regole in più...
Non mostrato nel grafico, ma perfettamente possibile è anche la possibilità di aggiungere regole da un contesto ad un altro senza necessità di ereditare...
un semplice .AddRange() e via.

Rules di Libreria già disponibili
Piccola panoramica su quali funzioni sono già disponibili come regole di validazione:

ValueComparisonRule: compara il valore fornito con altro valore specificando l'operatore:  >, >=, = <, <=
DateComparisonRule: come sopra ma con data

ValueInRangeRule
: verifica se il valore fornito rientra nel range di valori, specificando agli estremi l'operatore:  >, >=, = <, <=
DateInRangeRule: come sopra ma con data

MatchRegexRule, IsNumericRule, IsDateRule, IsNotEmptyRule, IsUrlRule, StringLenghtRule
: regole sono autoesplicative...

e le 2 importanti regole composte:
ConditionalRule: è una regola che valuta una condizione, e se vera introduce una specifica regola nel contesto, in caso negativo ne introduce un'altra.
JoinedRule: è una regola che fornisce una "serie" di regole. La JoinedRule è valida quando almeno una delle regole fornite è vera. (Valutazione in OR)

La classe ValidationContext
Ecco i membri più importanti della classe.
Contiene semplicemente una lista tipizzata di Rules. Per aggiungere regole di validazione basta un Rules.Add(), Rule di libreria o custom, oppure anche una Rule composita. Se volessi importate le regole da un altro ValidatorContext possiamo usare Rules.AddRange(otherValidatorContext.Rules)
Il metodo IsValid() scorre le regole della lista Rules, le valida singolarmante, il risultato della validità è calcolato in AND per tutte le regole.
Se ci sono JoinedRules, le regole associate a quest'ultima vengono singolarmente validate, il risultato della JoinedRules è calcolato in OR, e la Joined va in AND con tutte le altre regole.
Esempio:
Rules.Add(new aRule());
Rules.Add(new bRule());
Rules.Add(new JoinedRule(new cRule(), new dRule(), new eRule()));
Rules.Add(new fRule());
corrisponde a fare un operazione logica del tipo:
aRule AND bRule AND (cRule OR dRule OR eRule) AND fRule.
La property BrokenRules restituisce una lista di Rule non validate (vedremo poi come linkarle alla form), oppure abbiamo anche una BrokenRuleDictionary per chi non vuole referenziarsi il Janky.Validation nello UI Layer.
I vari ToString() e override si occupano di formattare in diversi modi una stringa con tutti gli errori per chi non vuole lavorare nella UI.

Basta con la fuffa...formuliamo un problema di business reale e vediamo come usare la Janky.Validation...

Per ottenere il codice per adesso mandatemi un feedback e ve lo spedisco...più tardi cerchero di piazzarlo in un posto raggiungibile..

(a seguire la terza parte)

Print | posted on lunedì 27 marzo 2006 14:10

Comments on this post

# re: jankyValidation [#2]: Obiettivi

Requesting Gravatar...
ne più ne meno che il class designer di VisualStudio, non è UML, ma per capirci tra di noi in .net va benissimo :-)
Ciao Matteo!
Left by Giancarlo Sudano on mar 27, 2006 6:18

# Ancora sulla Janky.Validation: usarla nei progetti Windows Forms

Requesting Gravatar...
Left by Technology Experience on mar 27, 2006 11:38
Comments have been closed on this topic.