Atribuutide kasutamine valideerimiseks tundub paljude jaoks hea mõte olevat. Seda väidet kinnitab selliste raamistikkude rohkesus. Ei saa vastu vaielda, et see on üks lihtsamaid viise, kuid tasuks ka vaadata alternatiive enne kasutamist, sest seegi pole ilma tumeda pooleta.
public class Person
{
public int Id { get; private set; }
[Required, Length(Max = 25)]
public string FirstName { get; set; }
[Required, Length(Max = 25)]
public string LastName { get; set; }
[Required, Pattern("[0-9]{11}")]
public string PersonalCode { get; set; }
[Required, PastDate]
public DateTime DateOfBirth { get; set; }
[Required, Between(Min = 1, Max = 120)]
public int Age { get; set; }
}
Esimene muret tekitav koht on see, et klass Person on seotud konkreetse valideerimise raamistiku attribuutidega. Paljusid see ilmselt ei häiri. Kuna neid raamistikke on palju, siis raamistiku ümber vahetamine hiljem võib täiesti tõenäoline olla (kui algne valik ei olnud hea ja mõnel teisel raamistikul on paremad võimalused) ning palju õnne selle tegemisel.
Teine probleem seisneb selles, et kasutades mõne raamistiku äriklasse, siis ei ole võimalik neile valideerimise reegleid lisada. See tähendab seda, et luues väärtuse tüüpi (Value Object) klassid, mida mitmete süsteemide puhul kasutada saaks (Money, Quantity, GeographicBoundary jne), puuduvad valideerimise reeglid.
Kolmas probleem tekkib sellega, et äriloogikas on tihti keerukamad reeglid, mida atribuudid täita ei suuda ning seetõttu tuleb lisada näiteks Validate meetod juurde. See teeb klassi disaini imelikumaks.
Atribuutidega on võimalik ka häid asju korda saata. Näiteks võime Required atribuudiga elementidele lisada automaatselt andmebaasi loomise skripti NOT NULL märke FluentNHibernate abiga.
public class Persistence : PersistenceModel
{
public Persistence()
{
Conventions.ForAttribute<RequiredAttribute>((attribute, property) =>
{
if (property.ParentIsRequired)
property.SetAttribute("not-null", "true");
});
}
}
[MSDN Magazine: Conventions over configuration]
Sarnaselt võime luua TextBoxid, mille pikkus on paika pandud pikkuse reegli järgi või luua DropDownListi väärtustega, mis jäävad vastavasse vahemikku. Siinkohal tuleb ainult ideedel lennata lasta ja neid realiseerida.
Siiani oleme tegelenud ainult reeglite deklareerimisega, siis tuleks ka need mingil moel jõustada. Lahendus selleks on luua teenus IValidationService:
public interface IValidationService
{
IValidationResults Validate<T>(T entity);
IValidationResults Validate(Type entityType, object entity);
IValidationResults Validate(object entity);
}
Seda võime kasutada enne salvestamist andmehoidlas või registreerida salvestamise eelseks sündmuseks, kus ebakorrektsete andmete puhul visatakse viga. Mõlema puhul oleks mõistlik ServiceLocatori käest konkreetne realiseering küsida ja käivitada mõni neist meetoditest. Siinkohal tasub silmas pidada ka seda, et NHibernate annab tagasi proxy klasse ning valideerimine võib seetõttu vahele jääda kui valideeritava objekti tüüpi kaasa ei anna.
Tagasi ärimudeli atribuutidega solkimise juurde tulles, siis alternatiivne lahendus oleks kasutada neid transpordi objektidel ning äriolemid realiseerida selliselt, et neid poleks võimalik ebakorrektsesse seisu viia.
Raamistikud:
.NET
Java
Loe veel sarnastel teemadel:
- Valideerimine ilusate liidestega, 29. aprill
- Võtame kaalust alla, 7. september
- Vaesed inimesed, 28. jaanuar
- Rubylik C#: Monkeypatching, 27. oktoober
- Iluvõtted koodile II, 13. aprill
KATEGOORIAD » .NET,Analüüs/Arhitektuur
SILDID » .NET, Analüüs/Arhitektuur, C#, FluentNHibernate, NHibernate, valideerimine
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)
