Eelmisest veidi parem valideerimise variant tundub olevat kapseldada reeglid ühte eraldiseisvasse klassi. See on hästi kooskõlas ka Single Responibility Principlega.
public class PersonValidator : AbstractValidator<Person>
{
public PersonValidator()
{
RuleFor(x => x.FirstName).NotNull().And.Length(1, 25);
RuleFor(x => x.LastName).NotNull().And.Length(1, 25);
RuleFor(x => x.PersonalCode).NotNull().And.Matches("[0-9]{11}");
RuleFor(x => x.DateOfBirth).NotNull().And.LessThan(DateTime.Today);
RuleFor(x => x.Age).NotNull().And.GreaterThan(1).And.LessThan(120);
}
}
Siinkohal oleks mõistlik luua enda baasklass ning liides:
public interface IValidator<TEntity>
{
IValidationResults Validate(TEntity entity);
}
public abstract class BaseValidator<TEntity> : AbstractValidator<TEntity>, IValidator<TEntity>
{
public IValidationResults Validate(TEntity entity)
{
//...
}
}
public class PersonValidator : BaseValidator<Person>
{
public PersonValidator()
{
//...
}
}
Edaspidi võime registreerida ServiceLocatoris IValidator<Person> liidesele vastavaks PersonValidatori ning enne salvestamist samalaadselt valideerimine läbi viia.
Sellise lahendusega tekkib ka mõningasi keerukohti, mis võivad tahta lahendamist. Kuna kasutusel on generic tüübid, siis on veidi raskem lisada seda NHibernate‘ salvestamise eelseks sündmuseks. Selleks tuleb meil eelnevalt kokku panna tüüp IValidator<TEntity>, kus TEntity on määratud konkreetse tüübiga. Alternatiivne lahendus on kasutada seda lihtsalt IRepository<TEntity>.Save(TEntity entity) meetodis.
Erinevalt atribuutidest pole meil väga võimalusi luua konventsioone, mistõttu tuleb meil osades kohtades rohkem koodi kirjutada või leida alternatiivseid lahendusi (reeglitest välja lugeda atribuudiga seotud nõuded).
Hea külg selle juures on see, et saame kasutada raamistikke, kus on äriobjektid defineeritud, sest me ei pea lisama atribuute neile, vaid kirjutame valideerimise reeglitega klassi juurde.
Raamistikud:
Loe veel sarnastel teemadel:
- Valideerimine atribuutidega, 23. aprill
- Vaesed inimesed, 28. jaanuar
- Kuss, kompilaator!, 8. juuli
- Iluvõtted koodile II, 13. aprill
- Mängime peitust, silur, 11. juuli
KAIZEN FEED
Telli endale Kaizeni uudisvoog
KOMMENTAARIDE FEED
Telli endale kommentaaride voog
KAIZEN TWITTER
Lühiuudised Kaizeni autoritelt
KAIZEN FACEBOOK
Liitu Kaizeniga
MIS ON KAIZEN?
Kaizen on Saiku tarkvaraarendusealane blogi, kus kirjutame erinevatest lähenemistest meisterlikule tarkvaraarendusele.
KATEGOORIAD
- .NET (18)
- Analüüs/Arhitektuur (11)
- Arendus (66)
- Ettevalmistus (1)
- Juhtimine (2)
- Varia (23)
SILDIPILV
- .NET (41)
- ilus kood (23)
- Arendus (23)
- C# (20)
- Analüüs/Arhitektuur (14)
- Testimine (10)
- raamat (8)
- Ruby (8)
- projektijuhtimine (8)
- printsiibid (6)
- produktiivsus (5)
- ReSharper (5)
- PHP (5)
- NHibernate (4)
- objekt-orienteeritud (4)
- pidev integratsioon (4)
- Viited (4)
- agile (4)
- Java (4)
- Geekdinner (4)
- lean (4)
- raamatukogu (4)
- CI (3)
- Cruise Control.NET (3)
- Robert C. Martin (3)
- scrum (3)
- iteratsioon (3)
- suhtlus (3)
- jQuery (2)
- TechEd 2008 (2)
- Visual Studio (2)
- valideerimine (2)
- intervjuu (2)
- analüüs (1)
- ASP.NET (1)
- ümberstruktureerimine (1)
- üritus (1)
- CodeRush (1)
- dokumentatsioon (1)
- Kent Beck (1)
- LINQ (1)
- Martin Fowler (1)
- Moq (1)
- Rhino Mocks (1)
- stackoverflow (1)
- võltsitud objektid (1)
- Whiteboard Wednesday (1)
- hindamine (1)
- tarkvara kvaliteet (1)
- ajagraafikud (1)
- Saiku (1)
- koolitus (1)
- tagasivaate (1)
- koosolek (1)
- dünaamilised keeled (1)
- staatilised keeled (1)
- FluentNHibernate (1)
- facebook (1)
- aastapäev (1)
- Rake (1)
- Oredev 2008 (1)
- toyota way (1)
- raiskamine (1)
- NDepend (1)
- podcasts (1)
- väle tarkvaraarendus (1)
- raido tonts (1)
- minimal marketable feature (1)
- kasutajalugu (1)
- twitter (1)
- Joomla! (1)
- MVC (1)
- andmebaas (1)
- versioonimine (1)
- diskussioon (1)
- regulaaravaldised (1)
- motiveerimine (1)
- mõõdikud (1)
- agileestonia (1)
- riistvara (1)
- koolitused (1)
- kujundus (1)
- kodulehed (1)
- veeb (1)
