2010. február 26., péntek

Adat (f)eldolgozás

Egyik ügyfelünk érdekes problémával keresett meg minket. Leegyszerűsítve: ZIP fájlokat töltenek be a rendszerükbe, de a UI valamiért többször jelenít meg bizonyos fájlokat, hiába csak egyszer lettek betöltve.

A betöltő alkalmazásnak saját adabázisa van, úgyhogy ott kezdtük a keresést. Itt minden jónak tűnt, ugyanazokat a select-eket futtatva, mint a betöltő alkalmazás, az elvárt eredmény kaptuk. Nah akkor nézzük a kódot...

Régen íródott nem igazán refaktorált alkalmazásról lévén szó, amiben egy pár ezer soros "fő-fő" Servlet-hez jutottunk, ami implementálta az üzleti logikát. Az alkalmazás az adatbázisból lekérdezett adatokat rendezi pl. név, ill. feldolgozás kezdete, feldolgozás vége szerint.

Az egyik kollégát idézve: "ÁÁÁ a rendezéssel nem lehet gond, azt nem lehet elrontani..." Azért csak megnéztük a rendező kódot, és bizony itt volt a hiba. Valószínűleg idő hiányában a ZIP fájlok adatait egy String listában tárolták a fejlesztők a következő formátumban:
[név]*[feldolgozás_kezdete]*[feldolgozás_vége]*....

Egy ilyen listát rendezni nem olyan egyszerű. Praktikusabb lett volna egyszerű DTO objektumokban tárolni az adatokat, és Comparator-okat írni az egyes szempontok szerinti rendezéshez... Ehelyett kiszedték a megfelelő adatot minden egyes elemből, egy külön listában lerendeztették őket, majd egy harmadik listába a megfelelő sorrendben szúrták be az adatokat. A végső lista összeállításába csúszott hiba. A kód nem tudta lekezelni azt az esetet, amikor két Zip fájl esetén, az egyik feldolgozás_kezdete megegyezik a másik feldolgozás_végé-vel. Tanulság: A rendezést is el lehet rontani. :)

U.i: erre a részre nem találtunk sok unit tesztet a kódban, pedig azok segíthetettek volna elkerülni ezt a problémát (is).

F.B.

Nincsenek megjegyzések:

Megjegyzés küldése