poniedziałek, stycznia 11, 2010

Pythonowe formatowanie kodu ma jednak swoje zalety ;-)

W moim wpisie o tym czego wg. mnie się warto uczyć, a czego nie, krytykowałem Pythona za brzydki [wg. mnie] zwyczaj zaznaczania bloków kodu przez formatowanie.

W piątek znalazłem w kodzie błąd, który spowodowany był tym, że w Java'ie tak nie jest ;-)
Kod szedł mniej więcej tak:
for(SomeType rec: types) {
if("SomeText".equalsIgnoreCase(rec.getName()))
someTextTypeForIhread.put(Thread.currentThread(), rec.getTypeNo());
return rec.getTypeNo();
}

Nad tym kodem był warunek sprawdzający czy w mapie jest już może wartość, a jeżeli była to używana była wartość z mapy [OK, w oryginale typy były inne, klucz inny i inny tekst, a same rzeczy z kolekcji types pobierane były z bazy, ale kod mniej więcej taki sam].
Niestety ten kod działał źle ;-)
Bo intencja była taka by w razie rec.getName() byłoby równe "SomeText" to powinna wypełnić się mapa i zwrócić wartość z reg.getTypeNo().... dzięki temu w razie kolejnego wykonania [pewnego] wartość byłaby podana od razu z cache [a przypominam, że elementy types pobierane były z bazy i zabierało to dość dużo czasu] jednak w rzeczywistości zawsze zwracana była wartość rec.getTypeNo() dla pierwszego elementu w kolekcji types :-)

Co najgorsze sam zrobiłem ten błąd [dodając fragment związany z mapą] bo dałem się "oszukać" komuś piszącemu przede mną i głupio założyłem, że ponieważ kod jest sformatowany tak:
for(SomeType rec: types) {
if("SomeText".equalsIgnoreCase(rec.getName()))
return rec.getTypeNo();
}

To znaczy, że jest on kodem, który powinien wyglądać tak:
for(SomeType rec: types) {
if("SomeText".equalsIgnoreCase(rec.getName())) {
return rec.getTypeNo();
}
}


Czyli choć sam uważam, że Pythona nie opłaca się uczyć by zastąpić nim kodowanie w Java'ie czy C++, to jednak ma swoje zalety [i to prócz szybkości :-) bo w obliczeniach numerycznych bywa szybszy od C#, którego mimo wszystko polecam do nauki "na przyszłość"]


Podobne postybeta
Nie inicjalizuj rozmiaru kolekcji...
Sztuczki tropiciela błędów, part 2 ;-)
Android - nawet platofrma potrafi przeciwko Tobie knuć ;-)
Niecne wykorzystanie refleksji... czyli jak poszukać tekstu w drzewie obiektów? ;-)
Lenistwo w działaniu, "piklujemy" Androida ;-)