Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [OOP] Rozszerzanie klasy.
Forum PHP.pl > Forum > PHP > Object-oriented programming
tolomei
Witam.

Mam pytanie projektowe.
Tworzę system generujący umowy.
Posiadam w nim klasę Worker zawierającą informacje o pracowniku. Z tym, że do jednej umowy potrzebuję 10 różnych informacji o pracowniku, a do innej umowy potrzebuję jedynie 4 właściwości(takich przypadków może być więcej - do rachunku potrzebuję jedynie imię i nazwisko).
Stąd moje pytanie:
Powinienem utworzyć klasę Worker zawierającą 4 właściwości, a potem rozszerzać ją do WorkerExtended zawierającej 10 właściwości?
Może powinienem utworzyć abstrakcyjną klasę Worker oraz dwie dziedziczące po niej?

Będę bardzo wdzięczny za podpowiedź.
Dzięki.
Orzeszekk
jesli jedna umowa wynika z drugiej (jest jej rozszerzoną wersją) to powinienes zrobic jedną z 4 ma wlasciwosciami a pozniej z niej odziedziczyc i w dziedziczacej dodac pozostale szesc.

jezeli sa to rozne umowy to raczej klase abstrakcyjną i w nia wrzucic te 4 pola.

ewentualnie niech kazda umowa posiada w sobie liste swoich pól, i tworz je poprzez factory method, zamiast robic osobną klase dla kazdej umowy.

class umowa{
private $fields;
public function addFields($field)
.....
itd

}
tolomei
Orzeszekk dziękuję za Twoją odpowiedź.

Troszkę chyba chaotycznie napisałem bo troszkę o co innego mi chodziło.

Uzupełniając moje pytanie - co w przypadku, gdy:

  1. class WorkerSmall {
  2.  
  3. private $_name;
  4. private $_surname;
  5.  
  6. }
  7.  
  8. class WorkerNormal {
  9.  
  10. private $_name;
  11. private $_surname;
  12. private $_city;
  13. private $_address;
  14.  
  15. }
  16.  
  17. class WorkerBig {
  18.  
  19. private $_name;
  20. private $_surname;
  21. private $_city;
  22. private $_address;
  23. private $_idNumber;
  24. private $_peselNumber;
  25.  
  26. }


I teraz tak:
- do umowy A potrzebuję tylko znikome dane z WorkerSmall,
- do umowy B potrzebuję więcej danych czyli WorkerNormal,
- do umowy C potrzebuję całej wiedzy o pracowniku czyli WorkerBig.

Powinienem zrobić łańcuszek dziedziczeń ?

Dzięki jeszcze raz. Pozdrawiam.
toffiak
3 poziomy dziedziczenia to jeszcze nie jest za dużo, martwić należy się przy 5 i więcej. Osobiście jednak zastosowałbym tu wzorzec strategia, oddzielne klasy Workerów wymieniane według potrzeb.
Orzeszekk
strategia będzie duzo lepsza jezeli logika roznych formularzy bedzie się różniła, to zapobiegnie burdlowi w kodziem, wiec to faktycznie moze byc lepsze rozwiazanie.

Tym bardziej ze w PHP refaktoryzacja nalezy do srednio przyjemnych przyjemnosci a nie wiadomo jak mocno sie portal kiedys rozrosnie. lepiej zrobic od razu porządnie.

Jak zrobic strategie pewnie wiesz wiec nie bedziemy pisać.
skowron-line
@tolomei to co rozpisałeś to jakaś kicha, bo jeżeli masz te dane w bazie w tabeli worker to np.

Worker
id_worker
imie,
nazwisko
adres,
miasto,
kod_pocztowy,
nip,
pesel

i w 2 tabeli naprzykład masz dane o zatrudnieniu to klasa worker powinna zwracać wszystkie dane z zapytania i jeżeli będziszz miał

wokers_companies
worker_id,
companies_id

to wtedy rozszerz klasę worker_companies o klasę worker

Bo zaraz będziesz dopisywał następne klasy workerEmail, workerPhone i takie inne h*j wie co.
tolomei
Też mi się wydaje lipa smile.gif

skowron-line racja!
Bo ja planowałem trzymać obiekt Worker w jednym z atrybutów klasy Umowa, ale każda umowa wymaga innych danych o pracowniku. Dane o pracowniku bezpośrednio w obiekcie umowy to najlepsze wyjście.

Dziękuję!
CuteOne
Hmmm a dla mnie to co napisałeś skowron-line jest lekko mówiąc.. nie zrozumiałe. Jeżeli będę chciał pobrać markę samochodu to po co mi wiedzieć jaki ten samochód ma silnik, przebieg czy kolor? Druga sprawa to dziedziczenie, które zaproponowałeś - co gdy z worker_companies będę potrzebował danych firmy a nie pracownika? pisać drugą klasę worker_companies, która będzie rozszerzała companies? Trochę absurdalne

Wg mnie to klasa umowy powinna decydować, które dane powinny być dostarczone:
  1. <?php
  2.  
  3. abstract class Umowy {
  4.  
  5. protected $_worker;
  6.  
  7. protected $_company;
  8.  
  9. public function addWorker($worker) {
  10.  
  11. $this->_worker = $worker;
  12. }
  13.  
  14. public function addCompany($company) {
  15.  
  16. $this->_company = $company;
  17. }
  18.  
  19. public function setFields($fields) {
  20.  
  21. $this->_worker -> setFields($fields);
  22. }
  23. }
  24.  
  25. class UmowaA extends Umowy {
  26.  
  27. public function initWorker() {
  28.  
  29. $this->setFileds(array('id', 'imie', 'nazwisko'));
  30. }
  31. }
  32.  
  33. class UmowaB extends Umowy {
  34.  
  35. public function initWorker() {
  36.  
  37. $this->setFileds(array('id', 'adres'));
  38. }
  39.  
  40. public function initCompany() {
  41.  
  42. ....
  43. }
  44. }
  45.  
  46. /**
  47.  * Umowa A
  48.  */
  49. $w = new Worker(67);
  50.  
  51. $u = new UmowaA();
  52. $u -> addWorker($w);
  53. $u -> initWorker();
  54.  
  55.  
  56. /**
  57.  * Umowa B
  58.  */
  59. $w = new Worker(1267);
  60. $c = new Company($w -> getWorkerId());
  61.  
  62. $uB = new UmowaB();
  63. $uB -> addWorker($w);
  64. $uB -> addCompany($c);
  65. $uB -> initWorker();
  66. $uB -> initCompany();


$this->_worker -> setFields($fields); dodaje do zapytania odpowiednie pola

Odpada problem z różną ilością danych i dziedziczeniem
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.