Informatika2-2015/Eloadas 5 Python-5 Meg referenciak Hibakezeles

A MathWikiből
A lap korábbi változatát látod, amilyen Csirke (vitalap | szerkesztései) 2015. március 11., 10:13-kor történt szerkesztése után volt.
(eltér) ←Régebbi változat | Aktuális változat (eltér) | Újabb változat→ (eltér)

Referenciák még kicsit

Jó paraméter módosítás

Nézzünk egy konkrét példát amikor érdemes kihasználni az objektumok változtathatóságát, hogy referenciákon keresztül férek hozzájuk. A következő példában egy adatbázis bejelentkezését kezelem, és van egy szótáram ami tárolja hogy melyik felhasználónak hány sikertelen belépése volt. Itt egy kódvázlat ami követi az eddigi tanácsaimat, és nem módosít bele paraméterként kapott változóba:

link

Azt láthatjuk, hogy a 8-12 lépéseknél két másolat is van az adatokról, amik nem, vagy csak alig térnek el egymástól. Elképzelhető lenne, ha elég nagy a rendszer, hogy ez a szótár nem csak 3 felhasználót tárol, hanem több ezret. Ezzel egy akár néhány megabyte-os új objektumot hozok létre a memóriában. (Lehet még optimalizálni a kódot, hogy csak akkor másolja le ha tényleg belemódosít, de az most mindegy.)

Azonban, ha nem lesz szükség az eredeti változatra később (és ebben az esetben miért lenne), akkor módosíthatom a paramétert:

link

Amit itt meg kell figyelni, hogy:

  • Le van dokumentálva hogy módosítom a paramétert. (Ha valamelyik felhasználó nem szeretné hogy módosuljon az objektuma, még mindig adhat csak egy másolatot át.)
  • Nincs visszatérési érték. Ez általános módszer annak a jelzésére hogy nem egy módosított változat készült, hanem az eredeti objektum módosult.

Általánosságban pont ezért módosíthatóak az objektumok, mert nagy adathalmazoknál nem engedhető meg mindig másolat készítése. A CloudCoder-ben írt és hasonló gyakorló jellegű feladatok megoldásánál továbbra is azt ajánlom hogy egyik függvényetek se módosítson a paraméterein, hanem csak ha biztosak vagytok benne hogy kell, azt kezeljétek speciális esetként.

Referencia mint mutató

Az a koncepció, hogy az objektumok léteznek a memóriában, attól függetlenül hogy milyen néven hívjuk őket, és a változók csak referenciák amik mutatnak ezekre az objektumokra, segíthet értelmezni a következő kódot:

link

Egészen a 7-es lépésig az a felfogás, hogy ezek a listák egymáson belül vannak, működik teljesen jól. Print-elve is így néz ki, 3 lista egymáson belül. Azonban az utolsó két sor értelmezéséhez el kell felejtenünk ezt az elképzelést. Ez már csak akkor értelmezhető, ha a listáimat egy-egy gráf pontjaiként értelmezem, amik között irányított élek vannak. Egy-egy referencia mutathat egy változóból, vagy egy lista vagy szótár egy eleméből, egy tetszőleges objektumra.

Ez a felfogás mutatja, hogy az ilyen egymásba zárójelezett listák pl. egy faszerkezetet jelképeznek gráfként nézve. Ennek megfelelően manipulálhatóak is:

link

Egyelőre nem kell ezt ilyen műveletekre felhasználnotok, de jó ha elkezdtek átszokni erre a gondolkodásra, mert akkor könnyebb lesz megérteni a programok működését sok esetben.

Személyes eszközök