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