2009. március 7., szombat

RTFM

Történt, hogy egy saját Stream implementációt kellett készítenem. A Stream egy absztrakt osztály, ebből ugye leszármazunk, a Visual Studioban nyomunk egy CTRL+.-ot (akiket a szokásosnál lényegesen több ujjal áldott meg a Jóisten, azok ALT+SHIFT+F10-et), ENTER, és a Studio legenerálja nekünk a megvalósítandó metódusok vázát.
Az absztakt Stream elég sok ilyet tartalmaz, a legtöbbje elég triviális (pl. bool CanRead, CanWrite, CanSeek... tulajdonságok), ezeket csípőből implementálhatjuk, hamar le fog jönni, hogy a megvalósításunk igazi "lelke" a Read metódus lesz (meg a Write, de mivel én egy read-only stream implementációt csináltam, ezzel nem volt sok gond, "throw new NotSupportedException("The stream is read only.");", azt' szevasz).

A legenerált kód így néz ki:

public override int Read(byte[] buffer, int offset, int count)
{
    throw new NotImplementedException();
}
Ebből már magában elég jól lejön mit kell ebben a metódusban csinálni: kapunk egy buffert - egy byte tömböt -, abba kell belehányni count darab byte-ot, offset eltolással.
Meg is tettem, jöhetett a teszt: puff, OutOfMemoryException. Na hát ez szép. Debugger balról be, nézzük mi történik. Hát hívódik a Read, mint az őrült, sosincs vége, szépen eszi föl a memóriát. Ajaj.

No, egyet szerencsére tudtam: As a software developer, you are your own worst enemy. The sooner you realize that, the better off you'll be.
Vegyünk vissza gyorsan az arcból, és nézzük mit mond erről a Biblia: "When overridden in a derived class, reads a sequence of bytes from the current stream and advances the position within the stream by the number of bytes read." - nos, hát igen.
Ez nem derült ki a metódus-szignatúrából, ezt vagy tudjuk, vagy azt hisszük, hogy tudjuk.

"Akinek nincs esze, legyen notesze!" - mondotta volt középiskolai osztályfőnököm az elnézést tanár úr, elfelejtettem típusú kifogásokra. És milyen igaz, annyival toldanám meg: akinek nincs esze, olvassa el a dokumentációt.

1 megjegyzés:

Gergő írta...

Ezt én is csípőből beszívtam volna. Absztak osztályban propertyt ugyanis nem kell implementálni by default :))

Egyébként meg azzal a stream pointerrel aztán nagyon lehet játszai: egyszer annak a segítségével oldottam meg, hogy egy marha nagy állományt két vagy több processz párhuzamosan tudjon letölteni.

Megjegyzés küldése