Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Alt "Utilizator nou" pe T...

ULBS INFORMATICA

Index preturi

Boxa membrana tweeter infundata
 Am nevoie de poze cu un curcubeu

Whisky for Mac

Xiaomi 14 Gpay

Izolare zid exterior de scandura
 Dezinstalare drivere W11 23H3

Recomandare masina de spalat fiab...

BSOD din cauza Intel Audio DSP dr...

De ce sunt oamenii nostalgici
 Cum vand casa fara factura Hidroe...

Scor FICO minim

Tonometru compensat CAS?

polita RCA ONLINE
 

Operator overloading – da sau ba?

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

#1
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,233
  • Înscris: 24.02.2007
Unii adora operator overloading, altii nici nu vor sa auda.

Ce cazuri ati intalnit in practica unde operator overloading sa fi fost folosit foarte prost sau sa fi fost de dorit dar indisponibil?

Un caz unde mi se pare interesanta abordarea: concatenarea cailor spre fisiere in biblioteca standard a C++17 https://en.cpprefere.../operator_slash

Un caz unde prefer sa nu folosesc overloading: egalitatea intre stringuri. Adesea am nevoie sa specific mai in detaliu cum doresc sa fie efectuata aceasta comparatie.

#2
adamsd

adamsd

    Member

  • Grup: Members
  • Posts: 611
  • Înscris: 16.04.2019
Ba.
Duce inevitabil la abuzuri. Maxim, ceva implementat la nivel de compilator si gandit bine. Dar sa nu aiba programatorii posibilitatea sa-si defineasca operatorii proprii, ca e jale!

#3
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,233
  • Înscris: 24.02.2007
Orice se poate abuza. Ar fi interesante niste exemple concrete (macar aproximative) de cod ce abuzeaza operator overloading, cod ce-a trecut de reviews desigur.

#4
parabellum

parabellum

    Senior Member

  • Grup: Senior Members
  • Posts: 2,453
  • Înscris: 06.01.2010
Programarea duce la abuzuri, programarea trebuie eliminata. Sa nu aiba programatorii posibilitatea sa scrie cod, ca e jale!

return f * (HW - (OW * Uinv).eval() * (Wadj * HW).eval()) * Uinv;

De aici: https://github.com/a...DFT/DftSolver.h

Formula e practic cea din articol, cu un pic de complexitate adaugata din cauza 'lazy evaluation' (adica eval() ala).
Daca incerci s-o scrii cu .minus si .multiply te cam pierzi in ceata. Formula devine foarte greu de recunoscut.

#5
TS030

TS030

    Guru Member

  • Grup: Senior Members
  • Posts: 15,193
  • Înscris: 25.06.2012
Un programator prost va scrie cod prost indiferent daca are sau nu operator overloading la dispozitie.

Eu prefer operator overloading. Nu e nimic de adorat aici, e doar o unealta utila.

Sa fi fost de dorit dar indisponibil - in toate limbajele care nu suporta operator overloading, dar accepta definirea de tipuri de date utilizator.

Operator overloading nu e o facilitate esentiala; ci una care permite o interfata mai consistenta, logica.
Un exemplu clasic - tipuri de date numerice, precum complex sau big integer. Da, poti sa scrii
result = (a.plus(b)).divides(c);

in loc de
result = (a+b)/c

Cum era cu inmultirea? multiplies() sau times()? q.e.d.

Exemple de abuzuri (care sa mai si treaca de review) n-am. Nu ca n-ar exista... pe undeva.
Regula e simpla: foloseste operator overloading doar acolo unde are sens. Refoloseste conventii existente, fara inovatii, fara surprize.

#6
parabellum

parabellum

    Senior Member

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

Quote

Nu e nimic de adorat aici
Cand ai de lucru cu niste formule mai complexe, e de adorat. Fara operator overloading, codul devine ca dracu'. Greu de inteles, greu de mentinut, usor sa bagi erori.

Unul dintre motivele pentru care Mathematica e folosit (desi licenta costa ca naiba) e ca poti scrie formulele asa cum sunt ele in matematica.

#7
iulian_1976

iulian_1976

    Active Member

  • Grup: Members
  • Posts: 1,576
  • Înscris: 10.05.2008
Poate ca tema asta ar fi foarte interesanta daca am compara Overloading-ul in general intre limbaje.Are cumva C++ o limitare aici?
Intreb si eu  Posted Image in C stiu sigur ca este limitat comparativ cu..."celalalt".

Edited by iulian_1976, 20 April 2019 - 14:21.


#8
parabellum

parabellum

    Senior Member

  • Grup: Senior Members
  • Posts: 2,453
  • Înscris: 06.01.2010
Sigur ca C++ are limitari. Nu poti crea operatori noi. Nu te poti atinge de ".", "::", ".*". Etc. Mai multe, aici: https://en.cpprefere...guage/operators

#9
OriginalCopy

OriginalCopy

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

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
Eu nu as folosi + pentru operatii ne-matematice. Sigur, daca tot e disponibil, voi scrie +, dar nu voi implementa eu operator+ pentru astfel de lucruri in codul meu - ex. string concatenation.

Similar si cu == sau alti operatori: == e periculos, e shallow sau deep comparison? Stie asta si incepatorul din echipa, dar mai ales: i-a intrat in sange din prima? Deoarece chiar daca stie, tot va face greseli. De aceea big no.

#10
TS030

TS030

    Guru Member

  • Grup: Senior Members
  • Posts: 15,193
  • Înscris: 25.06.2012
Utilizarea '+' pentru concatenare urmeaza o conventie existenta, deci nu vad unde-i problema. Mai mult, o poti extinde e.g. pentru multimi si lumea va intelege.

Sau, sa zicem - poti defini (in)egalitate intre doua date, o relatie de ordine; poti aduna la o data o durata de timp. "plus two days" e ceva, iarasi, inteles de toata lumea.

Comparatia pe string-uri iarasi, are sens. Daca incepatorul e javist, atunci '==' este shallow rau de tot ;)
'==' shallow, hmm... ar avea vreun sens? Compari obiecte, sau reprezentarea lor in memorie?

Si pana la urma, care ar fi solutia? Sa interzici operator overloading in limbaj? Sa permiti doar anumite cazuri, si atunci cum stabilesti care sunt acele cazuri?
Exemplu concret: care e diferenta dintre un big integer si-un point? Ca programator o stii, si stii ca poti defini '<' pe big integer, in timp ce pe point nu.

Responsabilitatea este a programatorului; este absurd ca un limbaj de programare sa ne restrictioneze pe toti la nivelul la care poate functiona un incepator.

#11
adamsd

adamsd

    Member

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

View Postdani.user, on 20 aprilie 2019 - 12:45, said:

Orice se poate abuza.
Se abuzeaza ce se permite sa se abuzeze. Cu cat mai mult, cu atat mai rau.

Sa zici ca orice poate fi abuzat, mi se pare pereche cu discutia cu armele, sa le lasam la liber, ca nu te omoara armele ci oamenii, ca cine are sa te omoare te omoara cu orice. Sorry, dar nu subscriu absolut deloc la aceasta "logica".

View Postdani.user, on 20 aprilie 2019 - 12:45, said:

Ar fi interesante niste exemple concrete (macar aproximative) de cod ce abuzeaza operator overloading, cod ce-a trecut de reviews desigur.
Pai putem vede niste exemple direct din libraria standard c++

string s = "world";
cout << "hello " + s;
ok

cout << "hello" + 3;
unexpected crap

cout << "hello" + "world";
herror

sau

string s = "";
s += (5 + '0');
ok

s = s + (5 +'0');
eroare

see? si e doar inceputul...

sau ce sa mai zicem de alte limbaje... gradul de nebunie din scala zici ca-i din alta lume: http://www.scala-gra...itializing.html Posted Image

*******
code review zici...

pai pana acolo... ce faci cu code base-ul existent? cine iti garanteaza ca nu e abuzat deja? ce faci cu bibliotecile pe care le folosesti si in care s-a abuzat?
si legate de code review... daca nu exista asa ceva si nu esti tu in putere sa decizi asa ceva?
daca cei care fac review-ul nu au experienta necesara?(doamne fereste sa fie adepti a-i programarii functionale - aia nici nu au cum sa stie ce-i aia cod prost, necitibil)
*******

overall... ar fi "scoli de gandire":

1. cei care vor ca limbajul sa fie cat mai permisiv, sa faca ce vor, cum vor, crezandu-se in permanenta "experti" infailibili

2. cei care vor ca limbajul sa impuna reguli clare, sa limiteze pe cat posibil mecanismele ce permit cod prost, greu de citit sau predispus catre erori

Subscriu in totalitate la 2. Ajungi sa subscrii la asta in special daca ajungi la un nivel in care raspunzi pentru codul scris de altii, pentru mentenanta proiectului pe termen lung. Cand treaba e la nivel hobby sau freelancing sau poate ceva programare izolata(cum e pe la embedded), grijile sunt mai putine.

Edited by adamsd, 21 April 2019 - 19:45.


#12
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,423
  • Înscris: 10.08.2005
si 3, cei care isi asuma greselile indiferent de limbaj

#13
adamsd

adamsd

    Member

  • Grup: Members
  • Posts: 611
  • Înscris: 16.04.2019
Da... te si vad asumandu-ti greselile altora... :lol:

#14
TS030

TS030

    Guru Member

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

View Postadamsd, on 21 aprilie 2019 - 19:41, said:

Pai putem vede niste exemple direct din libraria standard c++
Hai sa nu dezinformam; alea nu-s exemple "direct din libraria standard C++", ci exemple de incompetenta.

Ce nu intelegi tu e ca fara programatori competenti, n-ai mai posta aici pe forum - nici n-ai avea calculator, pentru ca n-ar fi software care sa-ti permita sa-l folosesti.

#15
OriginalCopy

OriginalCopy

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

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

View Postadamsd, on 21 aprilie 2019 - 19:41, said:

overall... ar fi "scoli de gandire":

1. cei care vor ca limbajul sa fie cat mai permisiv, sa faca ce vor, cum vor, crezandu-se in permanenta "experti" infailibili

2. cei care vor ca limbajul sa impuna reguli clare, sa limiteze pe cat posibil mecanismele ce permit cod prost, greu de citit sau predispus catre erori

Subscriu in totalitate la 2. Ajungi sa subscrii la asta in special daca ajungi la un nivel in care raspunzi pentru codul scris de altii, pentru mentenanta proiectului pe termen lung. Cand treaba e la nivel hobby sau freelancing sau poate ceva programare izolata(cum e pe la embedded), grijile sunt mai putine.
Utila sinteza, ne ajuta sa pastram directia discutiei.

#16
iulian_1976

iulian_1976

    Active Member

  • Grup: Members
  • Posts: 1,576
  • Înscris: 10.05.2008
Am studiat C ceva timp si este limitat pentru overloading in general, cu cea mai mare placere studiam C++ mai ales ca veneam de pe C, nu am hotarat eu ce este mai ok, s-a hotarit ca Java este mai ok.
Da-mi un motiv sa invat C++ Posted Image


TS030@ Toate postarile tale se invart in jurul a doua concepte, un concept pentru tine este viata si moartea in timp ce celalalt este este nul, numai incompetenti misuna dincolo Posted Image

Runtime error detection mechanism:

-C++ ---------------->Programmers's responsibility

-Java---------------->Systems responsibility

Sunt doua concepte care nu tin de tine care este mai puternic, piata dicteaza directia.

Edited by iulian_1976, 21 April 2019 - 21:37.


#17
TS030

TS030

    Guru Member

  • Grup: Senior Members
  • Posts: 15,193
  • Înscris: 25.06.2012
Iulian, C nu doar ca e limitat - el nu ofera deloc overloading (in afara de operatorii predefiniti pentru tipurile de baza).

Motiv sa inveti C++? Calea de urmat ti-o alegi singur, pana la urma... "s-a hotarat" e irelevant. Pot doar sa te sfatuiesc sa-ti faci o idee mai buna despre ce inseamna C++ cu adevarat. Cauta pe topicul "Clasicul si modernul C++" postul despre C++ Today: The Beast is Back - in acest moment este ultimul. Pentru un tur tehnic al limbajului, exista cartea lui Stroustrup, A Tour of C++. Pentru orice nelamurire, intreaba. Apoi vei putea decide in cunostinta de cauza.
Iar a folosi C++ ca instrument de studiu te poate face un programator mai complet, fata de un limbaj care te izoleaza de prea multe lucruri.

Cred ca e o neintelegere la mijloc, nu exista un conflict intre programmer's responsibility si system's responsibility - programatorul e intotdeauna responsabil de codul pe care-l scrie. Nici un limbaj nu te poate impiedica sa comiti erori!

Apoi, incompetent e modul in care se ataca C++-ul. Tipic, se prezinta un abuz de limbaj, constructie eronata sau o situatie perfect normala in contextul respectiv (dar care eventual e tratata altfel intr-un alt limbaj).
Ideea este, cand ataci un limbaj, sa vii cu exemple valide, idiomatice. Arata ca modul cel mai bun de-a folosi acel limbaj nu este OK. Ori, cand nu esti in stare nici macar sa atribui exemplele...
Avem operatorul + aplicat pe doi pointeri; ce semnificatie ar putea avea? Avem aritmetica de pointeri, si omul nostru n-a fost atent la cursul de C daca e surprins de rezultat. Avem conversiile implicite mostenite din C (din pacate, si narrowing). Zero chestii care tin de libraria standard. Cu atat mai putin sa fie din libraria standard.

Apropo, urmatoarea constructie e corecta in C++17:
std::cout << "hello"s + "world"s;

gratie introducerii string literals in limbaj; si a operator overloading, evident ;)

#18
adamsd

adamsd

    Member

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

View PostTS030, on 21 aprilie 2019 - 20:05, said:

Hai sa nu dezinformam; alea nu-s exemple "direct din libraria standard C++", ci exemple de incompetenta.

Ce nu intelegi tu e ca fara programatori competenti, n-ai mai posta aici pe forum - nici n-ai avea calculator, pentru ca n-ar fi software care sa-ti permita sa-l folosesti.
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.

View Postiulian_1976, on 21 aprilie 2019 - 21:34, said:

-Java---------------->Systems responsibility
E cam mult spus, caci programatorul este oricum responsabil pentru ceea ce produce, chiar si in java(de erori de logica spre exemplu, nu te poate apara niciun limbaj, si chiar si erori tehnice se pot "comite" in java - dar mult mai putine decat in c/c++).

Ideea este totusi ca un limbaj care ofera mai multa siguranta in privinta codului corect si usor de inteles, este de preferat unuia care te lasa sa scrii mai mult cod prost si greu de inteles - atunci cand nu sunt prioritare alte aspecte(cum ar fi performanta,  sau rapiditatea cu care scrii codul)

La google, java este limbajul folosit in majoritatea proiectelor: de la gmail si adwords, la google docs. Este preferat lui C++ nu doar din cauza ca are gestionare automata a memoriei, ci din cauza ca in general codul este predispus la mult mai putine erori si este mult mai clar de citit si inteles. C++ ramane doar acolo unde e nevoie de performanta ridicata de procesare(a nivele de jos la search engine, baza de date si alte asemenea). Insa chiar si pentru utilizarea limitata a lui C++ google are o pagina uriasa cu "guidelines": https://google.githu...e/cppguide.html

Evident ca si operator overloading are o sectiune consistenta https://google.githu...or_Overloading:

Quote

Pros:

- Operator overloading can make code more concise and intuitive by enabling user-defined types to behave the same as built-in types. Overloaded operators are the idiomatic names for certain operations (e.g. ==, <, =, and <<), and adhering to those conventions can make user-defined types more readable and enable them to interoperate with libraries that expect those names.
- User-defined literals are a very concise notation for creating objects of user-defined types.

Cons:

- Providing a correct, consistent, and unsurprising set of operator overloads requires some care, and failure to do so can lead to confusion and bugs.

- Overuse of operators can lead to obfuscated code, particularly if the overloaded operator's semantics don't follow convention.

- The hazards of function overloading apply just as much to operator overloading, if not more so.

- Operator overloads can fool our intuition into thinking that expensive operations are cheap, built-in operations.

- Finding the call sites for overloaded operators may require a search tool that's aware of C++ syntax, rather than e.g. grep.

- If you get the argument type of an overloaded operator wrong, you may get a different overload rather than a compiler error. For example, foo < bar may do one thing, while &foo < &bar does something totally different.

- Certain operator overloads are inherently hazardous. Overloading unary & can cause the same code to have different meanings depending on whether the overload declaration is visible. Overloads of &&, ||, and , (comma) cannot match the evaluation-order semantics of the built-in operators.

- Operators are often defined outside the class, so there's a risk of different files introducing different definitions of the same operator. If both definitions are linked into the same binary, this results in undefined behavior, which can manifest as subtle run-time bugs.

- User-defined literals allow the creation of new syntactic forms that are unfamiliar even to experienced C++ programmers.

Decision:

Define overloaded operators only if their meaning is obvious, unsurprising, and consistent with the corresponding built-in operators. For example, use | as a bitwise- or logical-or, not as a shell-style pipe.

Define operators only on your own types. More precisely, define them in the same headers, .cc files, and namespaces as the types they operate on. That way, the operators are available wherever the type is, minimizing the risk of multiple definitions. If possible, avoid defining operators as templates, because they must satisfy this rule for any possible template arguments. If you define an operator, also define any related operators that make sense, and make sure they are defined consistently. For example, if you overload <, overload all the comparison operators, and make sure < and > never return true for the same arguments.

Prefer to define non-modifying binary operators as non-member functions. If a binary operator is defined as a class member, implicit conversions will apply to the right-hand argument, but not the left-hand one. It will confuse your users if a < b compiles but b < a doesn't.

Don't go out of your way to avoid defining operator overloads. For example, prefer to define ==, =, and <<, rather than Equals(), CopyFrom(), and PrintTo(). Conversely, don't define operator overloads just because other libraries expect them. For example, if your type doesn't have a natural ordering, but you want to store it in a std::set, use a custom comparator rather than overloading <.

Do not overload &&, ||, , (comma), or unary &. Do not overload operator"", i.e. do not introduce user-defined literals.

Type conversion operators are covered in the section on implicit conversions. The = operator is covered in the section on copy constructors. Overloading << for use with streams is covered in the section on streams. See also the rules on function overloading, which apply to operator overloading as well.


Pe de alta parte asemenea afirmatii gresite tradeaza lipsa de cunostinte elementare cu privire la facilitatile oferite de diverse limbaje de programare(sa intelegi macar cat de ce diferente sunt intre ele, ce avantaje/dezavantaje au, de ce sa alegi unul sau altul in cutare situatie):

Quote

Nici un limbaj nu te poate impiedica sa comiti erori!
Spre exemplu java:
Cum accesezi un index de array out of bounds? Cum faci buffer overflow? Cum lasi o variabila neinitializata, plina de garbage? Cum accesezi ceva memorie random, de aiurea? Cum incurci tipurile intregi cu cel boolean? Cum faci conversie implicita intre long si int? Cum "uiti" sa faci exception handling la operatiuni i/o? Cum comiti lsp violations la method/function overloading? si multe, multe altele...

Limbajele cu certitudine pot(si ar trebui, daca sunt de calitate) sa impiedice cat mai multe greseli si practici rele(sigur, aici sunt niste intrebari, cam care-s costurile, cu cat cresc timpii de compilare, cat de greu sunt de realizat compilatoare mai inteligente, care sa analizeze cat mai multe aspecte din cod).

Anunturi

Second Opinion Second Opinion

Folosind serviciul second opinion ne puteți trimite RMN-uri, CT -uri, angiografii, fișiere .pdf, documente medicale.

Astfel vă vom putea da o opinie neurochirurgicală, fără ca aceasta să poată înlocui un consult de specialitate. Răspunsurile vor fi date prin e-mail în cel mai scurt timp posibil (de obicei în mai putin de 24 de ore, dar nu mai mult de 48 de ore). Second opinion – Neurohope este un serviciu gratuit.

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