Kezdőoldal » Számítástechnika » Programozás » Miért szokták ilyen sokat...

Miért szokták ilyen sokat használni a változókat?

Figyelt kérdés

Pl van egy ilyen:

$valami = getTeszt();

És a $valami megvan hívva 2 helyen.

Olyankor nem érdemesebb inkább új változó helyett a getTeszt();-et írni a változó helyére?



2017. aug. 1. 21:40
 1/8 anonim ***** válasza:
100%

Nem. A getTest egy függvény, egy visszatérési értékkel. A név alapján valami teszteredményt ad vissza.

Ha mindenhová beírod a getTeszt-et, minden alkalommal lefut a getTeszt, és az is lehet, hogy mindig más eredményt ad (például ha terheltségi teszt).

Viszont így egyszer lefuttatod, és az eredményét mented el a változóba, és azzal az egy eredménnyel dolgozol tovább

2017. aug. 1. 21:44
Hasznos számodra ez a válasz?
 2/8 anonim ***** válasza:
100%
plusz ha a getTeszt() időigényes funkció akkor többszörösen fogja az időt rabolni.
2017. aug. 1. 21:54
Hasznos számodra ez a válasz?
 3/8 anonim ***** válasza:
100%

A többiek már elmondták, hogy mi az értelme. Viszont megpróbálnám laikusok számára is érthetően elmagyarázni.


Ez a getTeszt() csinál valamit, és ennek eredménye van. Olyan, mintha odamennék hozzád azzal, hogy:

- Mennyi 2974*1873?


Ezzel el fogsz szöszölni egy darabig, aztán rávágod, hogy 5570302. Melyik a gyorsabb? Leírom az eredményt egy lapra, és amikor kell, már nem kell újra kiszámoltatnom veled; vagy ha akárhányszor kell ez az eredmény, mindig kiszámoltatom veled?

2017. aug. 1. 23:08
Hasznos számodra ez a válasz?
 4/8 tabaki ***** válasza:
100%
Én hallottam olyan esetről, hogy valaki a naplójában nézett utána, esett-e az eső a legutóbbi szülinapján, pedig egyszerűbb lett volna még egyszer meghívni a getTeszt()-et, vagyis kinézni az ablakon. Fura világ, fura szokásokkal, de nekem tetszik.
2017. aug. 2. 09:00
Hasznos számodra ez a válasz?
 5/8 anonim ***** válasza:
100%

tabaki: mármint a naplójában megnézi, hogy mit kell csinálni, hogy hol van leírva, hogy mit kell csinálni hogy megtudd, esik-e az eső. A naplóban látod, hogy a polcon az 5. sorban lévő 4. könyv 13. oldala. Ahol ezt írják:

Állj fel a székből, menj az ablakhoz, húzd fel a redőnyt, nézz ki, menj vissza.

Na melyik az egyszerűbb?:) Megmondani az utolsó állapotot vagy újra megnézni... persze az első esetben nem friss lesz az eredmény, lehet azóta már nem is esik.

2017. aug. 2. 21:29
Hasznos számodra ez a válasz?
 6/8 anonim ***** válasza:
100%
Vagy ha azt akarod mondani, hogy irrelevéns, hogy most esik-e, a kérdés, hogy akkor esett-e, akkor igazad van, bocs:)
2017. aug. 2. 21:31
Hasznos számodra ez a válasz?
 7/8 2*Sü ***** válasza:
100%

Néhány triviális probléma:


Mondjuk a jelenlegi időpontból generálsz valamilyen azonosítót – mondjuk egy hibabejelentő oldalon egy ticket azonosítót –, amit egyrészt beírsz egy adatbázisba, másrészt kiteszed a kimenetre. (Most tekintsünk el attól, hogy ez nagyon rossz ötlet, mert ütközhet két ticket, ha ugyanabban a másodpercben generálták.)


function insert_ticket_to_database($timestamp, …) {

// Itt beírja az adatbázis megfelelő táblájába a létrehozott hibajegyet,

// ahol a $timestamp lesz a jegy egyedi azonosítója

}


insert_ticket_to_database(time() , …);

echo "A hibajegyed azonosítója: " . time();


Mi a probléma? Lehet, hogy a két time() hívás között pont ugrik eggyel a másodperc, így az más idő lesz beírva az adatbázisba és más idő lesz kiírva a kimenetre. A helyes megoldás:


$timestamp = time();

insert_ticket_to_database($timestamp, …);

echo "A hibajegyed azonosítója: " . $timestamp;


Így biztos, hogy az adatbázisba ugyanaz az időbélyeg kerül, mint ami a kimenetre.


~ ~ ~


A másik probléma:


Mondjuk van egy függvényed, ami visszaadja az első százezer prímszámot egy tömbben. (Ez sem a legjobb példa, de szemléltetésnek jó lesz.)


function getprimes() {

// Itt szépen lassan kiszámolja, hogy melyik az első tízezer prímszám.

}


if (!in_array($a, getprimes()) echo "Az első megadott szám nem prím!";

if (!in_array($b, getprimes()) echo "A második megadott szám nem prím!";


Mondjuk a getprimes függvény fut 10 másodpercig. Ha így csinálod, akkor mindkét feltétel ellenőrzésnél lefut, így összességében 20 másodpercig fut a kódod.


Megoldás:


$primes = getprimes();


if (!in_array($a, $primes) echo "Az első megadott szám nem prím!";

if (!in_array($b, $primes) echo "A második megadott szám nem prím!";


Így a getprimes függvény csak egyszer lesz meghívva, az eltart 10 másodpercig. A feltétel ellenőrzés már a kiszámolt tömböt használja, így annak kicsi az időigénye. Az ellenőrzés 20 másodperc helyett 10 másodperc alatt végrehajtódik.


~ ~ ~


for($i=0 ; $i < count($tomb) ; $i++) {

// …

}


Mi a probléma? Az, hogy a count minden egyes ciklusléptetésnél lefut. (Ami egyébként elég gyors, tehát legtöbbször nem akkora probléma.) Ha nagy a tömb és eléggé időkritikus a futás, akkor ezzel értékes időt vesztesz. Akkor már jobb így:


$db = count($tomb);

for($i=0; $i < $db; $i++) {

// …

}


~ ~ ~


Néha még ott is megfontolandó változókat használni, ahol amúgy az értéket egyszer használjuk, és futásidővel, memóriahasználattal is rosszabbul járunk, viszont cserébe áttekinthetőbb lesz a kód.


Pl.:


function write_to_log($userid, $date, $action, $ip, …);


write_to_log($_SESSION['user']['id'], date('Y-m-d H:i:s), isset($_GET['action'])?$_GET['action']:'no action', $_SERVER['HTTP_CLIENT_IP'], …);


Most ha 10 paramétere van a write_to_log függvénynek, akkor ez így „kissé” átláthatatlanná válik. Valamennyit segít, ha a híváskor minden paramétert külön sorba írsz, de ott is el lehet tévedni. Itt megfontolandó lehet egy ilyen megoldás is:


$userid = $_SESSION['user']['id'];

$date = date('Y-m-d H:i:s);

$action = isset($_GET['action'])?$_GET['action']:'no action';

$ip = $_SERVER['HTTP_CLIENT_IP'];


write_to_log($userid, $date, $action, $ip, …);


Így a write_to_log függvényhívását egyszerűen csak át kell másolni a függvény definíciójából. Biztosabb, hogy nem kevered össze a paraméterek sorrendjét, nem hagysz ki egy paramétert sem.


~ ~ ~


Olyan triviális esetekről ne is beszéljünk, ha mondjuk egy véletlen számot kell generálni, majd több helyen felhasználni.

2017. aug. 4. 11:52
Hasznos számodra ez a válasz?
 8/8 2*Sü ***** válasza:
100%
(Elnézést az okozott szintaktikai hibákért. :-) )
2017. aug. 4. 11:52
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!