Daily WTF or How I learned to love humor in code

poruka: 35
|
čitano: 20.410
|
moderatori: Lazarus Long, XXX-Man, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
16 godina
neaktivan
offline
Daily WTF or How I learned to love humor in code

Vec dugo nisam naletio na nista, a evo danas sam morao sam sloziti spaghetti code...

 

Sve sto ovaj kupus radi je:
- zovi checkIDRequest
- ako propadne, cekaj sekundu i probaj opet
- ako ponovno propadne, zavrsi process instantno

 

       try {

         checkIDRequests();

       } catch (IOException e) {

         LOGGER.error("IOException while talking to clients: {}. Trying again in 1 second...", e.getMessage(), e);

         try {

           Thread.sleep(1000);

         } catch (InterruptedException e1) {

           // Nothing

         }

         try {

           checkIDRequests();

         } catch (IOException e1) {

           LOGGER.error("IOException on retry: {}. Terminating service!", e.getMessage(), e);

           try {

             stop();

             return;

           } catch (StopException e1) {

             throw new RuntimeException(e1);

           }

         }

       }

 

 

Pa sta nitko ne zna sloziti neku normalniju sintaksu za error handling bez AOP-a? Ovo je jezivo!!

 

BTW, nek me netko dovede u red, jer sam upravo slozio istu funkcionalnost uz pomoc labele i goto-a, i ima samo 10 linija.... cisto za zabavu ali sad me tjera da ostavim...

Set as I am in my ways and my arrogance, burden of proof tossed upon non-believers... You were my witness, my eyes, my evidence, Judith Marie, unconditional one...
Poruka je uređivana zadnji put čet 16.2.2012 20:48 (Deus ex machina).
 
0 0 hvala 0
14 godina
neaktivan
offline
Re: Daily WTF or How I learned to love humor in co

Uvlačenje linija i komentari iznad blokova je jedino što me nekad spasi totalne torture. Evo baš danas mi zatrebao ole automation...

 

// postoji li već otvorena instanca ms worda?
try {
    my_word = OleVariant::GetActiveObject("word.application");
}
// ako nema....
catch(...) {
    // kreiraj novu instancu...
    try {
       my_word = Variant::CreateObject("word.application");
    }
    // ako neće da kreira novu instancu...
    catch(...) {
       Application->MessageBox(L"Unable to obtain automation object", L"Error", MB_OK | MB_ICONERROR);
       // provjeri je li uopće instaliran ms word
       try {
          bool instaliran = MSWordInstalled();
          if (!instaliran) {
             Application->MessageBox(L"No MS Word? No report!", L"Error", MB_OK | MB_ICONERROR);
          }
       }
       // ako provjera ne prolazi....
       catch(...) {
          Application->MessageBox(L"I give up...", L"Error", MB_OK | MB_ICONERROR);
       }
    }
}

 

Ovaj dio coda treba napraviti sasvim jednostavnu stvar - preuzeti kontrolu nad postojećim word ole automation objektom ili kreirati novi ukoliko nema već postojećih. Naizgled jednostavan zadatak ali....

 

Nikako da nađem vremena no već sam se zakleo da ću ovakve gromade koji su uglavnom copy-paste sve strpati u jedan dll i samo exporatati funkcije koje mi vraćaju ono što mi treba.

Poruka je uređivana zadnji put čet 16.2.2012 21:20 (TracerCPP).
17 godina
offline
Re: Daily WTF or How I learned to love humor in co
Deus ex machina kaže...

 

 

 

Pa sta nitko ne zna sloziti neku normalniju sintaksu za error handling bez AOP-a? Ovo je jezivo!!

 

BTW, nek me netko dovede u red, jer sam upravo slozio istu funkcionalnost uz pomoc labele i goto-a, i ima samo 10 linija.... cisto za zabavu ali sad me tjera da ostavim...

Ja radim tako da specifične exception-e (koji se mogu javiti samo jednom) bacim na višu razinu (u tvom slučaju StopExecution i InterruptedException), a one za koje moram ponavljati ostavim u loop-u. Tako da si mogu i definirati koliko puta mogu ponoviti (a ne da propadam u nedogled).

 

Nešto ovakvo:

 

       boolean loopMe = true;
       int howLong = 2;
       while (loopMe) {
          try {
             checkIDRequests();
             loopMe = false;
          }
          catch (IOException e) {
             LOGGER.error("IOException while talking to clients: {}. Trying again in 1 second...", e.getMessage(), e);
             if (--howLong > 0) {
                Thread.sleep(1000);
             }
             else {
                stop();
                return;
             }
          }
       }

'Genius might be the ability to say a profound thing in a simple way' Charles Bukowski
16 godina
neaktivan
offline
Re: Daily WTF or How I learned to love humor in co

Ispravi me ako grijesim, ali loopat ces dvaput cak i ako nema greske... jedini nacin da to izbjegnes je da breakas loop ako izvedba prodje. Promaknuo mi boolean...

Takodjer Logger ne smije biti prvi u exception bloku, jer ce napisati isto ako skrsis drugi put ;-)

Takodjer Thread treba svoj exception handling.

 

Vrlo brzo dodjes na slican kupus... :-(((

 

E da, zaboravio sam komentar u vezi exceptiona... teorijski, imas vise nacina na koje handleati errore, recimo Meyer tvrdi da exception uvijek moras ili baciti na visu razinu ili probati jos jednom.

Ja to rijesavam tako da vidim gdje ima smisla obraditi gresku. U ovom slucaju StopException je greska prilikom shutdowna, dakle kad releaseas sve resurse... vise manje postoji samo za obavijest, jer cak i da si leakao nesto, kad ti aplikacija ode OS ce preuzeti resurse automatski

 

 

Ma problem je u jezicima... standardni klasni OOP inicijalno ima retardirano rijesen exception handling. Dobro je zamisljen, ali u praksi ne funkcionira :-(

Cisto za probu, ako vam se da, probajte upotrijebiti neki AOP weaver, i onda handleajte exceptione u drugom aspectu... radi _savrseno_! Sa-vr-se-no!

 

AOP bi, po meni, morao biti de-facto sintakticki moguc u svakom modernom standardnom compileru.

Set as I am in my ways and my arrogance, burden of proof tossed upon non-believers... You were my witness, my eyes, my evidence, Judith Marie, unconditional one...
Poruka je uređivana zadnji put ned 19.2.2012 6:19 (Deus ex machina).
16 godina
neaktivan
offline
Daily WTF or How I learned to love humor in code

Evo noviteta, doprinos od jednog aninomnog heroja s foruma :-D

 

Problem:

generator random sekvence brojeva izbacuje jednak broj konstantno.

 

 

For i As Integer = 0 To 10

Console.WriteLine(New Random().Next(0, 10))

Next

Console.Read()

Naravno, jasno je da je sekvenca konstantna jer se seed (koji je u ovom slucaju vrijeme) nije stigao promjeniti zbog preciznosti sistemskog timera, koji je ako me sjecanje ne vara u Windowsima preciznosti 50ms - a Random generator se alocira iznova i iznova u loopu.
Cak i da se ne radi o Randomu, alokacija u loopu je nesto sto svaki programer treba izbjegavati. Tako da je rijesenje jednostavno: alocirati Random izvan loopa.
Nas neimenovani heroj ima modernije rijesenje:
For i As Integer = 0 To 10
       Console.WriteLine(New Random().Next(0, 10))
       System.Threading.Thread.Sleep(20)
     Next
     Console.Read()
Sistemski timer nije dovoljno precizan?
Odspavajmo malo :-D

 

We are the ones that will open your mind, leave the weak and the haunted behind
 
6 0 hvala 0
Nova poruka
E-mail:
Lozinka:
 
vrh stranice