Overloading: o idee bună sau nu?

Overloading: o idee bună sau nu?

Acum câteva săptămâni mi-am băgat nasul în C# și cred că cea mai mare confuzie a fost legată de metode: cum poate o clasă să conțină mai multe metode?

Bine, ulterior am învățat că treaba asta se numește overloading și că este, aparent, o chestie bună. Am presupus că-i ceva specific .net, am ridicat din umeri, am mers mai departe.

Dacă ești ca mine și nu ai avut parte de limbaje strong-typed, overloading înseamnă că poți avea mai multe metode cu același nume dar cu semnături diferite în aceeași clasă. Mai multe detalii pe wiki sau la microsoft

Zilele astea mă uit puțin peste Kotlin și încerc să îmi dau seama cu ce se mănâncă. Și mă lovesc de… overloading! Aflu că este prezent și în Java și încep să cred că este o chestie comună.

Dar… este și o chestie bună? Mie mi se pare anti-pattern, este o construcție a limbajului pentru a ușura scrierea codului, dar îngreunează citirea codului. Iar problema este fix asta: codul este scris o singură dată, dar citit de mult mai multe ori. De aia ne străduim să scriem cod citeț, de aia scriem comentarii, de aia folosim principii SOLID etc.

Sunt convins că pierd din vedere anumite aspecte și că probabil iluminarea va veni odată cu experiența, dar până atunci… este cineva care îmi poate schimba părerea, că overloading-ul este o chestie nepotrivită?

12 Comentarii

Florin a scris

Depinde. Ia de exemplu metoda max din java (clasa Math). Userul iti da doua numere si ar vrea sa afle maximul lor. Nu trebuie sa tina cont ca metoda accepta int/long/double/float/etc. E suficient sa dea doua numere si sa primeasca un rezultat cu valoarea lor maxima.
La fel cu min. Userul trebuie sa stie ca accepti un numar(int, float, etc.) cum tratezi mai departe e treaba ta. Important e ca el sa primeasca rezultatul dorit. Tu ca programator poate intelegi diferenta dintre ele, dar end user-ului nu-i pasa. El stie ca iti poate da doua numere si vrea sa afle care dintre ele are valoarea maxima/minima.

Ionuț Staicu a scris

@Florin: În PHP este întotdeauna o idee proastă să nu filtrezi datele primite de la utilizatori. E.g. nu lași userul să facă `min(a, b)`, ci te asiguri că a și b sunt valide.

Presupun că a accepta doar float, de exemplu, reduce/elimină nevoia de validare. La string pui validare suplimentară șamd. Mda, treaba asta are sens. Mulțumesc :)

Ionuț Staicu a scris

@alex: Cred că unul dintre noi n-a înțeles bine treaba cu overloading :)

class Student:
    def hello(self, name=None):
        if name is not None:
            print('Hey ' + name)
        else:
            print('Hey ')

Overloading e folosit tocmai pentru a scăpa de braching-ul ăla și permite definirea mai multor metode cu același nume (dar cu semnături diferite). I.e. ca să fie overloading, ar fi trebuit să fie ceva de genul:

class Student:
    def hello(self, <string>name):
        print('Hey ' + name)

    def hello(self):
        print('Hey ')
alescx a scris

@alex: php-ul recunoaste ca overloadingul lor e total diferit de majoritatea implementarilor de overloading. din punctul meu de vedere php-ul nu are asa ceva. in schimb ma amuza definitia de la python. pe logica aia orice cod scris cu picioarele e overloading. si orice limbaj are asa ceva.

Ionuț Staicu a scris

@alex: Eu am înțeles la ce este bun. Dar impresia mea în acest moment (i.e. cu ce știu acum) este că face codul mai greu de urmărit fără debugger.

Logica aia din python se poate implementa în orice limbaj cu o funcție de genul `func_get_args` și pac, ai overloading. Ceea ce este fals :)

alex a scris

@Ionuț Staicu:
Daca prin metoda prin care ai descris-o se poate apela functia cu un numar variabil de parametri dupa nevoi, atunci da, probabil ca te poti descurca fara overloading.
In C din cate stiu nu e posibil, parametrii trebuie sa se potriveasca la numar si tip, de aia au bagat smecheria cu semnatura diferita in C++.

Adaugă un comentariurăspuns pentru

Link-urile în context sunt binevenite. Comentariile fără nume/email valid sunt șterse.
PS: Comentariul NU este editabil.

Acest sit folosește Akismet pentru a reduce spamul. Află cum sunt procesate datele comentariilor tale.

Site-ul blog.iamntz.com utilizează cookie-uri. Continuarea navigării presupune acceptarea lor. Mai multe informații.

windows apple dropbox facebook twitter