ugrás a tartalomhoz

PHP class vélemény

tóthika · 2014. Aug. 14. (Cs), 20.44
Sziasztok!

Úgy érzem, hogy most már továbbléphetek egy másik programozási "taktika" felé (Bocs, ha most egy nagy marhaságot írtam :D), ezért nekiálltam egy kis olvasás után ezt megírni. Egy rendszerbe lenne beleépítve. Kérdésem annyi lenne, hogy ez így valahogy elfogadható-e, továbbtanulás szempontjából, és hogy gyorsabb-e egy ilyen osztály, mint 8 változó használata?

(Tudom, a kivételeknek majd utána kell néznem.)

class Uzenet{
	//hiba kijelzése?
	private $hibajelzes = false;
	
	private $profilid = 0;//üzenet-tulajdonos profiljának ID-je
	private $tipus = 0;//1-szöveges, 2-szöveg+médiafájl
	private $id = 0;//üzenet-száma
	private $megjelen = Array();//üzenet tartalma
	private $profkep = "";//felhasználó profilképje (aktuális)
	private $mediafel = "";//HA tipus == 2, akkor a médiafájl tartalma
	private $akkorinev = "";//az akkori neve
	private $ido = Array();//üzenet idejét tartalmazó tömb
	
	public function setProfil($id)
	{
		if($id != "" && $id && $this)
		{
			$this->profilid = $id;
			return true;
		}
		else
		{
			if($this->hibajelzes == true)
			{
				return "!2!";
			}
		}
	}
	public function getProfil()
	{
		if($this->profilid != "" && $this->profilid && $this)
		{
			return $this->profilid;
		}
		else
		{
			if($this->hibajelzes == true)
			{
				return "!3!";
			}
		}
	}
	public function setTipus($type)
	{
		if($type != "" && $type && $this)
		{
			$this->tipus = $type;
			return true;
		}
		else
		{
			if($this->hibajelzes == true)
			{
				return "!2!";
			}
		}
	}
	public function getTipus()
	{
		if($this->tipus != "" && $this->tipus && $this)
		{
			return $this->tipus;
		}
		else
		{
			if($this->hibajelzes == true)
			{
				return "!3!";
			}
		}
	}
	public function setUzenetId($id)
	{
		if($id != "" && $id && $this)
		{
			$this->id = $id;
			return true;
		}
		else
		{
			if($this->hibajelzes == true)
			{
				return "!2!";
			}
		}
	}
	public function getUzenetId()
	{
		if($this->id != "" && $this->id && $this)
		{
			return $this->id;
		}
		else
		{
			if($this->hibajelzes == true)
			{
				return "!3!";
			}
		}
	}
	public function setUzenet($el, $ma)
	{
		if($el != "" && $ma != "" && $el && $ma && $this)
		{
			$this->megjelen[0] = $el;
			$this->megjelen[1] = $ma;
			return true;
		}
		else
		{
			if($this->hibajelzes == true)
			{
				return "!2!";
			}
		}
	}
	public function getUzenet()
	{
		if($this->megjelen != "" && $this->megjelen && $this)
		{
			return $this->megjelen;
			return true;
		}
		else
		{
			if($this->hibajelzes == true)
			{
				return "!3!";
			}
		}
	}
	public function setImg($img)
	{
		if($img != "" && $img && $this)
		{
			$this->profkep = $img;
			return true;
		}
		else
		{
			if($this->hibajelzes == true)
			{
				return "!2!";
			}
		}
	}
	public function getImg()
	{
		if($this->profkep != "" && $this->profkep && $this)
		{
			return $this->profkep;
		}
		else
		{
			if($this->hibajelzes == true)
			{
				return "!3!";
			}
		}
	}
	public function setImgUp($img)
	{
		if($img != "" && $img && $this)
		{
			$this->media = $img;
			return true;
		}
		else
		{
			if($this->hibajelzes == true)
			{
				return "!2!";
			}
		}
	}
	public function getImgUp()
	{
		if($this->media != "" && $this->media && $this)
		{
			return $this->media;
		}
		else
		{
			if($this->hibajelzes == true)
			{
				return "!3!";
			}
		}
	}
	public function setDBNev($nev)
	{
		if($nev != "" && $nev && $this)
		{
			$this->akkorinev = $nev;
			return true;
		}
		else
		{
			if($this->hibajelzes == true)
			{
				return "!2!";
			}
		}
	}
	public function getDBNev()
	{
		if($this->akkorinev != "" && $this->akkorinev && $this)
		{
			return $this->akkorinev;
		}
		else
		{
			if($this->hibajelzes == true)
			{
				return "!3!";
			}
		}
	}
	public function setIdo($ido)
	{
		if($ido != "" && $ido && $this)
		{
			for($io=0;$io<count(explode(",", $ido));$io++)
			{
				$val = $this->ido;
				$val[$io] = explode(",", $ido);
				$val[$io] = $val[$io][$io];
			}
			return true;
		}
		else
		{
			if($this->hibajelzes == true)
			{
				return "!2!";
			}
		}
	}
	public function getIdo()
	{
		$valt = "";
		if($this->ido != "" && $this->ido && $this)
		{
			for($iu=0;$iu<count($this->ido);$iu++)
			{
				$valt .= $this->ido[$iu];
			}
			if($valt != "" && $valt && $this)
			{
				return $valt;
			}
			else
			{
				if($this->hibajelzes == true)
				{
					return "!3!";
				}
			}
		}
		else
		{
			if($this->hibajelzes == true)
			{
				return "!3!";
			}
		}
	}
}

$ll = new Uzenet;
echo $ll->setUzenet("Rövid cím", "Hosszú üzenet");
$lu = $ll->getUzenet();
var_dump($lu);
 
1

Kezdetnek nem rossz, pár

Hidvégi Gábor · 2014. Aug. 14. (Cs), 23.23
Kezdetnek nem rossz, pár apróság, ami feltűnik:
- if($id != "" && $id && $this) A $this elvileg mindig igaz, mivel az objektum példányosítva lett, tehát létezik. A $id mindig igaz, ha a $id != "" is igaz. Tehát végeredményben elég így: if ($id) { Persze ez az ellenőrzés magában nem ér túl sokat.
- a visszaadott hibakódjaid egyrészt nem túl beszédesek (ez nem olyan nagy gond, a fogadó oldalnak kell tudnia, mit jelentenek), másrészt viszont túl kevés van belőlük, mármint csak kétfajtát adsz vissza, de jóval többfajta hiba történhet. Ez azt jelenti, hogy a hibakezelésnek kell viszonylag bonyolultnak lennie.
- public function setUzenet($el, $ma)Este 11-kor én már nem fogom kitalálni, ezek a paraméterek miknek a rövidítései, és fél év múlva te sem fogod tudni.
- for($io=0;$io<count(explode(",", $ido));$io++)Ez minden ciklusban lefuttatja az explode-ot, ami teljesen felesleges. Így jobb: for($io=0, $l = count(explode(",", $ido)); $io < $l; $io++)
- olvashatóbb a kód, ha az írásjelek közé szóközt teszel
- setter metódusokban a változó értékadását követően érdemes visszaadni a változót, így néha meg lehet spórolni egy plusz getter hívást: return $this->id = $id;
- a metódusaid eléggé hasonlítanak egymásra, a későbbiekben ezeket akár össze lehetne vonni eggyé, persze egy plusz paraméterrel
2

Inkább method chain

szabo.b.gabor · 2014. Aug. 15. (P), 08.53
Én a setterben az érték helyett inkább a $this-t adnám vissza.
8

Miért?

Hidvégi Gábor · 2014. Aug. 15. (P), 09.31
Miért?

Szerkesztve: közben leesett. A hozzászólások címeit sokszor nem látom, számomra ez használhatósági probléma már a kezdetek óta.
3

Sztem ezt ne

szabo.b.gabor · 2014. Aug. 15. (P), 08.57
if($this->hibajelzes == true)
4

Nagyon verbose a kód szerintem

szabo.b.gabor · 2014. Aug. 15. (P), 09.01
    public function getUzenetId()  
    {  
        if($this->id != "" && $this->id && $this)  
        {  
            return $this->id;  
        }  
        else  
        {  
            if($this->hibajelzes == true)  
            {  
                return "!3!";  
            }  
        }  
    } 

    /* VS */
    public function getUzenetId()  
    {  
        return $this->id ? $this->id : $this->error('!3!');
    } 

    public function error($msg){
       return $this->hibajelzes ? $msg : null;
    }
5

Ellenben a változók..

szabo.b.gabor · 2014. Aug. 15. (P), 09.05
        $valt = "";  
        if($this->ido != "" && $this->ido && $this)  
        {  
            for($iu=0;$iu<count($this->ido);$iu++)  
            {  
                $valt .= $this->ido[$iu];  
            }  
            if($valt != "" && $valt && $this)  
            {  
                return $valt;  
            }  
            else  
            {  
                if($this->hibajelzes == true)  
                {  
                    return "!3!";  
                }  
            }  
        } 
..azok meg nagyon titokzatosak :D

Ahogy Gábor is mondta.
6

Setter ami nem set-el

szabo.b.gabor · 2014. Aug. 15. (P), 09.09
    public function setIdo($ido)  
    {  
        if($ido != "" && $ido && $this)  
        {  
            for($io=0;$io<count(explode(",", $ido));$io++)  
            {  
                $val = $this->ido;  
                $val[$io] = explode(",", $ido);  
                $val[$io] = $val[$io][$io];  
            }  
            return true;  
        }  
        else  
        {  
            if($this->hibajelzes == true)  
            {  
                return "!2!";  
            }  
        }  
    }  
7

De mit csinál?

szabo.b.gabor · 2014. Aug. 15. (P), 09.23
class Uzenet{
  private $profilid = 0;//üzenet-tulajdonos profiljának ID-je  
  private $tipus = 0;//1-szöveges, 2-szöveg+médiafájl  
  private $id = 0;//üzenet-száma  
  private $megjelen = Array();//üzenet tartalma  
  private $profkep = "";//felhasználó profilképje (aktuális)  
  private $mediafel = "";//HA tipus == 2, akkor a médiafájl tartalma  
  private $akkorinev = "";//az akkori neve  
  private $ido = Array();//üzenet idejét tartalmazó tömb  

  public function __get($name){
    if(property_exists($this,$name)){
      return $this->$name;
    }else{
      return null;
    }
  }

  public function __set($name,$val){
    if(property_exists($this->$name)){
      $this->$name = $val;
      return $this;
    }
    trigger_error('property not exists '.$name,E_USER_ERROR);
  }
}
Minimálisan egyszerűsítve ennyit csinál a kódod. ami nem rossz, ha mondjuk egy paraméterhalmazt akarsz kezelni és nem nyomi array-t használni amiben ki tudja mi van.
9

Kérdésed..

szabo.b.gabor · 2014. Aug. 15. (P), 09.32
Kérdésedre válaszolva amúgy elfogadható. A hibakezelést mindenképp emeld ki külön függvénybe (DRY!), arra figyelj, hogy ha hiba van ne string-et adj vissza (akkor ez most hiba vagy érték igazából?!), hanem trigger_error vagy throw new Exception().

Gyorsabb-e? Nyilván nem, de nem észrevehető a lassulás. Hibamentesebb? Igen. Ez a lényeg. Bár ha gyorsaságon nem a futásidőt értjük, hanem a fejlesztésre fordított időt, akkor gyorsabb.

Amúgy használj egy jó IDE-t (PhpStorm a legjobb jelenleg, Eclipse PDT? is jó, az ingyen is van). Nehogy valaki elkezdjen sírni, hogy dehát Java, meg lassan indul el, meg 'mennyi memóriát eszik Atyaúristen!', mert sírvafakadok.

Hajrá!
10

Off: eclipse+java tegnap

H.Z. · 2014. Aug. 15. (P), 09.47
Off: eclipse+java
tegnap megnéztem a netbeans, Ubuntu repoból elérhető változatát.
Sírva menekültem vissza az eclipse-hez.
Részben mert ocsmánynak tartom a swinges megjelenését, másrészt meg érezhetően lassúbb, mint az eclipse. Utóbbi csak lassan indul, de naponta/hetente/évente egyszer elviselhető.
11

Fontok?

DonPepito · 2014. Aug. 15. (P), 13.21
Es a fontok is meg mindig ocsmanyak? Valami baja volt sokaig, hogy nem lehetett akarmilyen fontot megetetni vele (talan pont a swing miatt?), de ha sikerult, akkor se ugy nezett ki, ahogy annak ki kellene neznie. :)
12

Emlekbe

DonPepito · 2014. Aug. 15. (P), 13.26
Ezt a sort (de akar az egesz osztalyt) tedd el emlekbe! :) Vicces lesz majd visszanezned par honap/ev mulva. :)
if($this->id != "" && $this->id && $this)
Epp a minap beszelgettunk a kollegaval vicces hibakrol, elnezesekrol, elirasokrol, hatha kesobb neked is okoz majd egy-ket kellemes percet. :)
13

;)

tóthika · 2014. Aug. 22. (P), 02.59
Köszönöm mindenkinek a jótanácsát ;)