Mitä on Geneerinen ohjelmointi (osa3)?

Mitä on Geneerinen ohjelmointi (osa3)?

Talk is cheap, show me the code!

Edellisessä blogissani, geneerisen ohjelmoinnin kakkosblogissa, lupasin kertoa tarkemmin uusien ominaisuuksien antamisesta Variable-luokalle. Ensimmäisessä versiossa on tärkeää, että rajapinta toteutetaan siten, että uudet ominaisuudet eivät jatkossa riko vanhoja versioita.

Nyt metadatassa ja tarkastusluokissa on enemmän toiminnallisuutta. Julkaistaan versio 1.0 🙂

Customer
Name,1,80,0,Bloki.Characters
City,1,11,l,Bloki.Characters
Account,0,50,u,Bloki.Characters

Uuden parametrin avulla voidaan muuttaa tarkastettu arvo u-merkin avulla isoiksi kirjaimiksi eli suuraakkosiksi. Vastaavasti l-merkki muuttaa arvon pieniksi kirjaimiksi eli pienaakkosiksi. Kun parametri ei ole kumpikaan edellisistä ei muunnoksia tapahdu.

Rajapintaan olen lisännyt uuden metodin (Command). Sen avulla seuraavissa versioissa voi lisätä uusia ominaisuuksia.

interface IVariable
{
String Validate(String value);
String Command(String parameters, String data = null);
}

Tarkastuksen perusluokkaan lisäsin virheilmoituksen tuottamisen ja koodin uuden u/l -parametrin käyttöön.

public class VariableBase
{
protected String _name;
protected int _minLength;
protected int _maxLength;
protected String _case;

public VariableBase(String metadata)
{
String[] parts = metadata.Split(’,’);
_name = parts[0];
_minLength = Int32.Parse(parts[1]);
_maxLength = Int32.Parse(parts[2]);
_case = parts[3].ToLowerInvariant();
}

protected void LenghtCheck(String value)
{
if (value == null || value.Length _maxLength)
{
throw new ArgumentException(”Validate”);
}
}

protected String UpperCheck(String value)
{
if (_case == ”u”)
{
return value.ToUpperInvariant();
}
else if (_case == ”l”)
{
return value.ToLowerInvariant();
}
return value;
}

protected String LengthSetup()
{
return ”(” + _minLength + ”,” + _maxLength + ”)”;
}
}

Päivitin toteutetun merkkijonon tarkastusluokan tukemaan uusia toimintoja. Nyt saadaan siisti virheilmoitus ja mahdolliseen Sql serveriin tallentamiseen tietotyyppi. Version 1.0 tuetut ominaisuudet Command-metodissa ovat ”error”, ”sqldeclare” ja ”name”. Uusissa versioissa näitä sitten lisätään tarpeen mukaan.

public class Characters : VariableBase, IVariable
{
public Characters(String metadata) : base(metadata)
{
}

public String Validate(String value)
{
LenghtCheck(value);
foreach (char character in value)
{
if (char.IsLetter(character) == false)
{
throw new ArgumentException(”Validate”);
}
}
return UpperCheck(value);
}

public string Command(String parameters, String data)
{
if (parameters == ”error” && String.IsNullOrEmpty(data) == true)
{
return ”One word ” + LengthSetup();
}
else if (parameters == ”sqldeclare” && String.IsNullOrEmpty(data) == true)
{
return _name + ” NVARCHAR (” + _maxLength + ”)”;
}
else if (parameters == ”name” && String.IsNullOrEmpty(data) == true)
{
return _name;
}

return String.Empty;
}
}

Käytännössä olen oppinut, että ominaisuuksia kannattaa lisätä vain silloin, kun niitä tarvitaan. Ei kannata keksiä tarpeita etukäteen.

Geneerisyys ei saa vaikeuttaa normaalia hadkoodausta. Osa sovellusta voi olla kokonaan geneerinen, osa voi olla osin hardkoodattua ja osa kokonaan hardkoodattua. Monimutkaiset asiat ovat monimutkaisia ja ne kannattaa hardkoodata.

Näppituntuma on, että sovelluksesta noin 80 prosenttia on hyvä olla geneeristä ja loput hardkoodattua. Silloin osat ovat yleensä tasapainossa.

Geneerisellä mallilla perusasiat saadaan varsin vaivattomasti ja päästään suoraan haasteisiin kiinni. Projektissa tämä säästää paljon aikaa, koska vauhtiin päästään nopeasti ja resursseja jää enemmän monimutkaisten osien toteutukseen.

Seuraavassa blogissani kuvaan, miten luodaan Json ”sanoma” esitellyn metadatan avulla. Lisäksi perehdytään sen talletukseen Sql serveriin.

Mainokset

Vastaa

Täytä tietosi alle tai klikkaa kuvaketta kirjautuaksesi sisään:

WordPress.com-logo

Olet kommentoimassa WordPress.com -tilin nimissä. Log Out / Muuta )

Twitter-kuva

Olet kommentoimassa Twitter -tilin nimissä. Log Out / Muuta )

Facebook-kuva

Olet kommentoimassa Facebook -tilin nimissä. Log Out / Muuta )

Google+ photo

Olet kommentoimassa Google+ -tilin nimissä. Log Out / Muuta )

Muodostetaan yhteyttä palveluun %s