Lokaalsete muutujate kasutamisest
04.07.2008 | Gunnar
Põrgukuumuses suppsoojas vees plätserdades tekkis idee, et võiks kirjutada ühe kande lokaalsete muutujate ja nende kasutamise teemal. Peatun nende kasutamise ühel aspektil - kuidas tõsta süsteemi jõudlust ning kaitsta ennast võimalike tulevaste probleemide eest.
Päris tihti võib süsteemides leida koodi, kus kutsutakse korduvalt välja võõraste objektide küljest meetode ja omadusi, mis mingeid andmeid tagastavad. Kindlasti on see mugav ja hoiab käesoleva meetodi või omaduse koodi lühema, kuid samas on see ohtlik praktika, sest me ei tea alati, kuidas too võõras objekt meile andmed kätte toimetab.
Vaatame näiteks järgmist koodilõiku.
{
for(int i=0; i <this.Company.Staff.Count; i++)
{
Employee employee = this.Company.Staff.GetItem(i);
SalaryCalculator.Calculate(employee);
}
}
Kõik tundub korras olevat ja mingit ohtu ei oska me algul ehk aimata. Kui veab, siis ei juhtugi midagi halba jõudluse osas ja kõik toimib hästi läbi mitme versiooni kuni ükspäev mingi versiooniga võib meid aga tabada tõsine kadu jõudluses. Loomulikult on olukordi, kus hakkame kohe algul kiruma, et pagana aeglane see komponent ja mida paganat ta teeb. Kuhu aga võiks kõik see toss minna?
Probleemseks kohaks on hetkel mitu pöördumist Company.Staff poole.
Kiiremal juhul võiks omadus Staff olla midagi sellist (ilusat ja lühidat).
{
get { return this.Employees; }
}
Aeglasemal juhul võime aga avastada eest midagi sellist.
{
get
{
StaffRepository repository = new StaffRepository();
return repository.GetStaff(this.Company.Id);
}
}
Valus juhtum, kas pole? Staff on omadus ja intuitiivselt me sellist käitumist omaduselt ei eelda. Maksimaalselt ootaks ehk lazy load'i.
Mida saaksime teha, et jõudlus paraneks, on lokaalsete muutujate kasutamine. Kande alguses toodud koodijupi kirjutaksin mina selliselt.
{
Employees employees = this.Company.Staff;
for(int i=0; i <employees.Count; i++)
{
Employee employee = employees.GetItem(i);
SalaryCalculator.Calculate(employee);
}
}
Tekib küsimus, et kui paranoiline tuleks olla, et ennast väga hästi kaitsta? Kas peaks kogu võõra objekti lammutama lokaalsetesse muutujatesse laiali või saab ka kuidagi teisiti?
Mina arvan, et hulluks ei tasu minna. Kindlasti tasub olla võõraste objektide suhtes skeptiline ning uurida, et kuidas nad toimivad ja mida nad täpselt teevad ning vastavalt sellele kirjutada ka oma kood. Oluline on tuvastada meetodid ja omadused, mille kutsumisel tekib kulu kas ajas või jõudluses ning optimeerida oma kood vastavalt sellele ümber.
