‘.NET’ sildiga artiklid
Halloo… testid on ka kood!
Mingil põhjusel arvatakse, et testid on samaväärsed write-only koodiga ning ei kanta erilist hoolt selle üle, et neid tulevikus hallata saaks. Küllaltki kurb on tõdeda pärast ümberstruktureerimist katkiseid teste, millest pole võimalik väga aru saada.
Pakun välja mõned võimalused testide paremaks struktureerimiseks.
Esimest varianti on võimalik kasutada küllaltki lihtsalt olemasolevate testide peal. Kuna testid koosnevad kolemast osast (Arrange, Act, Assert; Given, When, Then), siis võib testi ka selliselt tükkideks jagada. Cucumberi kasutajatele peaks see olema küllaltki tuttav: samalaadselt tuleb kirjeldada ära sammud. Selle pahupooleks võibki sammude haldamine olla, sest test on tükeldatud, kuid ülevaate saab palju kiiremini ning on korduvkasutatav.
Ilusaks on võimalik ka saada igasuguste maskidega, näiteks näo- või juustemaskiga. Staatiliselt tüübitud keeltes on ka tavaliselt seda silmas peetud ning loodud liidesed. Nende kasutamine teeb ilusamaks ja paindlikumaks ka arhitektuuri.
Liideste abiga saame objektide omavahelist siduvust vähendada. Teavad täpselt nii palju kui vaja. Mida väiksemaks nendega läheme, seda rohkem anname teada kavatusest ning ei pea kartma NotSupportedExceptionit.
public interface IConsume<TMessage>
{
void Consume(TMessage message);
}
public interface ICanMakeCustomerPreferred
{
void MakePreferred(Cutomer customer);
}
Toidupoodides tihti võib leida väga huvitavaid teid. Mõned noorendavad, teised salendavad, osa isegi annavad energiat juurde. Üldiselt selliste turundussiltide tõttu tekkib mul tung need järjest prügikasti visata (soovitan pigem minna korralikku tee poodi ja sealt mõned sobilikud teed endale välja valida). Kui prügikast oleks samalaadne nagu tarkvaraarenduse käigus loodud lisamismeetodid kollektsiooni, siis mul läheks ühe paki äraviskamiseks liigselt aega.
public class Teabag
{
//..
}
public class Trashbin<TTrash>
{
public void Add(TTrash trash)
{
//..
}
}
var trashbin = new Trashbin<Teabag>();
trashbin.Add(new Teabag());
trashbin.Add(new Teabag());
trashbin.Add(new Teabag());
Loodetavasti on kõht nüüd brokkoli parajasti täis ja kood ilustatud laiendusmeetoditega, mida käsitlesin eelmise artiklis. Teiseks lihtsaks võtteks on tagastada kogu objekt meetoditel. See ei ole midagi keerulisemat kui kirjutada kaks sõna:
return this;
Võib kerkida küsimus, et kus neid kasutada, kui on klassides defineeritud ainult atribuudid (property) ja paar üksikut meetodit. Nii ei ole võimalik seda väga lihtsalt rakendada.
public class Product
{
public StockKeepingUnit SKU { get; set; }
public ProductName Name { get; set; }
public Money Price { get; set; }
public Party Vendor { get; set; }
}
var product = new Product
{
SKU = new StockKeepingUnit(“PRO-2345”),
ProductName = new ProductName(“Goldstein Elite Blue Pen”),
Price = new Money(10m, Currency.EEK),
Vendor = new Organization(“ABC Company”)
};
Ilusa koodi saamiseks ei ole vaja toita teda brokkoliga, osta kalleid kreeme ega noorenevaid tablette. Tegelikult on olemas küllaltki lihtsaid võtteid selle saamiseks. Peamiselt on need tulnud sisemiste Domain Specific Language (DSL) loomise võtetest, õigemini sinna poole pürgimegi ehk kood näeks välja nagu DSL.
Esimeseks võtteks, mida käsitlen, on laiendusmeetodite (Extension Methods) kasutamine. Nende abiga saame kergesti olemasolevatele klassidele lisada meetodeid juurde, eriti kui meil pole võimalik klassi ennast muuta.
Tarkvara arendamine on pidev tegevus; pidevalt ilmuvad uuendused ja vigade parandused. Kõik see on meeldiv, kuid uuendamine alati pole, eriti kui peab vana maha võtma ja uue paigaldama. Kerkivad mõned küsimused: kas seadistused jäävad alles? kas kõik seaded on varundatud? Palju meeldivam on see, kui rakendus imeväel ennast uuendab ja ise midagi tegema ei pea. Nii toimivad paljud töölaua rakendused praegu, kuid samalaadselt võiksid ka meie klient-server rakendused uueneda.
Peamiselt on meil vaja uus kood kokku kompileerida, lisada talle uus versiooni number, andmebaasi skeem uuendada ja andmete kohandada. Väga palju polegi. Automatiseerimiseks sobivad lihtsad skriptid: kõige algupärasem variant oleks teha konsooli skript, kuid selleks peame väga hästi tundma iga kasutatava rakenduse parameetrite süntaksit.
Pea iga rakendus vajab andmete salvestamist, eriti nö andmepõhised rakendused. Seetõttu tuleb meil siduda rakendused andmebaasiga ning võimalusi selleks on mitmeid.
Küllaltki tüüpiline on alguses kasutada andmebaasi lähedast mudelit. Ehitada ise andmete vahetuskiht ja teha DataAccess objekte. Sellise lähenemisega kaasneb hulgaliselt andmekihi kirjutamist, tihti on see lausa 80% projekti mahust ning pärast kolmandat korda tundub, et pidevalt on loodud sama koodi. Oren Eini (Ayende Rahien) ühes ettekandeski ütles, et see on lahendatud probleem ning sellele vastu vaielda väga mõistlik pole.
KATEGOORIAD » .NET,Analüüs/Arhitektuur
SILDID » .NET, Analüüs/Arhitektuur, Java, NHibernate, PHP, Ruby
LOE EDASI »Koodi versioonime on küllaltki elementaarne nähtus (jah, mõned tõesti ei tee seda, kuid selles situatsioonis ei taha väga ükski meeskond olla), kuid andmebaas on jäänud tihti tahaplaanile. Esimesi praktikaid on hoida meeskonnas ühte jagatud andmebaasi. See võib alguses hea mõttena tunduda, kuid kahjuks pole versioonimisest haisugi ja meeskond näeb erinevaid jõukatsumusi selle haldamisel.
Selleks, et versioonida andmebaasi peame selle mingil moel koodihoidlasse saama. Teame, et SQL skripte annab küllaltki lihtsalt teha ning võiksime teha kolm faili: Create, Data ja Destroy. Nüüd tuleb need lihtsalt käivitada enda lokaalses masinas ja ongi andmebaas arendamiseks olemas ja versioonihalduses. Lahendus töötab küllaltki hästi, kui meil on paar tabelit ainult.
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.
KATEGOORIAD » Analüüs/Arhitektuur,Arendus
SILDID » .NET, Analüüs/Arhitektuur, ilus kood, Java, PHP, Ruby
LOE EDASI »Üks populaarsemaid kasutajaliides loomise mustreid veebirakenduste juures on Model-View-Controller ehk lühidalt MVC. Seda kohtame nii PHP, .NET, Ruby ja Java maailmas, kuid mõnes neist võib lähenemisnurk olla veidi erinev.
Liigume edasi nüüd mustri lahkamise juurde:
- Model – Selle all mõeldakse tihtipeale ärimudelit, mis pole kõige valem, kuid parem oleks mõelda vaatemudelit. Põhjus on selleks lihtne – vaates võivad olla spetsiifilised väärtused kuvamise jaoks olla (n: mõne elemendi CSS klass) ning need ei peaks olema ärimudeli küljes. Lisaks võiks see sarnaneda võimalikult Data Transfer Objectile, mille teisendab Controller ärimudelist. Sel puhul ei peaks muretsema selle üle, et kui mingit meetodit või atribuuti kutsuda ei hakata andmebaasi vms kallale minema.
- View – Peamiselt HTML vaade kus seotakse andmed malliga. Teisisõnu lõpptulemus, mida kasutaja näeb.
- Controller – Küsib andmehoidlast vastava ärimudeli, käivitab vastavad äriprotsessid ja teisendab tulemuse vaatemudeliks ning kuvab vaate.
KATEGOORIAD » .NET,Analüüs/Arhitektuur
SILDID » .NET, Analüüs/Arhitektuur, Joomla!, MVC, PHP
LOE EDASI »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)
