Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Obiekty reprezentujące pracowników
Forum PHP.pl > Forum > PHP > Object-oriented programming
deniol13
Witam. Jestem w trakcie tworzenia [aktualnie planuję] gry o tworzeniu gier, tzn. taki webowy klon GameDev Story. Chodzi o pracowników w grze, jak ich najlepiej przedstawić, w postaci obiektów. Mam klasę reprezentującą pracownika
  1. class Pracownik
  2. {
  3. private $name = 'Jan Kowalski';
  4. private $type = CODER_TYPE;
  5. private $coding_ability = 50;
  6. private $design_ability = 3;
  7.  
  8. public function getCos()
  9. {
  10. return $name;
  11. }
  12. }


Następnie z bazy pobierał bym informacje o pracownikach gracza i następnie wypełniał obiekt danymi [konstruktor] np

$pracownicy = array(); //przechowuje obiekty pracowników

  1. foreach( $pracownicyDB AS $pracownik )
  2. {
  3. $pracownicy[] = new Pracownik( $pracownik['name'], $pracownik['type'] );
  4. }


Mam nadzieję że się w miarę jasno wyraziłem.
Magic WWW
Nie wiem, takie głupie pytanie zadam. W czym tkwi problem? biggrin.gif Używasz takiej metody:
  1. new Pracownik( $pracownik['name'], $pracownik['type'] );


Jednakże w twojej klasie nie widzę konstruktora, który by te dane przetworzył. Gotowa klasa:

  1. class Pracownik
  2. {
  3. private $_info = array(
  4. 'name' => '';
  5. 'type' => '';
  6. 'coding_ability' => '';
  7. 'design_ability' => ''
  8. );
  9.  
  10. public function __construct($name, $type)
  11. {
  12. $this -> info['name'] = $name;
  13. $this -> info['type'] = $type;
  14. }
  15.  
  16. public function getCos()
  17. {
  18. return $name;
  19. }
  20. }
Fifi209
Dlaczego $info nie jest private, skoro tamte były? smile.gif

Swoją drogą z tego co pamiętam przyjęło się, że nazwy prywatnych zmiennych zaczynamy od $_
Magic WWW
Faktycznie, mój mały błąd smile.gif
Crozin
@Fifi209, @Magic WWW: Nie, rozpoczynanie nazw jakimiś śmieciami w postaci znaku podkreślenia się nie przyjęło w PHP5+.

@deniol13: Cięzko tutaj jakieś wywody pisać. Pamiętaj tylko o tym by jeden obiekt zajmował się jedną rzeczą. Innymi słowy, czy w Twoim przypadku pracownik może być traktowany jako synonim osoby? Bo to właśnie osoba posiada imię czy nazwisko. Jeżeli takie dane są specyficzne wyłączone dla pracowników i jest mała szansa by kiedykolwiek w przyszłości zaistniała potrzeba utworzenia innych obiektów posiadających cechy osoby wtedy taki model jeszcze może pozostać. Ale jeżeli w przyszłości będziesz chciał dodać przykładowo obiekty pracodawcy czy wędkarza, które również posiadają takie cechy jak imię i nazwisko to co? Pomyśl nad wydzieleniem tych danych do osobnego obiektu.
Podobnie jest z umiejętnościami pracownika. To już jest klasyczna relacja jeden-do-wielu i raczej nie powinna być zapisana na sztywno w kodzie. Jest całkiem prawdopodobne, że w przyszłości będziesz chciał dodać np. umiejętność negocjowania. Co wtedy? Przepisywanie kodu? Swoją drogą umiejętności również powinny być przypisane do osoby, nie do pracownika. W sumie taki obiekt pracownika to poza specyficznymi dla pracownika rzeczami (typu wynagrodzenie) będzie składał się z masy metod-proxy do innych obiektów (by jego interfejs był jakiś "znośny")

  1. class Person {
  2. private $firstName;
  3. private $lastName;
  4. private $skills;
  5. }
  6.  
  7. class Skill {
  8. private $name;
  9. }
  10.  
  11. class Employee {
  12. private $person;
  13.  
  14. public function getFullName() {
  15. return $this->person->getFirstName() . ' ' . $this->person->getLastName();
  16. }
  17. }
  18.  
  19. // ...
  20.  
  21. $codingSkill = new Skill('coding');
  22. $designSkill = new Skill('design');
  23.  
  24. $person= new Person();
  25. $person->setFirstName('Joe');
  26. $person->setLastName('Doe');
  27. $person->setSkills(array($codingSkill, $designSkill));
  28.  
  29. $employee = new Employee($person);
  30.  
  31. echo $employee->getFullName();
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.