Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys

22.7 Käteismuisti

Edellä avaimen muodostus tehtiin erikseen komennolla tee_avain. Toisaalta toimintaa voitaisiin helpottaa niin, että luokassa olisikin metodi

	const string &Avain(int kentan_nro);

joka toimisi siten, että luokassa olisi sisäinen attribuutti string avain ja sisäinen indeksi int avain_ind , joihin on talletettu viimeksi laskettu avaimen arvo ja mistä kentästä avain on muodostettu. Sitten joka kerta kun luokan jokin varsinainen kenttä muuttuu, asetetaan avain_ind = -1; . Nyt metodi Avain voisi toimia seuraavasti:

	const string &cJasen::Avain(int kentan_nro) {
	  if ( avain_ind == kentan_nro ) return avain;
	  avain_ind = kentan_nro;
	  avain = ... muodosta avain kentän kentan_nro perusteella...
	  return avain;
	}

Näin saataisiin aikaiseksi niin sanottu käteismuisti ( cache): Jos tieto on viimeksi laskettu, se saadaan nopeasti, muuten se lasketaan uudelleen ja seuraavan kerran pyydettäessä samaa tietoa, se saadaan nyt nopeasti. Hyötynä olisi se, ettei tarvitse erikseen muistaa muodostaa avaimia, vaan avainta voidaan kutsua milloin vaan. Tällöin esim. vertailufunktio-olion ()-operaattori olisi:

	class cVertaile {
	 cJasenet *jasenet;
	 int kentan_nro;
	public:
	 cVertaile(cJasenet *jas,int k) { jasenet = jas; kentan_nro = k; }
	 bool operator() (int a, int b) const {
	  return jasenet->anna(a).Avain(kentan_nro) < jasenet->anna(b).Avain(kentan_nro);
	 }
	};
	...
	jasenistön lajittelu:
	  ... alustetaan permuaatiotaulu jarj ..
	  // avaimia ei tarvitse muodostaa
	  sort(jarj.begin(),jarj.end(),cVertaile(this,kentan_nro));

Lisäksi jos meillä olisi kaksi tai useampia näyttöjä käsittelemässä samaa kerhoa, ohjelma toimisi avaimenmuodostuksen osalta vaikka eri näytöt lajittelisivat rakennetta eri kentän perusteella. Tietysti käytännössä ohjelmassa on vielä monia kohtia, jossa rakenteen muuttaminen kahdesta eri paikasta sotkee ohjelman varsin pahasti. Täydellisen rinnakkaisuuden sallivan ohjelman tekeminen onkin haaste sinänsä.


Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys