Az alábbiba futottam bele így ma, a munka ünnepén. Adott a következő kód:
A kimenet pedig egészen megdöbbentően a következő:
Exception, osztálya: MasikKivetelException
Vagyis, nem a megfelelő kivétel kerül elkapásra, mindenképpen a legvégére, az Exception
kódblokkjába kerül a vezérlés.
Nem írtam el, nem hibás az öröklődés, átírtam már ötvenmillióképpen, de mégis ezt dobja. PHP 5.2.17. Lehet át kellene állni PHP 5.3.6-ra?
A kód persze pontosan nem ez, lehet hogy így egymagában működik, de az elv ugyanaz. Jön a kivétel, az az osztálya, ami, de mégsem ott lesz elkapva, ahol kellene.
Tetszett a bejegyzés?
Megköszönöm, ha nyomsz rá egy like-ot vagy megosztod másokkal:
Mao
2011. május 01. — 13:23:39
hm, érdekes. mondhatni lol. írj egy switch(get_class($e))… -t a legutolsó blokkba és kezeld ott le az eseteket a különböző kivételekre, jobb ötletem nincs:D
Mefi
2011. május 01. — 13:29:39
[re=6064139]Mao[/re]: én is erre gondoltam, de ez alapjaiban rengeti meg a szép kóddal szemben elvárt követelményeimet 😀
Karbonade
2011. május 01. — 13:59:12
[re=6064140]Mefi[/re]: Hahaha! Szép kód nincs, a saját kódod is csak most szép, majd megnézed pár év múlva, és egy nagy trágya gányolásnak fogod látni a szép kódodat. A másé pedig mindig ronda 🙂
Apropó, az RSS-ben nem jött át a kódrészlet, valamint a kódrésznél nem kéne bele sortörés, itt inkább a vízszintes scrollbar lenne jó helyette…
Igazi informatikusként belepofáztam, viszont a megoldást nem tudom 🙂 Érdemes lenne utánanézni, mitől van ez, szerintem működnie kéne.
saxus
2011. május 01. — 14:06:02
Nem találtál még erre bugreportot, amelyben kifejtik, hogy ez nem bug, hanem feature és egy jani@php.net -s arc zárta le? :))
Inkább az ilyen sztorik a szomorúak a PHP tájékán…
kacsa
2011. május 01. — 14:09:20
class EgyikKivetel extends Exception {
}
class MasikKivetelException extends Exception {
}
class Ojjektum {
public function kiveteltHajigaloMuvelet() {
throw new MasikKivetelException();
}
}
try {
$ojjektum = new Ojjektum();
$ojjektum->kiveteltHajigaloMuvelet();
} catch(EgyikKivetel $ek) {
die(‘EgyikKivetel, osztálya: ‘ . get_class($ek));
} catch(MasikKivetelException $mk) {
die(‘MasikKivetel, osztálya: ‘ . get_class($mk));
} catch(Exception $e) {
die(‘Exception, osztálya: ‘ . get_class($e));
}
5.2.17 és 5.3 alatt is a MasikKivetelException-ba fut be nálam.
saxus
2011. május 01. — 14:21:47
[re=6064145]kacsa[/re]: Detto.
http://pastebin.com/Rw0w3hkE
c:\>php -f foo.php
5.3.3
FooException: FooException
c:\>”C:\Program Files\Apache Software Foundation\php\php.exe” -f foo.php
5.2.6
FooException: FooException
c:\>”C:\Program Files\Apache Software Foundation\php52\php.exe” -f foo.php
5.2.17
FooException: FooException
WinXP
De van még ilyen is:
$ uname -imprsv
FreeBSD 8.0-RELEASE FreeBSD 8.0-RELEASE #0: Sat Nov 21 15:02:08 UTC 2009 root@mason.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC amd64 amd64 GENERIC
$ php -f foo.php
5.2.11
FooException: FooException
—
Szóval “a hiba az ön készülékében van.” Milyen OS, milyen PHP, milyen plusz patchekkel?
Mefi
2011. május 01. — 15:21:13
[re=6064143]Karbonade[/re]: szerintem azért nem ment át, mert iframe-ben van, és lehet a Reader azt pl. tiltja.
[re=6064144]saxus[/re]: nem. 😀
[re=6064145]kacsa[/re]: persze, mondom, ez a kód nálam is megy, csak a problémakör hasonló. Nem tudom mi lehet a háttérben.
[re=6064146]saxus[/re]: WinXP, OS X és a linuxos szerver alatt is ezt csinálja. 😀
Haszprus
2011. május 01. — 16:30:14
ilyenkor szokott az lenni hogy egy karakter valahol el van írva és ha 50-edjére olvasod akkor se látod 🙂
Athos
2011. május 01. — 22:51:40
Pont a minap láttam én is valami kapitális hülyeséget, amire ha megőrülök, sem bírok rájönni, hogy mitől volt. Metódusok felülbírálása miatt nyavajgott valamit szegény interpreter, hogy a gyerek osztály metódusa nem kompatibilis a szülőével (type hinting rulez). Mindezt olyan szituációban, amin nyilvánvalóan látszott, hogy márpedig kompatibilis. (Arról már nem is beszélve, hogy felülbírálásnál sok esetben nem is szól, ha a gyerek osztályban teljesen megváltozik egy metódus szignatúrája.) Sőt, amikor próbáltam összehozni egy tökéletesen ugyanolyan példakódot, akkor meg már megette. Félóra szenvedés után megoldottam inkább máshogy, és azóta már el is felejtettem, de ha lesz egy kis időm, megpróbálom reprodukálni. A lényeg: 5.3 volt. 🙂
Btw. ha már tiszta kód, akkor hagy reklámozzam engem: http://www.slideshare.net/athoshun/clean-code-7698174
saxus
2011. május 02. — 12:34:03
[re=6064150]Athos[/re]: A diasorodhoz egy félmondat: értem a DRY lényegét, de egy Exception dobást kiemelni szerintem nagyon rossz ötlet. (Értem én, példa, de rossz példa). Exception dobása történjen ott, ahol a kivétel születik és ne a világ másik végén. Szerintem.
Athos
2011. május 02. — 22:26:43
[re=6064151]saxus[/re]: szvsz feladata válogatja. (További refaktorizációval egyébként még ettől a problémától is meg lehet szabadulni.)
Mefi
2011. május 03. — 00:12:39
[re=6064150]Athos[/re]: hovatovább erről az a véleményem, hogy szép dolog amikor pár sor kódot látsz, de azt csak betonstabil alapokkal teheted meg, mert egyébként amikor már a hatvanadik osztályban turkálsz, de még mindig nem látod mit csinál a kód, az sokszor kényelmetlen kissé.
Athos
2011. május 03. — 11:17:52
[re=6064158]Mefi[/re]: lehet, csak en vagyok ilyen szerencsetlen, de tobbet szivtam eddig kilometeres (ertsd: agyonbonyolitott, kepernyo jobb szeleig indentalt) fuggvenyek es svajcibicska osztalyok miatt, mint mar-mar “elaprozodott” osztalyhierarchiaval. Utobbi altalaban egyutt jar sok-sok unit teszttel, amik mar eleve meg tudjak sporolni egy rakas hiba kinyomozasat, illetve amikor a tesztek egy csoportja hibat jelez, maris konnyebben tudja az ember, hova kell nyulni (foleg, ha legalabb minimalis szintu DI is hasznalatban van). A hatvanadik osztalyig jo esellyel azert tud elgyuruzni egy problema, mert mar eleve gondok vannak a kod architekturajaval. Law of Demeter rlz. 🙂
A tulzott es az elnagyolt absztrakcio kozotti egyensuly megtalalasa persze nem egyszeru feladat. Sot sokszor jobb eredmenyre vezet azutan helyreallitani, miutan mar felborult, hiszen akkor mar pontosan tudja az ember, milyen problemakat akar/kell megoldani a kod felepitesevel kapcsolatban. Ezek az elvek nem okolszabalyok, csak segitenek eszrevenni, mikor mar elkezd recsegni a kod szerkezete.
saxus
2011. május 03. — 20:17:42
[re=6064160]Athos[/re]: Mefivel tudok egyetérteni itt. Pont egy ilyen agyonaprózott kódot kellett most átvennem és hát khm. Mikor már kezdtem azt hinni, hogy átláttam az architektúrát, akkor jöttek elő az újabb meglepetések.
A jobb oldalig betabolt cucc persze már megint a másik véglet. De a egy-két-három sornyi kód kiemelése (ld. Exception dobása) az szintén az, ami a másik véglet.
Arról nem is beszélve, hogy annyira nem szerencsés, amikor már a 60. metódus-hivogatás történik, főleg egy PHP-ben.
DI-től meg a hideg kiráz. Megold egy problémát, cserébe behoz 4 másikat és sokkal nagyobb és bonyolultabb a karbantartandó kód is. (Most abba ne menjünk bele, hogy mi mit generál).
Szvsz, főleg egy PHP esetén, ahol többnyire fix alapokra építkezünk és az esetek nagyobb részében kis-közepes projektek vannak (<1M loc), nem minden esetben indokolt az egészet a DI köré szervezni.
Persze, ez az egész arról szól, hogy a globális változó az csúnya gonosz, mert felül lehet csapni a singleton meg maga a sátán, mert nehéz miatta unit tesztelni. Arról meg senki nem szól, hogy igazából tipikus esetben van 4-8 globalizálandó osztály, amely fixen kell, mielőtt bármibe is belekezdünk és ha egy világos design doksiba leírják a programozónak, hogy "NE merd elrontani, mert eltörjük kezed-lábad", akkor is szép meg jó meg egyszerű és karbantartható a rendszer. (Persze, az ember szeret szép architekturális felhőkarcolókat építgetni, mert jó móka. Tudom, én is voltam így 🙂
http://weblabor.hu/forumok/temak/108340
Ugyanolyan keresztesháború, mint a goto. “Ne használd, mert vannak “programozók”, akik nem tudják, hogy mire való.” Az ilyenekre meg annyit tudok mondani, hogy nem kell minden gyökérnek programozónak menni.
http://hup.hu/node/102441
Athos
2011. május 04. — 22:17:52
[re=6064161]saxus[/re]: U R doin it rong. Nem a globalis valtozok, singletonok es egyebek ellen szolnak ezek az elvek ugy _altalaban_. (Btw. vicces bugokat okozhat, ha hasznalsz ket modult/libet/akarmit, amik kozott globalis valtozo neve utkozik.) Inkabb arrol van szo, hogy van az a kodmeret (tapasztalataim szerint nagysagrendekel 1M loc alatt), amikor mar megeri a ragasztoszalag nagy reszet kikaparni a kodbol, es feltakaritani az architekturat. Nem kell egybol urhajot epiteni, eleg, ha a bicikli szogletes kereket kicsereli az ember egy kerekebbre, hogy konnyebben guruljon. Egy egyszerubb webshopnal, blogmotornal jo esellyel teljesen felesleges ilyesmivel tolteni az idot, de ahogy a kod hizik (uj ficsorok, clever hack-ek, gany workaroundok), elobb-utobb eljon az a pont, amikor nagyjabol harom opcio kozul lehet valasztani: 1. meghal a project, 2. ujrairjak nullarol, 3. ki kell takaritani az architekturat. Ezt egyebkent sokszor epp egy nagyobb feature hozzaadasa generalja. A negyedik lehetoseg, irrealis idot aldozni a hibak tovabbi, veget nem ero foltozgatasara, ilyenkor mar egyszeruen nem eri meg.
Ha a kodod akkora vagy olyan, hogy a DI bonyolitja ahelyett, hogy egyszerusitene, akkor valoszinuleg nincs eppen ott szukseged ra, ne hasznald, ilyen egyszeru (pont errol szol a tortenet). Nem art viszont tudni, hogy mi fan terem, kulonben akkor sem fogod hasznalni, amikor valoban szukseged lenne ra (hiszen eszre sem fogod venni, hogy az adott esetben DI kellene). Ha megengeded, ideznelek (no offense):
-8<------------------------ „Ne használd, mert vannak ”programozók", akik nem tudják, hogy mire való." Az ilyenekre meg annyit tudok mondani, hogy nem kell minden gyökérnek programozónak menni. -8<------------------------ A gotoval egyebkent semmi gond nincs, C-ben pl. van letjogosultsaga, a hibakezeles ismetlodeset szepen el lehet vele kerulni (vo: exception-ok mas nyelvekben). Baj akkor van, amikor egy trivialisnal bonyolultabb algoritmus szerves reszekent talalkozol vele, amely algoritmusban epp egy hibat szeretnel megtalalni es kijavitani. (Van oka annak, hogy az assembly kiszorult a mainstream szoftverfejlesztesbol, ugy ertem, reverse engineering vagy forditoiras kozben peldaul hasznos, de blogmotort valoszinuleg valami mas nyelven irnek.) Szeretem en is a frappans megoldasokat, ugyes hackeket, de aki utanam kovetkezokent nyul majd a kodomhoz, azt nem azert fizetik, hogy ezeket kerulgesse. Ha nem botlanek lepten-nyomon epic facepalmokba mindenfele legacy kodokban, amikkel osszeakadok, eszem agaban sem lett volna ennek a temanak utanaolvasni.
saxus
2011. május 12. — 04:56:35
[re=6064167]Athos[/re]: Nah, csak az utókor kedvéért:
“Btw. vicces bugokat okozhat, ha hasznalsz ket modult/libet/akarmit, amik kozott globalis valtozo neve utkozik.”
Ez nyilván tervezési fasság, ez lokális, modulon belüli dolog. Globálisnak nyilván azt kell használni, ami valóban globális, mindenki számára elérhető.
tiny
2011. május 12. — 09:08:48
“Ha nem botlanek lepten-nyomon epic facepalmokba mindenfele legacy kodokban” 😀 fuck yeah