‘ilus kood’ 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.
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 »
Peter Paul Rubensile meeldisid lopsakad naised ja ta maalis neist ilusaid pilte. Kalduvus tüsedusele ei ole tervislik nii elus eneses kui ka objekt-orienteeritud programmeerimises, mistõttu on praegune mood alakaalulisusele. Tihti näeme liideseid, kus pole ühtegi meetodit ja neid võime nimetada tähisteks või alakaalulisteks.
Vastupidine lähenemine on problemaatiline, sest liiga suured meetodi kogumid peidavad endas mitmeid võimalusi muutumiseks, mis teeb ka väljalubatud liidese kergemini purunevaks. Hea näide on .NET raamistikus MembershipProvider, mis näeb välja selline:
Paljud emad hoiatavad lapsi, et võõrastega suhelda ei tohi. Eriti nendega, kes kommi pakuvad. Ka koodi kirjutamisel on kasulik seda hoiatust arvesse võtta.
Law of Demeter (Principle of Least Knowledge)
Kui objekt A viitab objekt B-le, siis võib A kutsuda B meetodeid, kuid ta peaks hoiduma kutsumast meetodeid objektidel, millele viitab B.
public class Person
{
public Account Account { get; set; }
public void Block()
{
Account.State = AccountState.Disabled;
}
}
public class Account
{
public AccountState State { get; set; }
}
public class AccountState
{
public static AccountState Disabled
{
//...
}
}
Andekad inimesed on tihtipeale tööl vaesed. Nende annet ei lubata piisavalt välja tuua erinevatel põhjustel.
Paljud arendajad juba teavad, et jumal on surnud, kuid ettevõttele, kus töötatakse, ei ole see uudis kohale jõudnud. Seetõttu ei lubata uusi jumalaid kummardada, kuid vaene inimene võib salaja ikka seda teha.
Loe edasi »
Sattusin lugema Michael Feathersi postistust Abstracting away from Exceptions. See pani mu mõtlema enda eelnevale rubylikule lähenemisele.
Ideeliselt võiks lisada laiendusmeetodi On juurde ning tulemuseks oleks võimalik saada järgnev kirjapilt:
Should.Do(() => int.Parse("k500"))
.On<exception>(e => Console.WriteLine("Exception: " + e.Message));
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)
