Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Istota programowania obiektowego
szajens
post
Post #1





Grupa: Zarejestrowani
Postów: 150
Pomógł: 4
Dołączył: 3.01.2010

Ostrzeżenie: (0%)
-----


Przeglądałem kilkadziesiąt klas i zastanawiam się po co ludzie piszą na siłę dodatkowe metody np:
  1. class Stefan {
  2.  
  3. public $ubranie;
  4. public $buty;
  5. public $czapka;
  6.  
  7. public function setUbranie($jakie) {
  8. $this->ubranie = $jakie;
  9. }
  10.  
  11. public function getUbranie() {
  12. return $this->ubranie;
  13. }
  14.  
  15. }
  16.  


i później wywołanie:
  1. $o->setUbranie('jensy');
  2. echo $o->getUbranie();


zamiast:
  1. $o->ubranie='dress';
  2. echo $o->ubranie;

mniej niepotrzebnego kodu a nadal jest bardzo czytelny
edit: no i z klasy wypadają dwie niepotrzebne metody

Ten post edytował szajens 4.10.2015, 20:41:38
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
PrinceOfPersia
post
Post #2





Grupa: Zarejestrowani
Postów: 717
Pomógł: 120
Dołączył: 18.04.2009

Ostrzeżenie: (0%)
-----


Cytat("Crozin")
3. Kod staje się zdecydowanie mniej wrażliwy na zmiany. Wewnętrzny stan obiektu nie jest udostępniony bezpośrednio zewnętrznemu "użytkownikowi".

No ale jeśli mamy gettery i settery, to z jednak definicji wewnętrzny stan obiektu jest udostępniany zewnętrznemu użytkownikowi (tyle, że pośrednio, jedyna różnica), i użytkownik może odczytać albo zmienić stan obiektu w dowolnym momencie. I to niebezpiecznie łamie zasadę enkapsulacji.

Dlatego trzeba to robić z rozsądkiem, są sytuacje gdzie gettery i settery są użyteczne, ale stosowanie ich na oślep bo komuś się wydaje, że na tym polega programowanie obiektowe (co jest kompletną bzdurą).

Zamiast setterów/getterów setUbranie (pomijając już, że pisanie zmiennych pół po polsku, pół po angielsku nie ma sensu), można np.:

- zlikwidować potrzebę odwołania się do zmiennych obiektu. Np. załózmy, że mamy konto bankowe. Wtedy jeśli chcemy komuś odjąć kasę z konta, wtedy zamiast pisać
  1. $account->setMoney($account->getMoney() - 100)

co jest dość brzydkie (i również podatne na pomyłki nie bardziej niż twój przykład, @memory, wystarczy, że komuś się plus z minusem pomyli), możemy zrobić metodę charge:
  1. $account->charge(100)

wtedy obiekt sam będzie wiedział, co zrobić z tymi pieniędzmi. Jednocześnie zlikwidujemy potrzebę odwoływania się do wewnętrznego stanu obiektu.

- można jeszcze zlikwidować w ogóle stan obiektu i pozwolić na ustawianie ubrania tylko przy inicjalizacji obiektu (a później dany obiekt byłby po prostu niezmienialny). Wtedy jeśli byśmy chcieli zmienić ubranie to po prostu tworzylibyśmy nowy obiekt klasy Stefan, który by miał skopiowane z poprzedniego właściwości, oprócz ubrania, które byśmy ustawili inne.

Ten post edytował PrinceOfPersia 6.10.2015, 14:27:58
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 17.10.2025 - 04:36