Tech Life

Ilustrační obrázek

Najděte chybu: getWeekStartCal

14. 11. 2008 00:00    kategorie: Tech Life    autor: ZMe    komentářů: 12

Programátorské moudro praví, že v každé aplikaci je nějaká chyba. Ani naše aplikace nejsou výjimkou. Abychom se z našich chyb poučili, tak je zveřejňujeme, aby se nad tím mohli zamyslet i ostatní. Zkuste se schválně podívat na tenhle kus kódu, jestli tam chybu najdete (je tam, víme to).
 

V jedné naší aplikaci se zobrazují data v závislosti na vybraném kalendářním týdnu. Pro klienta však kalendářní týden nezačíná v pondělí, jak je obvyklé, ale z nějakého důvodu až ve středu. Pro potřeby aplikace bylo nutné napsat funkci, která vypočítá datum začátku kalendářního týdne (v klientském výkladu kalendářního týdne). Vypočtené datum se pak používá v SQL dotazech k určení, jaká data se mají zobrazit.

V implementaci této funkce se nachází jedna velmi záludná chyba, která zapříčinila, že v určitém období se v aplikaci nezobrazovala žádná data. Dokážete najít onu chybu?

Při počítání s datumy se rozhodně vyplatí řídit se heslem: “Dvakrát měř a jednou řež” a důkladně promyslet podmínky, za kterých výpočet bude nebo naopak nebude fungovat. Pak není problém napsat test, který ověří správnost funkce, což by mělo být samozřejmostí.

Sdílet odkaz:
tisk

Diskuze k článku

Pavel Pola, 20.11.2008 15:49

A co třeba tenhle? Ten ještě nikdo nelousknul... :-)
http://www.etnetera.cz/etn/cz/blog/tech_life/tech_life_vice_nez_stoprocentni.html

Martin, 20.11.2008 15:27

Tak šup sem s dalším kvízem :-).

PPl, 20.11.2008 13:12

Přesně tak! Tady byl zakopaný pes...

Martin, 20.11.2008 10:58

No, už jsem na to pomyslel dřív, ale moc jsem tomu nevěnoval pozornost - jde o MinimalDaysInFirstWeek? Pro správnou funkčnost aplikce je myslím nutno nastavit cal.setMinimalDaysInFirstWeek(5);. Standardně je tam 1, a když pak je třeba prvního ledna v neděli, tak to celý týden bere jako první v roce, což je ale špatně, protože středa je ještě 28.12. Aby se zajistilo, že středa v prvním týdnu bude opravdu první středou v roce, je nutné definovat onen atribut, že první týden v roce musí mít aspoň 5 dní nového roku (st, čt, pá, so, ne).

PPl, 20.11.2008 09:02

Dobrá, malá nápověda. Výsledek funkce cal.get(Calendar.WEEK_OF_YEAR) závisí na jednom konkrétním parametru, o kterém se zatím nikdo z vás nezmínil. A to byl právě celý ten kámen úrazu... :-)

Luinar, 19.11.2008 23:57

Krom toho co psali ostatni, me jeste napada, ze pokud bude nastaven cas serveru podle anglosaskych zemi, tak ty pocitaji dny tydne od nedele tj. v nedeli bude npariklad aplikace hlasit 48 tyden a v pondeli hned na to, ze je 47 tyden ...
Bohuzel v Jave nedelam takze je to jen strela od boku.
Luinar

Pavel Pola, 18.11.2008 09:35

Obávám se, že zatím nikdo nenapsal, kde je ta chyba doopravdy. Ono to v té Javě opravdu je trochu záludné. Schválně, jestli někdo napíše tu skutečnou příčinu... :-)

Martin, 17.11.2008 10:34

Pokud k jednotlivým třídám neexistují testcases (v tomto případě nějaká, co vyzkouší například všechna data následujících x let), pak se něco takového může přehlédnout, a přijde na to až někdy zákazník. Na chybu uvedenou v článku může a nemusí přijít, může to trvat v krajním případě i roky. Ne vždy dojde k takové "konstelaci" dnů na začátku roku, další rok to třeba klient zkusí v úterý, nejde mu to, zavolá na hotline, ve středu se na to podívá support, a už to "samo od sebe" jde atd...

Netvrdím, že jsem programátor, co dělá ke každé třídě testcases, někdy (většinou) to čas, který je projektu vyhrazen, nedovolí, stejně tak jako udělat kvalitní refactoring. Tohle by mě ale asi trklo hned při psaní kódu :-).

Marty, 16.11.2008 20:58

Tak me napadlo to co ostatní. Ale pokud je to opravdu ta chyba, tak me to trochu zklamalo, protože záludná mi nepřijde.
Nevím jak to funguje v Jave, ale třeba v php by toto prošlo a s výhodou to spousta lidí používá :-)

, 16.11.2008 20:42

ad martin: jo jasně, 1 - 1 = 0 a ne 52... :) ale chyba je na tom místě, co jsme mysleli oba

Martin, 16.11.2008 19:18

Pokud je první týden v roce a je zároveň pondělí nebo úterý, ta vrátíte údaj o tom že je týden "0" aktuálního roku. Správně byste měli vrátit poslední týden předchozího roku a předchozí rok.

, 16.11.2008 18:35

v pondělí 1.1.2008 jste v kalendáři měli 52. týden roku 2008? (příklad) :-)

Přidat příspěvek

 

Kontakt pro média


Máte zájem o další informace, odborný článek či přednášku na konferenci? Kontaktujte nás prosím na pr@etnetera.cz.

RSS - Tech life


RSS kanál Tech Life Blogu

Offlineblog

Offlineblog

Ljama


Komix z prostředí imaginární firmy.

ljama

Ještě jste ho nečetli? Tak tudy ...

 
Doporučujeme: Nabídka práce, volná pracovní místa - pracovní portál SPRÁVNÝKROK.CZ