Mitä on Geneerinen ohjelmointi (osa1)?

Mitä on Geneerinen ohjelmointi (osa1)?

Joka niemennotkossa ja saarelmassa koodataan. Usein samoja juttuja uudestaan ja uudestaan. Tämän huomaa, kun katsoo toimintaa vuorenhuipulta.

Geneerisesti toteutettavaksi valitaan mainittuja yhteisiä juttuja. Tällaista lähestymistä olen käyttänyt onnistuneesti monissa projekteissa yli 30 vuoden ohjelmointiurani aikana. Maailma on sinä aikana muuttunut paljon, mutta tämä geneerinen lähestymistapa toimii edelleen yhtä hyvin kuin aikaisemminkin.

Kyse ei ole patterneista, vaikka tämä ehkä on sukua niille. Patterneja lähemmin tarkasteltaessa minulle tulee epämiellyttävä olo. Ne voivat vaatia kolmannen osapuolen koodia tai olla liian monimutkaisia ylläpitää. Sovelluksen pitää olla sellainen, että peruskoodari – joka ei ole ollut projektissa mukana – voi sitä ylläpitää. Tämä on nykyään arkipäivää, kun sovelluksen ylläpito siirretään vaikka Intiaan.

Suurimman hyödyn uudelleenkäytöstä saa, kun perusjutut ovat valmiina ja testattuina alusta lähtien. Tällöin toteutetaan geneeriseen osaan vain uudet ominaisuudet, jotka ovat sitten jatkossa uusien ja vanhojen sovellusten käytössä. Sitten voi keskittyä vaikeampien osuuksien toteutukseen.

Koodia on syytä tehdä ylläpito ja pahin vaihtoehto mielessä. ”Kuvittele, että sovellusta tulee ylläpitämään psykopaatti, joka tietää missä asut”, eräs ystäväni kerran konkretisoi tilannetta. Tiivistetysti voi sanoa, että et kirjoita koodia itsellesi, vaan ylläpitäjälle.

Geneerisen ohjelma on parhaimmillaan
– helposti ymmärrettävä
– yksinkertainen
– siihen helppo lisätä uusia ominaisuuksia
– uudelleenkäytettävä
– vähän koodia
– vältetään hardkoodausta
– vähän riippuvuuksia
– päivitykset osina.

Nyt sitten esimerkki tälläisestä toteutuksesta.

Tehtävä on tehdä lomake, johon syötetään vaikka asiakkaan nimi, hetu ja tilinumero. Lomake lähettää tiedot palvelimelle ja palvelin tallettaa ne tietokantaan. Tiedot pitää tarkastaa lomakkeella ja palvelimella. Pitää varautua siihen että myöhemmin tulee lisää tietoja, lomakkeita, kenties kielituki ja kuvien talletus palvelimelle.

Helposti tulisi mieleen nopeasti hardkoodata koko juttu alusta loppuun. Mutta nyt tehdään toisin. Määritellään ensin asiakkaan tiedot. Pidetään mielessä että määrittely todennäköisesti tulee muuttumaan.

Customer (kentän nimi, minimipituus, maksimipituus ja käsittelyluokan nimi)
– Name,1,80,Characters
– SosId,1,10,SosId
– Account,0,50,Account

Ylläoleva on metadataa sovellukselle. Sitä muuttamalla muutetaan sovelluksen toimintaa. Esimerkkikoodit toimivat, mutta vain pakollinen koodi ilman poikkeustarkistuksia on toteutettu.

interface IVariable
{
String Validate(String value);
}

public class VariableBase
{
private int _minLength;
private int _maxLength;

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

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

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 value;
}
}

String metadata = ”Name,1,80,Characters”;
Characters test = new Characters(metadata);
String result1 = test.Validate(”Jarmo”); //OK
String result2 = test.Validate(”Jarm0”); //ERROR

Yllä interface, perusluokka ja merkkijonon tarkastuksen toteutus geneerisyyden mahdollistamalla tavalla. Lopuksi sen testikoodi hardkoodattuna. Samoja luokkia ajetaan sitten käyttöliittymässä ja palvelimella. Seuraavassa osassa tulossa testikoodi geneerisellä tavalla.

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