Witam, stworzyłem prosty kod dot. tworzenia postaci, jego profesji i jego podstawowych parametrow tj. sila, magia, zrecznosc. Nic skomplikowanego, bo nie na tym mi teraz zalezy. Probuje ogarnac programowanie obiektowe i zaleznosci pomiedzy obiektami. Proszę o sprawdzenie mojego krótkiego kodu i wystawienie opinii/ porady co powinienem zmienic, na co zwracac uwage itd.
Wydaje mi sie, ze kod, ktory stworzylem ma za duzo zaleznosci pomiedzy obiektami tj. ~jeden obiekt za bardzo wplywa na drugi.
<?php
//INDEX.php
require_once 'bootstrap.php'; //autoload
use Params\Params;
use Proffesion\Proffesion;
use Proffesion\Knight;
use Character\Character;
use Params\ShowParams;
$character = new Character($params=new Params(), new Knight($params));
$character->getInstanceOfParams()->increaseStrength(10);
echo ShowParams::normalShow($character->getInstanceOfParams());
echo "Profesja: ".$character->getInstanceOfProffesion()->getProffesion();
<?php
namespace Proffesion;
use Params\Params;
abstract class Proffesion
{
function __construct(Params $params, $strength=0, $agility=0, $magic=0)
{
$params->setParams($strength, $agility, $magic);
}
abstract public function getProffesion();
}
<?php
namespace Proffesion;
use Params\Params;
class Knight extends Proffesion
{
public function __construct(Params $params, $strength=10, $agility=4, $magic=1)
{
parent::__construct($params, $strength, $agility, $magic);
}
public function getProffesion()
{
return 'Knight';
}
}
<?php
namespace Params;
class Params
{
private $strength;
private $agility;
private $magic;
public function setParams($strength, $agility, $magic)
{
$this->strength=$strength;
$this->agility=$agility;
$this->magic=$magic;
}
public function increaseStrength($value)
{
$this->strength+=$value;
}
public function increaseAgility($value)
{
$this->agility+=$value;
}
public function increaseMagic($value)
{
$this->magic+=$value;
}
public function getParams()
{
return array($this->strength, $this->agility, $this->magic);
}
public function getStrength()
{
return $this->strength;
}
public function getAgility()
{
return $this->agility;
}
public function getMagic()
{
return $this->magic;
}
}
<?php
namespace Character;
use Params\Params;
use Proffesion\Proffesion;
class Character
{
private $params;
private $proffesion;
public function __construct( Params $params, Proffesion $proffesion)
{
$this->params=$params;
$this->proffesion=$proffesion;
}
public function getInstanceOfParams()
{
return $this->params;
}
public function getInstanceOfProffesion()
{
return $this->proffesion;
}
}
<?php
namespace Params;
class ShowParams
{
static public function normalShow(Params $params)
{
$result=$params->getParams();
$return = "Strength: ".$result[0]."<br>";
$return .= "Agility: ".$result[1]."<br>";
$return .= "Magic: ".$result[2]."<br>";
return $return;
}
}
Czy takie rozwiazanie jest wgl poprawne: (Knight.php)
public function __construct(Params $params, $strength=10, $agility=4, $magic=1)
{
parent::__construct($params, $strength, $agility, $magic);
}
Czy tworzenie instancji jak tutaj jest zrobione poprawnie, czy moze lepiej te poszczegolne w wlasciwosciach najpierw przypisac do zmiennych a potem te zmienne przekazac do konstruktora? :
$character = new Character($params=new Params(), new Knight($params));
czyli $params=new Params(); $prof = new Knight($params); $char = new Character($params, $prof); ??
I jeszcze chciałbym poznac opinie dot takiego rozwiazania:
$character->getInstanceOfParams()->increaseStrength(10);
echo ShowParams::normalShow($character->getInstanceOfParams());
echo "Profesja: ".$character->getInstanceOfProffesion()->getProffesion();
Chodzi mi o metody wewnatrz klasy Character tj. getInstanceOfProffesion oraz getInstanceOfParams. Czy moze lepiej byloby wewnatrz klasy Character dodac metody, cos takiego: pub func increaseStrength($num) { $this->params->increaseStrength($num); } i wywolac to tak: $character->increaseStrength(10); < Te rozwiazanie jakos sie nazywalo, ale nie pamietam jak. W jednym obiekcie metoda o takiej samej nazwie wykorzystuje inny obiekt do zrobienia jej roboty (takie wyslugiwanie sie innym obiektem, a sam leniuchuje)
Czekam na jakies wskazowki! Dzieki
edit. Chcialbym sie jeszcze dowiedziec czy uzywam poprawnie przestrzeni nazw.
Zdjecie z drzewem katalogow: http://screenshot.sh/mFdv0ZwieoW4m