Method overloading (JavaScript)
Helló guruk!
Párszor esett már szó Weblaboron az overloading-ról a JavaScript vonatkozásában, de nem beszéltük teljességgel a dolgot. Szeretném bővíteni a repertoáromat a rugalmasság érdekében, és érdekelne a véleményetek/tapasztalatotok a kérdésben.
Több egyszerűbb megvalósítást láttam már, ahol csupán a paraméter szám alapján lett implementálva a dolog, vagy éppen a natív typeof-ra alapozva.
Az instanceof köztudott, hogy nem ugyan azt adja vissza minden esetben IE alatt mint más böngészőkben, pl. a Window vagy a Node objektumok esetében, viszont mégis jó lenne túl menni a typeof képességein.
Van egy két ötletem, de nem tudom meddig érdemes elmenni a megvalósításban. Aki ráér, kifejthetné gondolatait a témával kapcsolatban.
■ Párszor esett már szó Weblaboron az overloading-ról a JavaScript vonatkozásában, de nem beszéltük teljességgel a dolgot. Szeretném bővíteni a repertoáromat a rugalmasság érdekében, és érdekelne a véleményetek/tapasztalatotok a kérdésben.
Több egyszerűbb megvalósítást láttam már, ahol csupán a paraméter szám alapján lett implementálva a dolog, vagy éppen a natív typeof-ra alapozva.
Az instanceof köztudott, hogy nem ugyan azt adja vissza minden esetben IE alatt mint más böngészőkben, pl. a Window vagy a Node objektumok esetében, viszont mégis jó lenne túl menni a typeof képességein.
Van egy két ötletem, de nem tudom meddig érdemes elmenni a megvalósításban. Aki ráér, kifejthetné gondolatait a témával kapcsolatban.
Tudnál mondani egy példát,
Például van egy függvényed,
show_ingatlans({helyseg: "budapest", ar1: "5M", ar2: "10M"});
Hát ez pl nagyon nem
Példát ezret is tudnék... Pl.
De a jQuery sem végez típus ellenőrzést csak ha az adott függvényben erre külön kitérnek.
Ha pl. egy hasonló függvényt szeretnék mint a jQuery.fn.css, akkor én úgy szeretném hogy:
- (String name, String value) - vagyis két String típusú adat a stílus beállításához,
- vagy (StyleMap styles) - egy olyan objektum ami definiál több tulajdonságot, és beállítja azokat,
- vagy () az az semmi - ami mondjuk vissza adja az adott elemhez tartozó StyleMap-et.
- minden egyéb esetben ha pl. a paraméter egy Object de nem köthető a StyleMap osztályhoz akkor kivétellel tovább menni.
Objektum paraméternek
Ezt én is szoktam, csak most
Maga a probléma nagyon
Ugyanez chain-ben (mondjuk én ezt nagyon nem szeretem):
Ha olyat akarsz, hogy a függvények saját maguk is ellenőrizzék a paraméter listát, és kivételt dobjanak, akkor mindenképp kell nekik egy isValid(args) metódus, amivel tudathatják az overload-dal, hogy elfogadják e a paraméter listát vagy sem. A kivételek elkapása azért nem játszik, mert nem tudod megállapítani, hogy milyen mélységből jönnek, szóval hogy a függvény paraméterlistájának a validálása váltotta e ki őket, vagy a függvény blokkjában található kód.
Nem tudom ezeken kívül még milyen megoldások vannak, majd másold be, hogy melyik jött be neked...
Én mondjuk amellett vagyok, hogy ilyesmik általában akkor fodulnak elő, ha egy viszonylag nagy kódrészlethez akarsz egy egységes felületet csinálni. Ebben az esetben szerintem érdemes egy külön függvényt csinálni, amiben kézzel ellenőrzöd a paraméter listát, és aszerint osztod tovább a kéréseket. Nem hiszem, hogy érdemes erre általános megoldást készíteni ha nincsenek kész validator-aid, amiket amúgy máshol is felhasználsz...
Igazából onnan jött nekem az
Nos van egy EventTarget aminek van egy dispatch metódusa ami ugye egy Event objektummal működik alap esetben. A dispatch metódust akarom átírni úgy, hogy ha nem egy Event objektumot kap akkor készítsen egyet és dolgozzon avval. A dispatch ebben az esetben plusz két esettel bővül, és így 3 alak lehetséges:
- dispatch(Event e)
- dispatch(String type)
- dispatch(String type, Object detail)
Ha nincs egyezés akkor hiba.
Ennek apropóján jutott eszembe az overloading, amit azért szeretnék mert a kódom még nem annyira nagy hogy az osztályokat nagy meló legyen átírogatni, és a későbbiekben ahogy bővítem a könyvtáramat akkor támaszkodhatnék erre a hasznos funkcióra ami a js-ből kimaradt.
------------------
Na ja ezt jobb elől látni mik az elvárások, de végső soron működhet ha máshogy nem lehet. :)
Egyébként még olyan problémám is van, hogy nem tudom hogy kezeljem azokat a objektumokat amiknek primitív típusa is van. Pl. ha van egy olyan feltétel hogy (String type) és függvényhíváskor egy primitív típussal paramétereznek akkor azt át kell e engedni vagy nem. Csak mert eléggé hosszú listákat lehet írni ha úgy kel írogatnom a függvényhívásokat, hogy: valamiHivas(new String("arg1"), new String("arg2")), szóval ezért kértem a véleményeteket mert sok a kérdőjel... :D
Csináltam egy kisebb
Ami érdekesség: a null object típusú, de nem Object instance, az undefined ellenben már undefined típusú. A natív osztályok példányai Object instance-ok is egyben, ami valahol érthető lenne, ha máshol nem lenne káosz. Régebbi msie-nél vagy 9-esnél ha nem adsz meg doctype-ot, akkor a DOM kezelhetetlen, mert nem Object instance-ok vannak benne, és ezért hibával elszállnak, ha tulajdonságot akarsz elkérni vagy beállítani. Azt hiszem régebbi opera-nál a DOM Node-ok típusa function volt, nem tudom, most mi a helyzet vele. A NaN (not a number) típusa number. ^^
Kihagytam valamit?
Object.prototype.toString.call
A null-nál az a zavaró, hogy
pl:
jQuery példája
Pontosan mi a cél?
Igaz, hogy néhány karakterrel hosszabb, de a getHeight(), setHeight(100), apply illetve applyIf sokkal olvashatóbb kódot eredményez. És felesleges ellenőrzésektől mentes, kód írásakor pontosan tudom, hogy mit szeretnék, nem kell a böngészőnek futás időben kitalálni…
A fenti show_ingatlans példát még nézni is rossz. Bocs, de tényleg!
Amit én használnék, ha az lenne a cél, hogy 1. átadhatunk egy elemet, vagy tömbben több elemet, illetve 2. átadhatunk ingatlan azonosítót, vagy ingatlant, akkor valami ilyesmit csinálnék:
Amit szeretnék az a
Pl. amit nem szeretek az a sok if else ág, és amikor változók tartalmát cserélgetem fel, a változó paraméterhossz miatt.
Egy típusnélküli nyelvben nem
Más nyelv
+1, szerintem sincs értelme
A GWT nem jött be. A Darts
A fenti show_ingatlans példát
Mea culpa!
Az általad mutatott két paraméter az ugyanolyan szűrő, gyakorlatilag semmi különbség nincs benne:
Fátylat rá
Srácok köszönöm az eszme
Igazából ez a paraméterezés
- ha asszociatív tömböt adok át, akkor nem tudok automatikus kiegészítést használni hozzá, viszont ha meg nem azzal paraméterezem az osztályaimat, akkor meg egy tonna kódot és vátozót használok, és nem lesz annyira átlátható
- vannak olyan metódusok, amiknek akkor kell csak egyszer lefutnia, ha minden paraméter be van állítva, sem előbb, sem később
A dependency injection megoldás lenne ezekre, csak úgy érzem, hogy 2-3 paraméter miatt még egy osztályt behozni a képbe kicsit túlbonyolítása a problémának. Jó lenne, ha lenne egy olyan nyelv, aminél a paraméterezés alapból asszociatív tömbbel menne, és működne rá az automatikus kiegészítő.
Ruby, Objective-C