Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Incalzire in pardoseala etapizata

Suprataxa card energie?!

Cum era nivelul de trai cam din a...

probleme cu ochelarii
 Impozite pe proprietati de anul v...

teava rezistenta panou apa calda

Acces in Curte din Drum National

Sub mobila de bucatarie si sub fr...
 Rezultat RMN

Numar circuite IPAT si prindere t...

Pareri brgimportchina.ro - teapa ...

Lucruri inaintea vremurilor lor
 Discuții despre TVR Sport HD.

Cost abonament clinica privata

Tremura toata, dar nu de la ro...

Renault Android
 

Operator overloading – da sau ba?

- - - - -
  • This topic is locked This topic is locked
99 replies to this topic

#19
TS030

TS030

    Guru Member

  • Grup: Senior Members
  • Posts: 15,193
  • Înscris: 25.06.2012

View Postadamsd, on 22 aprilie 2019 - 08:41, said:

Trebuie sa devii mai intai programator experimentat pentru a intelege ce spun. Din ala real, angajat intr-o firma si responsabil de rezultatele unei echipe. Pana atunci, poti sa asisti de pe langa, emitand tot felul de opinii gresite.
Copil mai esti...

Ca fapt divers, subiectul acestui thread este Operator overloading, nu "De ce Java e cel mai bun limbaj".
Iar operator overloading poate fi considerat syntactic sugar... deci despre ce vorbim noi aici?
Argumentul pe care-l ofer eu este ca operator overloading iti permite sa scrii cod mai logic, consistent, clar.

Nu stiu de ce sari asa in sus... Java, evident, isi are locul sau - dat de multitudinea de framework-uri si librarii. Este un limbaj util? Este. Este un limbaj perfect? No way.
C++, evident, isi are locul sau - dat de combinatia unica intre apropierea de hardware si mecanismele high-level de abstractizare.

Google este unul din principalii actori din spatele C++ - membri ai comitetului de standardizare. Google foloseste o serie de limbaje, si chiar a dezvoltat propriul limbaj; cu toate acestea, C++ ramane esential pentru ei. Cauta-l pe Chandler Carruth, are cateva prezentari interesante.

Ca sa folosim exemplul cu accesul verificat la elementele unui vector - pai, in majoritatea cazurilor nu ai nevoie de asa ceva. In majoritatea cazurilor nici nu ai nevoie sa accesezi un vector prin index. Exemplu acum clasic:
for (auto&elem : vec)
...

Nu-ti lasa nici o posibilitate de buffer overflow. La fel daca folosesti begin() si end(), un idiom clasic in C++, pe care se bazeaza multi algoritmi.
Oare cum ar fi ca o simpla aplicare unui algoritm, fara posibilitatea de-a accesa elemente din afara containerului, sa implice o asemenea verificare - absolut inutila - pentru fiecare acces?

Apropo, Java iti permite bine mersi sa-ti bagi picioarele in SOLID.

Dar, nu despre asta este topicul.

#20
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,383
  • Înscris: 10.08.2005
oameni buni, lasati-o naibi de consistenta, si fiti consecventi.

#21
TS030

TS030

    Guru Member

  • Grup: Senior Members
  • Posts: 15,193
  • Înscris: 25.06.2012
Muica, ce-o dadui pe engleza fara sa-mi dau seama Posted Image
Da, consecvent mergea acolo...

Edited by TS030, 22 April 2019 - 16:34.


#22
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,194
  • Înscris: 24.02.2007
Un exemplu de operator overloading dintr-un cod de-al meu:

Attached File  Untitled.png   10.8K   19 downloads

Este inceputul unei metode, ea continand mai multe validari similare.

La prima vedere, ce vi se pare ca face codul respectiv?

#23
adamsd

adamsd

    Member

  • Grup: Members
  • Posts: 611
  • Înscris: 16.04.2019
Nu stiu sigur, dar pare sa faca niste verificari - daca e empty stringul, daca se incadreaza intre min si max ca lungime, daca are leading/trailing whitespace

ideea de baza insa e cu totul alta: operatorul in sine sugereaza in mod natural ceva? daca e ceva gen + si e adunare e ok.. daca in schimb e ceva arbitrar, oricat de clara e definitia implementarii, ai o problema masiva, sau mai bine zis, cei care vor folosi codul tau vor avea o problema masiva!

Oamenii, in vasta majoritate a cazurilor, cel mai simplu comunica prin cuvinte, nu prin semne! Cand te apuci sa definesti semne ce depasesc cele cateva intelesuri intelese de majoritatea oamenilor(iar in cazul programatorilor, bonus, acele semne larg raspandite intelese de majoritatea programatorilor), vei ajunge sa ai cod greu de inteles de catre toata lumea (programatori sau nu) - si nu de putine ori inclusiv de catre autorii originali(peste ceva vreme - luni sau ani).

#24
TS030

TS030

    Guru Member

  • Grup: Senior Members
  • Posts: 15,193
  • Înscris: 25.06.2012
De acord, daca redefinesti semnificatia operatorilor in chestii arbitrare, ai o problema masiva. De HR ;)
Hai sa-ti dau un exemplu: o clasa oarecare care defineste a.equals(b) pentru a aduna a si b. Este exact aceeasi problema, doar ca functia se numeste equals si nu operator==. Ce facem, banam functiile? :)

Pe de alta parte, in cazul in care urmezi conventii existente, cum e mai bine - sa ai sau sa nu ai aceasta optiune?
result = (a.plus(b)).divides(c);

vs
result = (a+b)/c



#25
adamsd

adamsd

    Member

  • Grup: Members
  • Posts: 611
  • Înscris: 16.04.2019

View PostTS030, on 23 aprilie 2019 - 19:45, said:

De acord, daca redefinesti semnificatia operatorilor in chestii arbitrare, ai o problema masiva. De HR Posted Image
Sa aplici tu la firmele alea(desigur, tu doar iti inchipui cam cum ar fi).

Cam toate firmele de o anumita importanta au reguli stricte cu privire la operator overloading, nu faci ce-ti zboara prin creieras.

View PostTS030, on 23 aprilie 2019 - 19:45, said:

Pe de alta parte, in cazul in care urmezi conventii existente, cum e mai bine - sa ai sau sa nu ai aceasta optiune?
Astea-s cele mai irelevante exemple cu putinta! De ce? Pt. cazurile uzuale de tipuri (big decimal/big integer, numere complexe), se pot implementa exceptii la nivel de compilator.

#26
TS030

TS030

    Guru Member

  • Grup: Senior Members
  • Posts: 15,193
  • Înscris: 25.06.2012
Nu trebuie sa ai nici o regula stricta; o asemenea bazaconie nu trece de review.
Ai fi surprins cat de bine te descurci fara un style guide stufos. Desigur, iti trebuie si echipa pe masura.

Te mai las sa te gandesti daca merge chestia cu "exceptii la nivel de compilator".

#27
parabellum

parabellum

    Senior Member

  • Grup: Senior Members
  • Posts: 2,447
  • Înscris: 06.01.2010

Quote

Pt. cazurile uzuale de tipuri (big decimal/big integer, numere complexe), se pot implementa exceptii la nivel de compilator
Un vector 3D e un tip uzual pentru grafica 3d, de exemplu. Si pentru ca ai pomenit de numere complexe si eu de grafica, ce zici de cuaternioni? Dar de octonioni?
Dar daca ai nevoie de vectori multi-dimensionali? Din punctul meu de vedere, matricile sunt un tip uzual, si cam in orice foarte multe tipuri de calcule ce au treaba cu ingineria si stiinta.

Nu toate limbajele de programare exista pentru a face lucruri triviale.

#28
Mosotti

Mosotti

    Geniu umil

  • Grup: Senior Members
  • Posts: 33,295
  • Înscris: 21.04.2004
Right. Doar in C++ si doar cu operator overloading poti inmulti sau aduna doua matrici. Sa nu mai zic de vectori multidimensionali, se stie ca C++ e singurul limbaj care poate face asa ceva :lol:

#29
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
Eu nu inteleg de ce o tot dati zor cu matematicile. Nimeni nu are nimic cu operator overloading atunci cand are sens dpv semantic.

#30
TS030

TS030

    Guru Member

  • Grup: Senior Members
  • Posts: 15,193
  • Înscris: 25.06.2012
Citind posturile precedente,

View PostOriginalCopy, on 24 aprilie 2019 - 07:09, said:

Nimeni nu are nimic cu operator overloading atunci cand are sens dpv semantic.
Eu nu asta vad pe-aici. ;)

Chestia e ca si tipurile matematice, complex, matrici etc. nu sunt primitive ci user defined - deci un limbaj care nu ofera operator overloading te forteaza sa scrii
result = (a.plus(b)).divides(c);

Exceptii "la nivel de compilator", cum ai implementa asa ceva? Un hack urat care sa ocoleasca specificatiile core language-ului? "daca tipul este BigInteger atunci permiti +,-, etc"?
Si nu doar trebuie sa determini caror tipuri sa aplici aceste "exceptii" - ceea ce inseamna zero sanse ca o librarie 3rd-party sa beneficieze de asa ceva - ci si ce fel de exceptii. Compararea de numere complexe, de exemplu, e problematica.
Nu are nici un sens. Nu stiu nici un limbaj care sa procedeze astfel. Ori ofera operator overloading, ori nu.

@Mosotti:
Nu stii nimic.
1. operator overloading fata de function overloading e syntactic sugar, cum am mai zis
2. ia de citeste:
https://en.wikipedia...loading#Catalog

#31
parabellum

parabellum

    Senior Member

  • Grup: Senior Members
  • Posts: 2,447
  • Înscris: 06.01.2010

Quote

se stie ca C++ e singurul limbaj care poate face asa ceva
Ori ai uitat care e subiectul, ori pur si simplu nu intelegi. Nu ajunge sa 'poata face'.

Sigur ca pentru unii 'poate face' e un argument, indiferent daca 'putinta' aia implica un miliard de linii de cod in loc de una, sau un carnat lung si indescifrabil in loc de folosirea unor operatori direct transferabili din formula matematica.

#32
TS030

TS030

    Guru Member

  • Grup: Senior Members
  • Posts: 15,193
  • Înscris: 25.06.2012
Totusi, pentru un limbaj de uz general eu am o pretentie: sa foloseasca doar caractere care sunt pe tastatura ;)

#33
Mosotti

Mosotti

    Geniu umil

  • Grup: Senior Members
  • Posts: 33,295
  • Înscris: 21.04.2004

View PostTS030, on 24 aprilie 2019 - 09:00, said:

@Mosotti:
Nu stii nimic.
1. operator overloading fata de function overloading e syntactic sugar, cum am mai zis
2. ia de citeste:
https://en.wikipedia...loading#Catalog
Ar avea sens ce spui daca as fi pretins io vreodata altceva. E syntactic sugar care poate duce direct catre portile iadului, daca nu citesti bine de tot documentatia si te apuci sa presupui. De exemplu In Qt avem QList care are operatorul

T &QList::operator[](int i)

Well, great, foarte usor de folosit, dar sigur vrei sa-l folosesti? Pentru ca daca citesti in documentatie vezi ca:

Quote

Returns the item at index position i as a modifiable reference. i must be a valid index position in the list (i.e., 0 <= i < size()). <- Asta e ceea ce te astepti sa se intimple cind folosesti []

If this function is called on a list that is currently being shared, it will trigger a copy of all elements. Otherwise, this function runs in constant time. If you do not want to modify the list you should use QList::at(). <- Asta e ceva complet particular pentru Qt

Dar mai mult, QList are si operatorul

const T &QList::operator[](int i) const

Quote

This is an overloaded function.
Same as at(). This function runs in constant time.

Deci practic ai acelasi operator, care poate ori sa-ti returneze ceva ce crezi ca ar trebui sa returneze, ori cu totul altceva, al carui sens nu-l intelegi decit daca citesti despre containerele din Qt. Ma intreb citi si-au luat teapa (si nici macar nu si-au dat) seama folosind [], pentru ca e mai usor de scris decit at() :first:

#34
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
Asta voiam si eu sa zic: operator overloading e ok daca e o functie pura: https://en.wikipedia...i/Pure_function si daca se pastreaza semantica din alte domenii, de exemplu din matematica.

Orice e mai mult de atat pune presiune cognitiva pe programator. Si aici nu vorbim despre tu-cel-mai-vechi-programator-din-echipa care a luat deciziile initiale si care stie si cele mai intunecate colturi ale proiectului, ci de orice nou-venit in echipa care scaneaza codul.

Oricat de avansat as fi, cand citesc +, vad +, nu vad cai verzi pe pereti.

Scopul lui sintactic sugar e sa usureze munca, nu sa o ingreuneze, nu sa introduca cai verzi pe pereti.

Deci: operator overloading? depinde.

Edited by OriginalCopy, 25 April 2019 - 08:18.


#35
TS030

TS030

    Guru Member

  • Grup: Senior Members
  • Posts: 15,193
  • Înscris: 25.06.2012

View PostOriginalCopy, on 25 aprilie 2019 - 08:23, said:

Asta voiam si eu sa zic: operator overloading e ok daca e o functie pura: https://en.wikipedia...i/Pure_function si daca se pastreaza semantica din alte domenii, de exemplu din matematica.
Asta zic si eu.

View PostOriginalCopy, on 25 aprilie 2019 - 08:23, said:

Deci: operator overloading? depinde.
Intotdeauna depinde.
Am vazut prea multe moduri de-a o da in bara pentru a crede in zana maseluta si in programatorul care scrie cod bun datorita lipsei unei anume facilitati.

Operator overloading este util pentru cazurile in care poate fi, si este folosit corespunzator.

#36
adamsd

adamsd

    Member

  • Grup: Members
  • Posts: 611
  • Înscris: 16.04.2019

View Postparabellum, on 23 aprilie 2019 - 23:24, said:

Un vector 3D e un tip uzual pentru grafica 3d, de exemplu. Si pentru ca ai pomenit de numere complexe si eu de grafica, ce zici de cuaternioni? Dar de octonioni?
Dar daca ai nevoie de vectori multi-dimensionali? Din punctul meu de vedere, matricile sunt un tip uzual, si cam in orice foarte multe tipuri de calcule ce au treaba cu ingineria si stiinta.
Nici nu trebuie sa ajungi la vectori 3d, e suficient vectori simpli. Ai produs scalar, produs vectorial -  cum afli pe care e overloaded * ? Daca trebuie sa bajbai prin documentatie pentru a intelege ce fac operatorii in diferite contexte, e de rau!

View Postparabellum, on 23 aprilie 2019 - 23:24, said:

Nu toate limbajele de programare exista pentru a face lucruri triviale.
Exact! Atat ca ai impresia gresita ca treburile voastre matematicioase sunt non-triviale! Ba sunt chiar foarte triviale! Si aveti si suficiente jucarii dedicate! Nu e ok sa faci praf un general general purpose, pt. a satisface niste nise.  Iar overloading va fi folosit la multe alte chestii in afara de matematica, fiindca unora li se pare ca daca pui niste simboluri e mai cool(obsesia codului cat mai scurt si criptic, inteles doar de autori - ii face pe unii sa li se para ca-s mai destepti decat sunt ).

Anunturi

Chirurgia endoscopică a hipofizei Chirurgia endoscopică a hipofizei

"Standardul de aur" în chirurgia hipofizară îl reprezintă endoscopia transnazală transsfenoidală.

Echipa NeuroHope este antrenată în unul din cele mai mari centre de chirurgie a hipofizei din Europa, Spitalul Foch din Paris, centrul în care a fost introdus pentru prima dată endoscopul în chirurgia transnazală a hipofizei, de către neurochirurgul francez Guiot. Pe lângă tumorile cu origine hipofizară, prin tehnicile endoscopice transnazale pot fi abordate numeroase alte patologii neurochirurgicale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate