Simpleton Pattern

Cu siguranta ati remarcat ca minerul si-a cam suspendat activitatea tutorialistica in ultimul timp. Cind firma aia care n-a auzit de Google l-a luat la sinul ei dupa despartirea de multinationala si l-a reprofilat pe Java, Silviu a fost cuprins de o bucurie de copil mic cu mintea goala. Vazind ca Normele de Exploatare mentioneaza prezenta unui garbage collector, s-a simtit obligat sa produca cit mai mult gunoi in timpul programului, astfel incit foarte rar ii mai raminea timp de cite un tweet extracuricular despre psihologie si Einstein. Spre fericirea noastra insa, dupa aproape un an de truda a avut pentru prima data nevoie sa declare o variabila globala si vechile instincte de pedagog s-au reaprins in el.

Dupa cum stie toata lumea si a aflat si Silviu saptamina asta, in Java nu ai voie cu variabile globale, deoarece incalca Principiul Celor 50 De Linii de Cod. Acest principiu, formulat de niste muisti ale caror nume mi-e lene sa le caut acum pe Wikipedia cind s-au strins nu stiu unde cacat sa faca ei limbajul viitorului care in 3 ani sa devina unicul limbaj folosit in intreaga lume, suna asa:

Se va numi Java acel limbaj obtinut pornind de la C++ si eliminind feature-uri pina cind orice program imaginabil necesita minim 50 de linii de cod.

In constructia dogmaticii lor, muistii s-au inspirat viguros de la unii care incercasera si ei sa impuna o limba unica in Europa cu vreo 50 de ani inainte si pina la urma au avut cam tot atita succes. In fine, cert e ca pentru a cirpi gaurile din Java, s-au gasit alti 4 muisti care au intemeiat o noua dogmatica: design patterns. Pentru a contrabalansa neonazismul lui Gosling (na, ca l-am cautat pina la urma), astia 4 muisti s-au inspirat din comunism, deci muie Ovidiu Cucu.

Pardon, divaghez. Ce voiam sa spun este ca design patterns sint diverse metode de a implementa banalitati ca variabile globale, instructiunea for, instructiunea switch etc. in Java, cu clase. Si cum for si switch sint concepte avansate pentru unii, orice retardat care cedeaza impulsului de a scrie un articol pe tema intelligent design in programare incepe cu singletonul, adica variabila globala.

Retardarea asta insa are grade. Exista retardati care pot fi convinsi sa nu mai incerce sa bage patratul prin cerc, retardati care musca din patrat in timp ce se pisa pe cerc si jos de tot, sub toti ceilalti retardati, exista Silviu Ardelean. In contextul de fata, Silviu Ardelean poate fi recunoscut cu usurinta, pentru ca va incerca sa aplice acest hack necesar pentru a avea variabile globale in Java la C++, care deja are variabile globale.

Articolul nu dezamageste. Lasind la o parte ilaritatea care survine cind ne uitam cum se framinta ortacul sa fie thread-safe si in pas cu C++11, la o trecere sumara prin articol sintem izbiti de o schimbare radicala in exprimare, pe undeva pe la mijloc, cind incep partile “dificile”. De la “that’s way I’m trying to figure a few implementations, some base on C++ 11 features” si “pointer final deleting problem disappears“, trecem brusc la “it might just happen that the OS scheduler unwittingly interrupts the first thread at this point“. Poftim? Unwittingly, pe bune? Probabilitatea ca Silviu sa foloseasca cu de la sine putere cuvintul “unwittingly” este la fel de mare ca in cazul ala din trecut cu “this is in contrast with“, deci ma simt obligat moral sa-l intreb pe Google ce parere are despre fraza aia. Si ce sa vezi, primul hit contine exact descoperirile originale ale minerului, cu tot cu numerotarea aia a liniilor-problema: de fapt e un citat din cartea lui Alexandrescu.

Mai jos observam ceva actiune SF cu std::call_once si std::lock_guard. De unde cacat stie Silviu despre std::call_once, va intrebati? Pai ia cautati codul ala exact asa cum e pe Google, si veti afla: de pe Stack Overflow. Daca va uitati putin mai atent, cum a facut-o un suflet rau ce a si comentat la miner pe blog, va puteti chiar intreba de ce cacat mai ai lock-ul ala acolo, daca faci call_once. Pai simplu: pe Stack Overflow zice unu’ sa folosesti call_once, da’ nu arata exact codul rezultat, asa ca minerul a pus pur si simplu cu copy/paste peste codul original, deoarece habar n-are ce fac cacaturile alea. Totul e sa dea articol++. A, scuze, ++articol, ca asa e optim.

Ma rog, articolul are acea calitate remarcabila de a-ti oferi cite o noua timpenie amuzanta de fiecare data cind il recitesti. N-o sa va stric placerea, va las sa va bucurati in tihna de acest mic miracol al programarii. Vreau doar sa-l intreb pe Silviu: ba, tu esti chiar atit de prost incit nu-ti dai seama cind e cazul sa te opresti din copy/paste?

PS: daca zice cineva ceva de avantajele singletonilor fata de variabile globale pentru unit testing si mock objects si pula mea, ia ban direct. De asemenea se confera ban pentru infierarea singletonului ca anti-pattern si sustinerea celorlalte pattern-uri.

 

Tags: , , , , , , , , , , , ,

42 Responses to “Simpleton Pattern”

  1. ohwow Says:

    Hmm,

    N-am rabdare sa-i citesc articolul, da’ io-l stiu pe om si va cred. Dar are deja citari.

    https://twitter.com/Code_Analysis/status/211144889210122241

    https://twitter.com/gpakosz/status/211157113551060992
    https://twitter.com/gpakosz/status/211202065291165698

  2. Mihnea Says:

    Am observat mai demult ca minerul e implicat intr-o orgie de mare angajament cu vreo doi handicapati care se preocupa de rularea Tool-urilor Automate™ pentru a determina daca MFC este suficient de OOP (Code_Analysis si CppDepend parca ii cheama). Tot fac schimb de fluide si de tweet-uri, validindu-si unul altuia imaginea de mare programator (ma rog, nu ca ar mai fi nevoie, dupa ce Einstein i-a zis personal ortacului ca are dreptate). Muie internet.

  3. Silviu Says:

    Ti-ar prinde bine un curs de cautare http://alturl.com/h4z7o si vezi pagina 146. Rusul (http://www.rsdn.ru/forum/cpp/1135476.1.aspx) a copiat tot din cartea lu’ Alexandrescu.

  4. Mihnea Says:

    Tie ti-ar trebui un curs de citire. Se facea in clasa a doua, cind tu erai ocupat cu pescuitul. Rusul n-a copiat, a citat, dupa cum putem deduce din faptul ca a scris intii care e sursa, nu a dat direct paste in mijlocul unui text “propriu”. De asemenea, n-am zis ca rusul e autorul, am zis ca ala e primul hit cind cauti sursa pe care ai plagiat-o.

  5. Silviu Says:

    Se pare ca tu inca ai probleme de citire. Cartea lu’ Alexandrescu apare la referinte din momentul publicarii articolului.
    Dupa mintea ta, daca altu’ a mai scris despre call_once asta inseamna ca e plagiat? De parca ala ar fi inventat-o.

    PS. NU suntem la campionatul de singleton-uri dar daca ai vreo propunere buna ti-o aprob la comments.

  6. Mihnea Says:

    Tu chiar esti incapabil sa intelegi, sau doar te prefaci, ca sa nu accepti ca esti un plagiator? Cind vrei sa citezi, spui ca citezi. Demarchezi clar partea din text care nu-ti apartine: “in cartea Modern C++ Design, Alexandrescu spune: bla bla bla”. Daca scoti prima parte si lasi doar “bla bla bla” in mijlocul unei “contributii originale”, se cheama plagiat. Cineva care nu a citit cartea va crede ca tu cu mintea ta ai formulat textul ala.

    Bine, daca te-ai apuca sa faci chestia asta, ar trebui sa pui tot articolul intre ghilimele si sa lasi afara doar puseurile de analfabetism cu “pointer final deleting problem disappears”.

    Nu e plagiat din cauza ca au mai scris si altii despre call_once. E plagiat cind iei cu copy/paste si nu spui ce ai luat. E plagiat amuzant cind iei cu copy/paste si iei prost, pentru ca nu intelegi, asa cum am aratat mai sus. Si oricum, dupa cum te-am mai intrebat de 100 de ori dar eviti sa raspunzi: din moment ce tu nu contribui cu nimic, ci doar dai copy/paste din ce au spus altii, de ce scrii? Simti tu nevoia covirsitoare sa-ti implinesti destinul de papagal?

  7. Silviu Says:

    Hai sa-ti spun un mic secret… Initial am vrut sa public doar versiunile 3 si 4 din articol. Ca un specialist in cautare ce esti, poti sa-mi arati de unde am copiat?

    Daca as fi publicat doar partile acelea, nu crezi ca ar fi fost cam sec si “badaran” s-o dau direct pe smart-pointers, mutex si call_once? Tu chiar crezi ca toti sunt Mihnea? Am preferat sa fac o trecere de la cel mai banal la o implementare completa.

    Poate ar fi bine sa fi mai temperat… Chiar trebuie sa-ti amintesc ca te-ai grabit sa urlii cu copiuta (http://alturl.com/qpmpt) si te-ai prins peste luni de zile cand ti-am dat niste hinturi:
    “Oh wait, I see what you’re trying to do. You’re trying to say that you knew all along what the prototype of swprintf() was, but that you were actually trying to prevent people from lying about the size of the buffer”?

  8. Adrian Says:

    N-am putut sa ma abtin de a ma busi rasul odata ce am vazut:
    FORBIDDEN
    You don’t have permission to access /2012/06/05/few-singleton-approaches/ on this server.
    Evident, daca scapi de referer header, poti sa vezi pagina foarte bine.

  9. Mihnea Says:

    Silviule, am aratat mai sus de unde ai copiat implementarile “3 si 4”: de pe stackoverflow. Din nou trebuie sa-ti recomand sa inveti sa citesti. Am aratat si de ce ai timpenia aia cu lock_guard in call_once: pentru ca pe stackoverflow era doar cu lock_guard si a venit cineva sa zica de call_once, iar tu le-ai combinat cu simpletonul, ca habar n-ai ce fac. Insisti ca nu ai copiat de acolo?

    Oricum, justificarea ta pentru plagiat este ca ai vrut sa inteleaga si aia mai incepatori ca tine? In primul rind, nu exista asa ceva. In al doilea rind, incepatorii intelegeau si daca spuneai ca citezi cind citezi. Poate intelegeau si ca tu te pricepi doar la copy/paste, si presupun ca asta te deranjeaza de fapt. Apropo, mai stii cind ai facut copy/paste-ul ala cu #define private public si ai reinventat regulile derivarii in C++?

    N-o mai da la intors cu swprintf() ala, ca ai frecat codul pe furis pina cind a ajuns intr-o forma care macar se compileaza, tot multumita noua. Vad ca intreci orice limita a nesimtirii afirmind ca mi-ai dat tu “hint-uri”, asa ca-ti recomand sa sugi pula.

    Adrian: si in codexpertia e la fel, au atit de multa incredere in ce scriu pe-acolo incit trebuie sa recurga la d-astea ca sa se simta protejati de realitate. Pentru link-urile spre codexpert am pus un script care sa traga cu noreferer, pentru birlogul minerului mi-a fost lene. Vezi aici saga completa.

  10. Silviu Says:

    La 14:47 ai intrat din nou cu zend2.com si te-ai apucat sa cauti.
    Daca era copiuta… de mult nu ezitai sa repeti isprava cu copiuta mai sus mentionata.

    Imi pare rau ca pe data de 6 iulie cand mi-ai facut primul review nu ai remarcat faza cu call_once si mutex. A trebuit sa vina Boris si sa o observe…
    Stii, dupa razboi multi viteji se arata si de pe margine e usor sa urmaresti meciul. Nici cand dezbateai
    FindFirstFile() nu ai avut curaj sa pui o linie de cod.
    Stai linistit. Nu suntem la campionat.

    PS1. Astept versiunea ta de singleton care nu seamana cu nimic ce exista in momentul de fata.
    PS2. Scuza-ma pentru deranj. Speram sa putem avea o discutie civilizata.

  11. Adrian Says:

    Mihnea: cunosc saga mentionata, am RSS pe standupprogramming, deci sunt la curent cu toate posturile. Trebuie sa recunosc, prostia poate sa fie foarte amuzanta cateodata (si restul timpului foarte enervanta, mai ales cand trebuie sa lucrezi pe un cod mostenit de la anumite persoane *wink* *wink*)

  12. Mihnea Says:

    La 14:47 am intrat sa vad care cacat sint versiunile 3 si 4, crezind ca mi-a scapat vreo bucata de cod original. N-am inteles cu isprava si copiuta. Deci tu zici ca n-ai copiat codul ala de pe stackoverflow?

    Ce 6 iulie si ce review? Presupunind ca ai gresit si voiai sa zici 6 iunie, la ce review te referi? Iar suferi de paranoia galopanta si ma vezi peste tot in jurul tau? A mai facut cineva misto de tine pe tema articolului si ai crezut ca-s tot eu? Da-mi si mie link te rog.

    Ce curaj mai puroiule? Tu ai inteles ceva din discutia aia de acolo cu FindFirstFile()? Ce cod voiai sa postez? Ti s-a parut cumva ca incercam sa invat pe cineva vreo metoda de umblat prin directoare?

    De la mine n-o sa vezi nici un singleton, pentru ca: a) nedumeririle legate de variabile globale in C mi le-am rezolvat prin clasa a 9-a si b) acest non-subiect este discutat si explicat in cele mai mici detalii peste tot pe internet. De ce as mai scrie si eu inca un articol, pe linga cele 10000 de articole care exista deja, fara sa aduc nimic nou? Tu de ce o faci?

    Am impresia, insa, ca incepi sa te tragi de sireturi cu mine. Cumva a inceput sa ti se para ca vorbim de la acelasi nivel si ca poti sa-mi “dai hinturi”, sa-mi gasesti greseli sau sa-mi combati vreun punct de vedere? Mars inapoi in mocirla ta, ca te intreci cu gluma.

    Nu stiu ce incerci sa demonstrezi prin interventiile tale de aici, in afara de faptul ca esti un agramat incapatinat. Toti cei care te cunosc si stiu sa programeze s-au prins demult ca esti un incompetent fara seaman (aia care te cunosc si nu stiu sa programeze s-au prins doar ca esti prost). Nu mai incerca sa-ti explici pozitia, pentru ca prostia te impiedica sa vezi ce este evident pentru tot restul lumii (te-am mai trimis de vreo 2 ori la articolul asta in care se povesteste ca esti prea prost ca sa intelegi cit de prost esti, iar tu ai confirmat, neintelegind ce se zicea acolo). Cit timp tu vei scrie articole, restul lumii va ride de tine. Las-o asa.

  13. Mihnea Says:

    Adrian: inteleg. ;)

  14. Silviu Says:

    Ce facem prietene? Variabilele globale nu mai sunt de porc?
    Tu insisti sa ne tragem de sireturi virtual. Articolul meu cu singleton-ul acopera un subiect mai discutabil si fierbinte decat pare la prima vedere.
    Nu prea gasesti exemple concrete cu abordarea thread-safe si explicatiile din cartea lu’ Alexandrescu enumerate in articol vin in sustinerea ideii. In plus, articolul vine cu implementare de C++ 11 (completa).
    Daca vorbim de niveluri tu ai fi pe munte si eu pe plaja… nu mi-ai da atata atentie. In realitate, nu-ti vezi lungul nasului si tu stii mai bine de ce.

  15. Mihnea Says:

    Uite ce e, eu stiu ca esti prost, dar de fiecare data cind spui ceva reusesti sa-mi demonstrezi ca ti-am subestimat gradul de prostie. Asta da performanta. Eu nu-ti zic sa inlocuiesti singletonii cu variabile globale (sau enumurile cu vectori). Eu iti spun ca-s acelasi lucru. In fine, nu-ti mai bate capul, ca nu ai cum sa pricepi.

    Faptul ca rid de tine nu inseamna ca sintem la acelasi nivel. Aici se ride de tine pentru ca esti 0, dar nu-ti dai seama si insisti sa dai si lectii.

    Vezi ca ai uitat sa raspunzi la citeva intrebari:

    De ce scrii chestii care se gasesc si in alte parti ori mot a mot (ca dai copy/paste), ori explicate mai bine?

    Unde s-a facut misto de tine pe 6 iunie?

    Ai copiat sau nu codul de pe stackoverflow?

  16. Silviu Says:

    Orice raspuns ti-as da eu sunt nullptr pentru unul ca tine. Tu esti orb sa vezi diferentele cand e vorba de mine. Tot latri cu copy/paste dar nu ai fost in stare sa probezi. Imi dadeai 2 pentru copiat caci te <a href = "http://standupprogramming.com/2011/07/16/cele-doua-fete-ale-tirnacopului/"stii. ;)
    Ti-ar fi prins tare bine sa fi parcurs niste cursuri din facultate sa intelgi ca nu e ok sa sari direct in “puţ” (versiunea 4).

    Si se pare ca-ti place sa faci pe prostu’. Nu te contrazic. Pe 6 iunie la ora 11:46 ai navalit pe siteul. Ieri, nepublicandu-ti deja clasicele jigniri la mine pe site te-ai apucat sa scrii asta.

    Nu am nevoie de aprecierea unuia ca tine. Ma multumesc cu aprecierea celora ce ma cunosc in persoana, cu aprecierea acelora care mi-au propus sa ma mut in Bucuresti, a acelora ce mi-au oferit scrisoare de recomandare dupa decizia de-a alege alta cale.

    Multumesc pentru ocazia acordata. Iarta-ma ca mi-am permis sa-ti tulbur linistea! :)

  17. Silviu Says:

    Scuza-ma… incerc sa tin putin la dieta si am reusit sa mananc un “” si un “meu”. Pe 6 iunie era vorba de siteul meu.

  18. Mihnea Says:

    Ba, vezi ca o folie de Xanax e 2 lei sau pe-acolo. Necompensat. E adevarat ca ti-am lasat citeva vorbe de duh in comentarii si nu mi le-ai publicat (si mi-ai banat si IP-ul pe care il aveam atunci), dar am facut-o dupa Giovanni si Boris (incepeam cu “Dear Giovanni and Boris” si semnasem “Mihnea”, ceea ce ar trebui sa fie sugestiv chiar si pentru tine). Nu stiu cine a facut misto de tine pe 6 iunie. N-am fost eu. Fii bun si publica textul, poate il revendica cineva. Ai multi admiratori.

    Vezi ca ii cunosc si eu pe citiva dintre aia care te cunosc in persoana si am vazut cum sta treaba cu aprecierea asta. Argumentele cu scrisoarea de recomandare si mutarea in Bucuresti sint ilare; si eu ti-as scrie cea mai frumoasa scrisoare de recomandare si ti-as propune sa te muti in Bucuresti (sau Tokio) daca ai lucra in departament cu mine. Singurii care te apreciaza sint alti dobitoci ca tine, si pina si p-aia ai ajuns sa-i exasperezi. Stii la cine ma refer.

    Ce n-am fost in stare sa probez? Faptul ca am gasit sursele din care ai copiat si am explicat si de ce ai copiat prost nu se pune drept proba?

    PS: pacat, totusi, ca n-ai acceptat sa te muti in Bucuresti.

  19. BloodRain Says:

    E superb cum cineva poate sa aduca ca argument link-ul cu variabilele globale si sa spere ca il avantajeaza :)))

  20. Silviu Says:

    Dudes, am fost surprins ca ai ratat momentul publicarii cu o seara inainte (nu se intampla de multe ori). E chiar greu de inteles ca pe 6 iunie era vorba de “primele tale impresii si reactii”?

    Xanax obisnuiesti sa iei? Te inteleg… :(

    PS. promit sa nu te mai deranjez decat daca va fi nevoie sa te ajut sa intelegi de ce vorbesc prin articole (vezi faza cu buffere si swprintf()). n-o sa te mai las luni de zile in suspans. :)

  21. Mihnea Says:

    Ba prostea, ai balmajit ceva de un review pe care ti l-am facut pe 6 iunie. Acum vrei sa spui ca te refereai la primele mele impresii neexprimate? Te plingi de faptul ca nu am facut misto de tine mai repede, sau crezi ca am asteptat sa gaseasca altii problemele in codul tau, ca eu nu-s in stare? Iar te zbati din rasputeri sa se ajunga si in cazul tau?

    Cit despre remarca cu xanax, sugi pula. Numai un cretin ca tine poate veni cu replici d-astea de gradinita cu “ba tu iei xanax”.

    Hai, la muie cu tine ca ma plictisesti. Nu mai incerca sa-mi explici chestii. Incearca sa intelegi ca nu poti sa-mi explici lucruri pe care tu nu le intelegi, iar eu le stiam in liceu (si nu numai eu; oricine nu a participat la mineriada). Esti penibil cu swprintf-ul tau. Vezi ca replica aia pe care o iei tu drept momentul triumfului era sarcasm.

    PS: noii tai colegi s-au abonat deja la standupprogramming, sau deocamdata te apreciaza fiecare in felul lui?

  22. Stefan Says:

    Aoleu, articolul cu singletoni e plin de perle. Am dat scroll la intamplare si-am gasit: “And no memory leaks emotion… “. Emotionant :).

    Totusi, cred ca poti sa-i dai credit pentru primul exemplu din articol, ala fara copy constructor si assignment operator private. Asta cre ca-i “inovatia” lui :D.

  23. RRR Says:

    “Articolul meu cu singleton-ul acopera un subiect mai discutabil si fierbinte decat pare la prima vedere.”
    AHAHAHAHAHAHA!!!!!!111ones

    “Ti-ar fi prins tare bine sa fi parcurs niste cursuri din facultate”
    Că pe tine te-au ajutat mult dudes…
    Anywho I see watcha dids their. Ai frut să-l frustezi pe Mihnea, care e un frustat frustabil şi frustăcios, nu? =)) (sic sic sic sic sic sic sic sic?)
    Tristule!

    “aprecierea acelora care mi-au propus sa ma mut in Bucuresti”
    Bă, trolilor, nu-l mai îndemnaţi pe ăsta să vină în Bucureşti, că noi n-am făcut mişto de voi să vă trimitem codexperţii la voi în oraş!
    Sfinte Dumnezeule, Sfinte Tare, Sfinte fără de moarte, miluieşte-ne pe noi şi nu-l aduce pe Silviu în Bucureşti!
    Mulţumim, Doamne, pentru înţelegere!
    Amin!

  24. thefatredguy Says:

    Cum poate un constructor prin copiere al unui obiect sa primeasca, ca si parametru acelasi obiect, cand obiectul inca nu e construit ? Adica uitandu-te la cod asta reiese :
    otherSingleton(const otherSingleton& rs) {
    if (this != &rs) {
    pInstance = rs.pInstance;
    }
    }

    Suntem in fata unei descoperiri epocale. Propun sa numim asta “The Chuck Norris Pattern”. pentru cei care nu stiu, Chuck Norris s-a nascut intr-o cabana construita de el.

  25. Unu Says:

    “if (this != &rs)” e un fel de guard daca “scheduler unwittingly” iti da aceiasi adresa cu obiectul referinta si se suprascriu ! Better safe than sorry. In lumea thread-safe sunt totusi niste principii.

  26. Mihnea Says:

    Este o primitiva de sincronizare cunoscuta doar celor ce lucreaza pamintul cu tirnacopul: constructorul ce-si construieste singur cerul.

    PS: tare ce-a raspuns subiectul.

  27. ZaGuy Says:

    Mai baieti, lamuriti-ma si pe mine (obiectiv vorbind), patternurile (si antipatternurile) si naiba sa le ia au macar cel mai mic folos. Adica merita studiate macar pentru a te intelege cu un fanatic din asta, sau sunt o pierdere totala de treaba si e bine sa stai departe de ele ca de ciuma? Are vreo utilitate intelegerea lor?

  28. Alex Says:

    Fiecare aberatie a lui silviu ma duce cu gandul la:
    http://en.wikipedia.org/wiki/Dunning%E2%80%93Kruger_effect

  29. Mihnea Says:

    Pe scurt: da, e util sa stii ce-s alea.

    Pe lung: la baza, design pattern-urile sint jargon. Atunci cind ai de descris un factory, e mai usor sa spui ca ai facut un factory, decit sa explici in 50 de cuvinte cum ai facut functia care ia un int si pe baza lui determina cu un switch sau un map daca trebuie sa faca new Miner sau new Militian. Din punctul asta de vedere, pattern-urile sint o chestie buna, deoarece usureaza comunicarea.

    Daca esti clasa a 9-a, pattern-urile pot fi privite si ca retete. Din punct de vedere al complexitatii, sint la acelasi nivel cu instructiunea if: cind ai de luat o decizie, folosesti if; cind ai de instantiat specializari ale unui tip abstract, faci un factory. Totusi, fara if nu vei ajunge prea departe; fara factory pattern o sa te descurci, pina intr-o zi cind o sa-l reinventezi. Daca nu esti in stare sa inventezi factory pattern fara ajutor extern (sau orice alt pattern d-asta), mai bine ramii la pescuit si Mill Night Lady. Pe de alta parte, daca tot e o banalitate, poate e mai bine sa-ti spuna cineva direct in clasa a 9-a, ca sa nu te mai scremi sa-l reinventezi. Si din punctul asta de vedere, pattern-urile sint un lucru bun.

    Mai departe lucrurile iau o turnura religioasa. In urma cu vreo 20 de ani, toata lumea buna din programare credea ca OOP este Solutia Finala. In aceasta perioada s-au nascut multe atrocitati cum ar fi Java si cartea celor patru muisti. Pentru a se simti mai destepti decit ceilalti practicanti de Java si, evident, pentru a scoate si ei un ban cinstit din vorbit mult despre nimic pe la conferinte, diversi papagali s-au pus pe sistematizat OOP-ul si pe extras pattern-uri din “experienta lor practica”. Astfel au aparut sute de cacaturi gen reactor pattern, decorator pattern, visitor pattern, memento, facade, flyweight etc. Astea nu mai sint jargon, sint termeni pomposi pentru lucruri care au deja nume: switch, for, pointer, derivare etc. Singurul lor scop este excrocarea celor slabi de inger: daca ar veni un mare vorbitor d-asta sa-ti ceara 10000 USD ca sa povesteasca la conferinta ta despre cum sa adaugi un pointer intr-o clasa, l-ai scuipa intre ochi si ar muri de foame; daca in schimb iti zice ca vrea sa povesteasca despre flyweight pattern, poate-poate iti ia banii.

    Totusi, si din punctul asta de vedere e bine sa stii de pattern-uri. Daca nu stii de crestinism si vine miine unu’ sa-ti spuna despre barbosul atotputernic din cer care este propriul tata si de asemenea propriul fiu si s-a sinucis pe fi-su care este el pentru binele tau si te scapa de moarte daca dai bani, e posibil sa-ti ia ceva timp pina te dezmeticesti si iti bagi pula in fata lui. Cu pattern-urile e la fel: daca stii deja ce-s alea, cind vine unu’ sa-ti spuna cum e cu Fatada in Rigips a Decoratorului Homosexual, il poti cataloga rapid ca retardat si nu mai pierzi timpul incercind sa porti un dialog cu el.

    Cu UML e mai simplu: UML este o chestie inventata de excrocii cu design patterns pentru a avea ce sa puna pe proiector cind te vrajesc la conferinte. Aia care nu s-au prins (sau nu vor sa recunoasca) ca au fost excrocati il preiau sperind ca-i va ajuta sa inteleaga cum e cu programarea asta. Daca nu esti retardat, iti dai seama repede ca vizualizarea relatiilor dintre clase te ajuta sa intelegi doar programele atit de banale si plictisitoare, incit oricum nu e nimic de inteles la ele. In concluzie, UML nu are nici o parte utila, cum au design patterns, si nu e nevoie sa Study Deeply™ la el ca sa decizi ca-i un jeg. Singura parte interesanta din UML este ca descrierile rezultate sint mai voluminoase decit echivalentul in proza libera, deci in loc sa simplifice comunicarea, o ingreuneaza. Asta spune tot ce era de spus despre imbecilitatea excrocilor care-l promoveaza.

  30. Valentin Galea Says:

    Cu ce am ramas eu din toata discutia asta este ca Silviu isi numara PS-urile: are un PS1, un PS2..

    Eu zic sa punem mana de la mana si sa adunam bani sa-i luam si un PS3 – mai baga si el un joc de relaxare dupa atata copy/paste.

  31. B.L. Says:

    :))))))) @ June 10th, 4:28 pm & June 11th, 9:17 am

    @ Valentin Galea: Da’ unul pentru DOS ce are? De exemplu, Rex Nebular, care are secţiunea Quotes – o sursă de inspiraţie pentru Silviu: “It’s a high level programming thing that I don’t want to explain to you right now.”

  32. Luca Says:

    “Is Silviu ill?” He might need therapy! http://www.youtube.com/watch?v=qLrnkK2YEcE

  33. Luca Says:

    Chestia interesanta este ca de fiecare data cand apare un articol de genul asta vrei sa intelegi mai mult de ce greseste Silviu, cel putin in cazul unui incepator ca mine. Nu se mai pune problema daca da cu oistea in gard ci intereseaza gradul!

  34. și Matei Says:

    M-am trezit căutând pe google «stand up programming … » în loc de stand up comedy, deși nu v-am mai vizitat de ceva timp.

    Numa’ bine.

  35. gail Says:

    thefatredguy Says:
    June 12th, 2012 at 3:17 pm
    “Cum poate un constructor prin copiere al unui obiect sa primeasca, ca si parametru acelasi obiect, cand obiectul inca nu e construit ? Adica uitandu-te la cod asta reiese : …”

    Nu inteleg ce era asa greu sa probezi inainte sa vorbesti.

    int a = a;//se compileaza si cu g++ si cu cl
    //sau

    class Self { …. };

    Self a = a;//se compileaza si cu g++ si cu cl, si nu se apeleaza decat constructorul de copiere.

    Idei ?

  36. Mihnea Says:

    Hai ma ca s-a ajuns si-n cazul lui Silviu. Pacat ca initializarea unui obiect cu el insusi este invalida (daca obiectul chiar contine ceva, nu e doar o clasa goala), deoarece obiectul nu este construit, cum spunea thefatredguy. In cazul fericit copiezi valori neinitializate, ceea ce este “undefined behavior” conform standardului. In cazul nefericit unele din valorile alea sint pointeri si o sa crapi cind incerci sa citesti din ei ca sa le copiezi continutul. Daca esti miner prost si dai return cind esti initializat cu tine insuti, tot nu rezolvi nimic, deoarece obiectul ramine neinitializat. Nu orice cod care se compileaza este si valid.

    Verificarea in cauza e utila in operator= si i-a fost recomandata personal lui Silviu de catre tovarasii Meyers si Alexandrescu. Asignarea la tine insuti este de obicei un semn de retardare, dar sint si exceptii. De exemplu, unele compilatoare au macro-uri de marcat parametri ca nefolositi care se expandeaza in ceva de genul (a) = (a) (ceea ce e destul de retardat in sine si nu merge daca parametrul e const, dar na, asta avem, cu asta defilam). Problema e ca minerii, indiferent ca-s din Petrosani sau Bazinul Ruhr, devin creativi si extind conceptul asa cum ii duce pe ei capul, adica prost. Chiar daca constructorul de copiere seamana cu operatorul de asignare, nu-i chiar tot aia mai baieti.

    De altfel, daca n-ai fi invatat de la prietenul tau sa te temi de atacuri la persoana din partea compilatorului, ai fi compilat codul ala cu warning-uri. Nu inteleg ce era asa greu sa pui un -Wall acolo inainte sa vorbesti, daca-mi permiti sa te parafrazez. Iar daca nu primeai nici un warning, puteai sa RTFM un pic ca sa afli ca trebuie sa-i dai macar -O1 ca sa mearga -Wuninitialized (parte din -Wall).

    Oricum, avind in vedere ca Comitetul Central pare pornit pe inventarea unor noi tipuri de constructori, #pragma eupropun sa se faca urgent C++12 care sa specifice drept obligatoriu constructorul de retardare, ce este apelat de compilator atunci cind de cealalta parte a tastaturii sta un miner.

    Idei?

    PS: pentru un minerit mai placut, ne-am putea intreba de asemenea cine cacat poate chema constructorul de copiere sau operatorul de asignare in codul ala al lui Silviu, avind in vedere ca ambii sint privati. Dar na, asta deja e subiect pentru avansati.

  37. dan Says:

    ia te uita pe cine’am gasit distrandu’se pe’aci.. :)

  38. catalin++ Says:

    pe cine ma frate Dan ?

  39. Tomis Says:

    Am descoperit cu o oarecare intarziere ca a fost declarat razboi switch-ului – http://stackoverflow.com/questions/126409/ways-to-eliminate-switch-in-code

    Al doilea raspuns demonstreaza clar natura dusmanoasa a instructiunii care incalca cu nesimtire “the Open Closed Principle”. Conflictul este rezolvat ad-hoc cu refactoring si Design Patterns. RIP switch.

    In alta ordine de idei, intrebarea “why doesn’t Python have a switch statement?” a primit verdictul “closed as not constructive” – http://stackoverflow.com/questions/374239/why-doesnt-python-have-a-switch-statement

  40. caramidacuminer Says:

    dlcp presupune sa faci cit mai putin lock pe getInstance. implementarea stl dinkumware din vc++ a lui call_once face lock_guard pe un mutex mereu.
    dar tastatura minerului avea blocata tasta f11
    deci muie la mineri

  41. ZaGuy Says:

    Daca tot e aici sesiune de intrebari si raspunsuri, lamuriti-ma si pe mine baieti, ca sunteti ceva mai experimentati ca mine. Ce atata tam-tam cu cartea lui Alexanrescu, mare programator la Failbook. Am incercat si eu sa o citesc si nu am vazut decat o abstractizare dubioasa dusa la extrem si ceva jargon. Am cautat niste reviewuri mai obiective si critica constructiva, dar nu am dat decat de fanboys. E chiar asa o valoare inestimabila baiatul asta?

  42. Moshu Says:

    @ZaGuy: apoi dragu moshului, eu sap de vreo 22 de ani prin C++ si derivatele lui si da, zic ca e ceva de capul lui Alexandrescu. Ce-a scris el acolo e un fel de poezie in C++, ceva ce mie nu mi-ar fi dat prin cap in vecii vecilor. Da e ca la poeti, te uiti in gura lor, inveti una-doua chestii sa le plasezi pe ici pe colo sa te dai rotund, da n-as coborî cu el in abataj.

Leave a Reply

Optionally add an image (JPEG only)