Dziś w pracy moim oczom ukazała się klasa na 30k linijek. W jednym pliku.
Jeszcze jestem w szoku :-D
A jakie Wy mieliście WTF?
Ciekawe definicje TRUE i FALSE dla C (szkoda że się sypią przez priorytet operatorów):
#define TRUE '/'/'/'
#define FALSE '-'-'-'
Kilka dni się zastanawiałem jak to działa.
ja tam <ort>zadko </ort>mam WTF bo jak siedze w robocie to ostatnia rzecza jaka mi sie wtedy chce jest patrzenie w kod :P
781 osobnych zapytan do bazy danych, by wyswietlic naglowek z informacjami klienta i 10 jego ostatnich zamowien... i sie zastanawiaja, czemu strona laduje sie pol minuty :|
Cos podobnego to pare milionow iteracji w petli w aplikacji na serwerze by przetworzyc dane z bazy danych (ktore wpierw pobierane byly prostym selectem) i wyswietlic... 10 wierszy (trwalo to do polgodziny). No ale coz zrobic, ze niektorzy tak programuja :|
Kod COBOL przeniesiony na Javę z zachowaniem sekcji, paragrafów i zdań. Oznaczało to m.n. operację otwórz-zapisz-zamknij na pliku dla każdego rekordu pobieranego z DB. Każdy rekord był pobierany w osobnym zapytaniu. Codziennie trzeba przetworzyć około 3 mln rekordów. W oryginalnym środowisku program działał około 20 minut. Po przeniesieniu na około stu krotnie mocniejszą maszynę program działał około 3 godzin.
Obecnie przepisuję go od nowa przy czym muszę zachować API. Zatem po przetworzeniu generuję grupy COBOLowo-LINCowe. hehehe
COBOL? Współczuję
manfredek:
ujmij to w nawiasy i bedzie dzialac.
donkey7 napisał(a)
manfredek:
ujmij to w nawiasy i bedzie dzialac.
Oj wiem, ale nie o to chodzi, tylko o to, że te definicje dziwnie wyglądają
Manfredek:
Tak z ciekawości, jak to działa, bo jakoś nie potrafię do tego dojść :O
Ciekawie wygladajacy define to np. taki ;)
#define class class __decl(dllexport)
sprzedamsanki napisał(a)
Manfredek:
Tak z ciekawości, jak to działa, bo jakoś nie potrafię do tego dojść :O
TRUE to dzielenie kodu ASCII / przez ten kod ASCII, FALSE to odejmowanie kodu ASCII znaku - od tego kodu. Czyli 1 i 0. Aha - pisz manfredek (lub, lepiej, manfred).
@up: Zdaje się że nie można zrobić makra o nazwie słowa kluczowego.
@up: mozna, mozna, choc moze nie wszystkie kompilatory puszczaja. Ale w visualu dziala.
manfredek napisał(a)
@up: Zdaje się że nie można zrobić makra o nazwie słowa kluczowego.
Ty chyba sobie jaja robisz - rozwijanie makr robi preprocesor, na tym etapie kompilacji słowa kluczowe języka nie istnieją.
po porstu - http://thedailywtf.com/Default.aspx
manfredek napisał(a)
Ciekawe definicje TRUE i FALSE dla C (szkoda że się sypią przez priorytet operatorów):
#define TRUE '/'/'/'
#define FALSE '-'-'-'
Kilka dni się zastanawiałem jak to działa.
Ale Ty to niby w pracy widziałeś? :) To jest popularna sztuczka na zawodach typu 'napisz kod, który sprawi kompilatorowi (preprockowi i reszcie) najwięcej trudności' czytaj - parser będzie miał kłopoty z odszyfrowaniem intencji. Jeśli ktoś używa tego w kodzie produkcyjnym, to chyba musi znaleźć sobie inną formę pracy ;)
auto(ka)r napisał(a)
parser będzie miał kłopoty z odszyfrowaniem intencji.
a co w tym jest trudnego? zapis w kodach ascii:
#define TRUE 47 / 47
#define FALSE 45 - 45
Dzisiaj doznałem jeszcze większego WTF niż poprzednio. Kod który miał przetwarzać elementy z listy a następnie je usuwać:
int size = list.size();
for(int i = 0; i < size; i++) {
Response r = null;
try {
r = list.get(i);
} catch(OutOfBoundException e) {
break;
}
doSth(r);
list.remove(r);
}
Bug powodował losowe timeouty po stronie klienta. Ja w tym kodzie widze conajmnie 4 zjeby, może ktoś znajdzie więcej :D
@up: hehe niezłe. Najlepsza zjeba to dodanie "try..catch break" :D :D :D, przypomina wbijanie młotkiem przedmiotu do za małego pojemnika.
W ogóle genialne, mistrzostwo.
auto(ka)r napisał(a)
Ale Ty to niby w pracy widziałeś? :) To jest popularna sztuczka na zawodach typu 'napisz kod, który sprawi kompilatorowi (preprockowi i reszcie) najwięcej trudności' czytaj - parser będzie miał kłopoty z odszyfrowaniem intencji. Jeśli ktoś używa tego w kodzie produkcyjnym, to chyba musi znaleźć sobie inną formę pracy ;)
Nie. W tym konkursie chodzi o to aby człowiek miał trudności, a nie parser. Kod będzie poprawny składniowo - parser przeprasuje, nie będzie poprawny to nie przeprasuje. Parser nie bada intencji, czasy inteligentnych kompilatorów dopiero nadejdą.
public void dodajKlucze()
{
if (listaKluczy == null)
listaKluczy = new Hashtable<String, String>();
listaKluczy.put("main", "main");
listaKluczy.put("integer", "integer");
listaKluczy.put("float", "float");
listaKluczy.put("boolean", "boolean");
listaKluczy.put("string", "string");
listaKluczy.put("if", "if");
listaKluczy.put("do", "do");
listaKluczy.put("block", "block");
listaKluczy.put("print", "print");
listaKluczy.put("read", "read");
listaKluczy.put("var", "var");
listaKluczy.put("true", "true");
listaKluczy.put("false", "false");
}
public void dodajInneOp()
{
if (listaInneOp == null)
listaInneOp = new Hashtable<String, String>();
listaInneOp.put("(", "(");
listaInneOp.put(")", ")");
listaInneOp.put("{", "{");
listaInneOp.put("}", "}");
listaInneOp.put(";", ";");
listaInneOp.put(":", ":");
listaInneOp.put(",", ",");
listaInneOp.put("=", "=");
}
public void dodajOperatory()
{
if (listaRELOP == null)
listaRELOP = new Hashtable<String, String>();
listaRELOP.put(">", ">");
listaRELOP.put("<", "<");
listaRELOP.put(">=", ">=");
listaRELOP.put("<=", "<=");
listaRELOP.put("==", "==");
listaRELOP.put("!=", "!=");
if (listaADDOP == null)
listaADDOP = new Hashtable<String, String>();
listaADDOP.put("+", "+");
listaADDOP.put("-", "-");
listaADDOP.put("or", "or");
if (listaMULTOP == null)
listaMULTOP = new Hashtable<String, String>();
listaMULTOP.put("*", "*");
listaMULTOP.put("/", "/");
listaMULTOP.put("and", "and");
}
Pewien nauczyciel programowania z "prof." przed nazwiskiem takie cuś w C naskrobał jako program wzorcowy do naśladowania.
char *dspIP( int ip1, int ip2, int ip3, int ip4 ) /* display IP addresss */
{
static char i_IP[50];
sprintf( i_IP, "%u.%u.%u.%u",
ip1 < 0 ? (unsigned) ip1 + 256 : ip1,
ip2 < 0 ? (unsigned) ip2 + 256 : ip2,
ip3 < 0 ? (unsigned) ip3 + 256 : ip3,
ip4 < 0 ? (unsigned) ip4 + 256 : ip4 );
return i_IP;
}
// jedyne użycie dspIP:
printf("[-] My host id: 0%X, as an IP address: %s\n", v_hid,
dspIP( v_ip1, v_ip2, v_ip3, v_ip4 ) );
//...
printf(" - IP address: %s\n", dspIP(sock->sa_data[2], sock->sa_data[3],
sock->sa_data[4], sock->sa_data[5] ) );
Ten fragment nie jest wielkim WTF, ale cały kod wyglądający w ten sposób już tak.
http://pastebin.4programmers.net/257 Gdzie jest main() ? :>
rozbił sobie na 3 linijki :P
main( argc,argv )
int argc;
char **argv;
:D
Ja osobiście doznałem szoku (szukałem wtedy tutoriala do directX - a) kiedy zobaczyłem spory kod (linijek nie podam bo...) napisany cały prawie że w JeDnEj LiniI 0.o. A właściwie to (kompilator przecież nie da rady ^^) z "enterami" wstawionymi w zupełnie losowych miejscach, bez żadnej konwencji, byle gdzie, no po prostu WTF. Uwierzcie, gdybyście mieli go poprawić, albo znaleźć brakujący nawias...
...Dlatego właśnie należy programy pisać czytelnie :)
@msm ale jaki w tym problem widzisz? Chocby Code::Blocks i magiczne "source code formatter" które przeformatuje ci cały kod tak jak ci się podoba + bracket matching i po problemie ;)
Shalom napisał(a)
rozbił sobie na 3 linijki :P
main( argc,argv )
int argc;
char **argv;
:D
Tu nie ma nic śmiesznego ani WTF. Normalny kod, prawidłowy zapis.
Ech, niektórzy młodzi programiści zapomnieli, że przed standaryzacją ANSI/ISO C miało inną składnię.
To jest po prostu bardzo stary kod i tyle.
gcc już tego nie przełknie :)
Jaki widzę problem? Mówiłem że szukałem tutoriala, a to coś było jako txt nas stronie internetowej. Ktoś kto to tam wrzucił powinien... <westchnięcie cierpiącego na brak weny autora> zresztą nieważne.
Edit: Po prostu zawsze miałem wrażenie że tutoriale powinny być czytelne :]
Edit 2: Tak w ogóle Shalom ciekawy obrazek, ciekawy jestem tylko czy wiesz skąd on pochodzi ^^
to jest Mangekyō Sharingan Kakashiego.
widze że więcej fanów Naruto! ;)
Dobra teraz dwa WTF z dzisiaj.
Słowo wstępu;
Generalnie to co pokażę to kod, który został przemigrowany automatycznie z COBOLa i LINCa na JEE. W tych językach taka konstrukcja ma sens, ale w Javie nie za koniecznie:
while (errcd.fetchFrom()) {
if (true) {
break;
}
}
if (1 == 1) {
return (0);
}
return 0;
Najpierw:
Map map = new HashMap();
// teraz inicjalizacja mapy, wywolania put(key, value), wlozone 10 elementow
// i na koniec kwiatek
map.put("size", new Integer(10));
I pozniej w jakiejs klasie utility:
public static int getSize(Map map) {
return ((Integer) map.get("size")).intValue();
}
Kod pisany z pamieci, nie przeklejony, ale wygladalo to mniej wiecej wlasnie tak. :-O