ugrás a tartalomhoz

Mixins considered harmful

Hidvégi Gábor · 2014. Okt. 13. (H), 20.36
A mixinek problémái
 
1

Tehát a nyelv nem nyújt

Joó Ádám · 2014. Okt. 13. (H), 20.43
Tehát a nyelv nem nyújt megfelelő eszközt az öröklés kézbentartásához, a szerző bloatware frameworköket használ, a sztenderd Python dokumentáció pedig köztudottan egy áttekinthetetlen szemét, ami végső soron nem is lényeges, mert ő a kódkiegészítést akarja használni dokumentációnak – tehát a paradigma a szar.

Minden elismerésem.
2

A két beküldött blogmark

Hidvégi Gábor · 2014. Okt. 13. (H), 22.03
A két beküldött blogmark között van egy kis kontraszt. Az előző azt mondja, hogy "Mixins: The Only Good Solution", míg ez pedig azt, hogy támogatás hiányában és adott körülmények közt eléggé meg tudják nehezíteni az ember életét.
5

Ha az adott körülmények azt

Joó Ádám · 2014. Okt. 13. (H), 22.41
Ha az adott körülmények azt jelenti, hogy egy névtérben sok függvény van, akkor valóban, de ez nem tudom, hogy mond bármit is egy nyelvi konstrukcióról. Egyszeres örökléssel vagy mezei globális függvényekkel is fennáll ugyanez a probléma.
9

Globális függvények

Hidvégi Gábor · 2014. Okt. 14. (K), 09.38
Tegyük fel, hogy területszámító algoritmusokat írsz, akkor azokat objektumoknál úgy hívod meg, hogy
$teglalap = new Teglalap;
$teglalap_terulete = $teglalap->terulet();

Azaz itt a névtér az objektum neve.

Míg globális függvényeknél úgy nevezed el, hogy teglalap_terulet(), kor_terulet().
11

Lookup

Poetro · 2014. Okt. 14. (K), 10.53
Ha a globális névtér túl nagy lesz, akkor a lookup lassú lehet. Ez történhet ugye fordításidőben, illetve futtatás közben. Ha csak fordítás közben lassú (pl C esetén) akkor annyira nem probléma, ugyanakkor ha futásidőben, akkor már problémásabb. És minél nagyobb egy névtér, annál esélyesebb, hogy ütközés történik. Ez fordított nyelvek esetében annyira nem gond, mert a fordító tud figyelmeztetni, de dinamikus nyelveknél rengeteg hibát szülhet, amit nagyon nehéz lehet felderíteni. Ezért törekednek arra, hogy az egyes névterek minél kisebbek legyenek, hogy kisebb legyen az esély az ütközésre.

A két példád között azért elég nagy a különbség. Egy téglalap objektumot nem fogysz csak azért létrehozni, hogy kiszámítsd a területét, inkább sok más célra is fel fogod használni. Például átadod más objektumoknak, függvényeknek, hogy azok további műveleteket végezzenek vele, például átadod a view rétegnek, hogy kirajzolja a koordinátái alapján stb. Ha egy névtérbe csomagolod, akkor könnyebb átadni, nem kell törődni a típusával, csak hogy implementálja a kívánt interfészt.
12

Ha a globális névtér túl nagy

Hidvégi Gábor · 2014. Okt. 14. (K), 11.27
Ha a globális névtér túl nagy lesz, akkor a lookup lassú lehet.
Igen, ezen már gondolkodtam múltkor is, miután válaszoltál a felvetésemre. OOP esetén nem tudom, mit lehet megspórolni, főleg többszörös öröklődés esetén, mivel tudtommal ilyenkor a "végső" meghívott metódus címét csak futásidőben lehet "kiszámolni". PHP esetében, ahol őrültség nem használni bármilyen kódgyorsítót, például APC vagy eAccelerator, amelyek bájtkódot készítenek, globális függvények használatakor le lehet optimalizálni úgy ezt a gyorstárazott kódot, hogy valamilyen módon közvetlen mutatót tesznek ezekre a függvényekre.
13

Öröklődés

Poetro · 2014. Okt. 14. (K), 12.19
Többszörös öröklődés esetén is történhet a megfelelő függvény kiválasztása fordítás során. Persze nem tudom, mit értessz többszörös öröklődésen. A C++ féle öröklődést, amikor egy osztály több osztálytól örököl, vagy amikor van egy több lépcsős öröklődési lánc. Mindkét esetben valamilyen algoritmus teszi egyértleművé, melyik függvény lesz ténylegesen meghívva, és azt lehet egy mutatóval gyorsítótárazni (és a legtöbb futtatókörnyezet ezt meg is teszi).
3

Csalás

vbence · 2014. Okt. 13. (H), 22.07
Azért van benne egy elég nagy csalás. A Dependency Injectionös megoldásban létezik:
$book->setPersistence()
Vagyis egyszerre lehet két vagy több perzisztencia szolgáltatás a memóriában, amíg a generált változat global state-re alapoz (apc_store / apc_fetch).

A $book->persist() eleve egy szörnyű megközelítés. De ezt kitárgyaltuk a minap egy másik témában :)
6

A rossz blogmark alá küldted

Joó Ádám · 2014. Okt. 13. (H), 22.42
A rossz blogmark alá küldted :)
8

Óh,

vbence · 2014. Okt. 13. (H), 23.28
úgyfest. :)
4

Kérdés

Hidvégi Gábor · 2014. Okt. 13. (H), 22.11
Amit még nem teljesen értek, hogy a mixinek miben különböznek attól, mintha szimpla függvényeket hívogatnék?
7

Nem értem a kérdésed.

Joó Ádám · 2014. Okt. 13. (H), 22.50
Nem értem a kérdésed.
10

Talán a 9-es hozzászólás

Hidvégi Gábor · 2014. Okt. 14. (K), 09.48
Talán a 9-es hozzászólás közelebb visz hozzá.
14

Gyakorlatilag multiple

Joó Ádám · 2014. Okt. 14. (K), 14.05
Gyakorlatilag multiple inheritance-ről van szó.