Sa nu-ti faci array cioplit

Deci imi scapa ceva, deci. Deci a facut colegu’ bascalie de Silviu “Traffic Sign Recognition” Ardelean, da’ se pare ca de fapt Silviu chiar avea dreptate propovaduind lumii tehnologia pe care tocmai o inventase. Deci sa va explic.

MVP Marius Bancila, care parea cel mai breaz dintre codexperti, a pus pe blogul dinsului o aplicatie pentru torturat oamenii cu dicromatism. Implementarea acestei aplicatii presupunea manipularea unui array bidimensional. Privind in sursele puse la dispozitie cu generozitate, observam urmatoarea abominatie:

int** m_pCells;
void Create()
{
   m_pCells = new int*[m_nSize];
   for(int i = 0; i< m_nSize; ++i)
      m_pCells[i] = new int[m_nSize];
}

Acu’ vreo doua zile imi zicea un prieten de un program scris de fizicieni care aproape si-a dublat footprintu’ cind a fost mutat pe 64 de biti din cauza ca autorii aveau genul asta de relatie contra naturii cu array-urile de pointeri. Azi vad ca problema nu e rezervata exclusiv refugiatilor din Fortran si juniorilor care aloca vertecsi cu new float[3], ci isi intinde tentaculele pina la virfurile comunitatilor de experti in C++ (auto-proclamate, ce-i drept). Acum nu ca in cazul de fata ar conta overhead-ul sau muile murmurate in barba de procesor la vederea festivalului de pointer chasing, da’ chiar imi scapa de ce ai scrie atita cod in plus, ca la sfirsit sa mearga si prost.

Avind in vedere ca tehnologia aia de tinut array-uri multidimensionale in vectori nu este atit de cunoscuta pe cit credeam, zic ca merita un loc in panoplia evidentului, adica sa fie transformata intr-un “design pattern” d-ala. Sa stea acolo la loc de cinste cu variabila globala, instructiunea switch si alte astfel de geme indispensabile inginerilor de pe tot globu’ de pamint. Ce zici bre Silviule, te bagi sa-i dai un nume in engleza?

Si daca tot am ajuns la subiectul patterns si best practices, sa observam si aceasta tehnica de programare defensiva:

CBrush* CColorMap::GetBrush(int key) const
{
   if(key < 0 || key > (int)m_brushes.size())
      throw std::exception("Invalid color key", key);

   return m_brushes[key];
}

Pe linga abila inlocuire a lui assert() cu throw, codul de mai sus demonstreaza si abila utilizare a unui constructor non-standard pentru std::exception care nu face tocmai ce se asteapta Marius sa faca. Din nefericire autorul nu s-a sinchisit sa stea si la primire, deci problema nu apuca sa se si manifeste, iar codul e chiar mai eficient in varianta asta obfuscata. Se pare ca pina la urma puroiul ala de Coelho avea dreptate.

Advertisements

5 Responses to “Sa nu-ti faci array cioplit”

  1. Pana acum, inteleg ca tintele voastre predilecte sunt oamenii care v-au “ejectat” de pe codexpert.ro.
    Sa nu-mi fie cu suparare, dar mie asta imi aduce aminte de copilarie. In copilarie, exista copii care nu pot adapta la gradinita sau intr-un grup la scara blocului.
    Atunci, acei copii isi fac propria “lume” pentru a se simti in largul lor. In “lumea” lor ei sunt zmei iar unele jucari sunt “dusmani” lor.

  2. Aoleo, inca unu’ care se crede Francoise Dolto? Ce-aveti fratilor de trebuie sa faceti toti pe Capitanu’ Evident? Da, avem o problema cu codexpertii. Da, e foarte usor de gasit tinte printre ei. Nu, nu te-ai prins si nu vreau sa-ti explic.

    Inainte sa debitezi cacaturi despre adaptarea in mediul prescolar, informeaza-te despre geneza slavitei comunitati de experti. Sau mai bine nu te documenta despre nimic si lasa-ne in lumea noastra imaginara. Daca nu-ti place sau nu intelegi bascalia facuta de noi, esti liber sa nu ne citesti. Daca vroiam sa aud paralele imbecile si mizerii despre teoria conflictului ma duceam la o pizda cu BMW si masterat in interpretarea viselor, nu scriam pe un blog despre pointeri si mineri.

  3. Unu, psihanaliza ta se aplica perfect si pe “Sly”! Eu zic sa te duci pe la el ca sa va luptati cu i-urile. Bunaoara, pluralul de la jucarie este jucarii, iar pluralul de la dusman este intr-adevar dusmani, dar in cazul de fata fiind articulat se scrie cu doi de i.

  4. pai pula, si tu ai un hater pe acest blog.

    nu-i mai schimba nick-ul.

    fair-play, manca-mi-ai flocii

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s

%d bloggers like this: