Enne jooksmist tasub paelad kinni siduda, siiani on see hea praktika olnud. Samalaadselt peame rakenduse loomisel objektid omavahel siduma. Nagu saapapaelu saab mitut erinevat moodi siduda, saab ka objekte.
Kõige lihtsam viis on see, et üks objekt loob teise ja kutsub välja meetodi, kuid seal tekkivad tihtipeale hunnik probleeme. Meil pole võimalik testides seotud objekti võimalik välja vahetada ning see viib tavaliselt välja olukorrani, kus ühe testi käivitamiseks peame hulgaliselt seadistama.
public class MakeCustomerPreferredTask
{
public void Execute(Customer customer)
{
var repository = new CustomerRepository();
//…
repository.Save(customer);
}
}
Olukorra parandamiseks võime kasutada Dependency Injection/Inversion of Control printsiipi, mis soovitab kõik seotud objektid kaasa anda. Eelnev näide võiks välja nähe järgmine:
public class MakeCustomerPreferredTask
{
private readonly CustomerRepository _repository;
public MakeCustomerPreferredTask(CustomerRepository repository)
{
_repository = repository;
}
public void Execute(Customer customer)
{
//…
_repository.Save(customer);
}
}
Olukord on paranenud seoste osas, kuid väga tülikaks on muutunud objektide loomine, mida võib näha järgnevalt koodi lõigust:
var task = new MakeCustomerPreferredTask(new CustomerRepository(UnitOfWork.CurrentSession));
See võib palju pikem olla. Esimene võimalus lihtsustada seda oleks kasutada vaese mehe meetodit, kus luuakse parameetriteta konstruktor ning vastavad seosed määratakse seal.
public MakeCustomerPreferredTask() : this (new CustomerRepository()) { }
Hea praktika on viia seotud objektid liideste peale, kuid seosed konkreetsete objektidega jäävad alles. Võime proovida edasi minna näiteks Factory või ServiceLocator mustriga, mille puhul anname selle konstruktorisse alati kaasa ja objekt küsib tema käest vastavad vajalikud objektid.
public MakeCustomerPreferredTask(IServiceLocator serviceLocator)
{
_repository = serviceLocator.Resolve<ICustomerRepository>();
}
Jõudsime mõnes mõttes ringiga veidi tagasi – testides peame võltsitud ServiceLocatori ette andma, et vajalikke seoseid isoleerida. Edasiminekuks on vaja teha üks samm tagasi ja üks samm edasi. Lisades ServiceLocatorile juurde ülesande täita kõik vajalikud seosed pääseme natukene kirjavaevast.
Konstruktor jääks selliseks:
public MakeCustomerPreferredTask(CustomerRepository repository)
{
_repository = repository;
}
Nüüd jääb ülesandeks sisenemispunktile (entry point) lisada kood, mis küsib vajalikud objektid ServiceLocatori kaudu. MVC juures on võimalik Controllerite loomine ümber viia ServiceLocatorile:
public class ControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance(Type controllerType)
{
return (IController) ServiceLocator.Resolve(controllerType);
}
}
Nii ei pea me suure tõenäosusega rakenduses kuskil ServiceLocatori käest küsima teenuseid, sest kõik vajaminevad objektid antakse Controllerile kaasa.
Selliselt paelu siduda tundub küllaltki lihtne, eriti kui seadistamine on konventsioonide järgi – lihtsalt ütled objektile konstruktoris, mis liidestega objekte tal vaja läheb ja hakka aga kasutama neid. Seevastu tuleb meeles pidada, et see on mõeldud rakenduse teenuste jaoks ning ärimudelis ei ole hea tava seda kasutada.
Lisaks on võimalik selle abiga hallata objektide elutsüklit. Sellest tulenevalt võime unustada Singelton mustri ära.
.NET
.NET-i puhul on see kasutatav praktika ja elu on näidanud, et mingi hetk ilma selleta teha rakendust on kuidagi tülikas. Microsoft panustas ka vastava raamistiku tegemisse ja sündiski Unity. Kahjuks on see jäänud veidi vanamoeliseks ning mõnusamaid lähenemisi leidub StructureMap, Castle Windsor ja Ninject raamistikest.
Java
Kuna Java ja .NET on suhteliselt sarnased, siis kasulik on see ka seal. Praegu tundub, et seadistamist on palju, kuid soovi korral saab seda kõike lihtsustada. Sellel platvormil esindavad järgnevad raamistikud seda mõttemaailma: PicoContainer, Spring Framework
Ruby
Ruby maailmas ei peeta sellest väga lugu, sest väidetavalt ei ole seda vaja. Kuna Ruby-is on võimalik objekte manipuleerida igas suunas, siis tõesti ei pruugi see vajalik olla. Siiski on inimesi, kes arvavad, et see on väärt kasutamist ja on tehtud järgnevad raamistikud: Needle, Copland
PHP
Siingi on olemas erinevaid raamistikke: Symfony DI, Crafty
Loe veel sarnastel teemadel:
- Modernselt tarkvara loomine I: Sissejuhatus, 28. oktoober
- Modernne tarkvara loomine IV: Andmete kühveldamine, 16. november
- Modernne tarkvara loomine VI: Uuendused võluväel, 23. november
- Modernne tarkvara loomine III: Andmebaasi versioonimine, 2. november
- Modernne tarkvara loomine VII: Logimine või blogimine?, 26. november
KATEGOORIAD » Analüüs/Arhitektuur,Arendus
SILDID » .NET, Analüüs/Arhitektuur, ilus kood, Java, PHP, Ruby
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)
