Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Ćwieczenie z PHP OOP.
siuda
post
Post #1





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 15.03.2012

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


Witam,

Od pewnego czasu ucze się programowania obiektowego i natrafiłem na takie zadanie :

"Utwórz klasę "rozwiazanie", która będzie mogła wykonać operacje arytmetyczne na takich tablicach jak array(5, "plus", 4), oraz array(2, "razy", 8) i wykonaj na nich działanie arytmetyczne. Pamiętaj, że środkowa wartość w tablicy jest również nazwą klasy - zaimplementuj ją. W przyszłości może być potrzeba obsługi innej operacji arytmetycznej bez potrzeby zmiany kodu".

Trochę nie rozumiem po co mam tworzyć jedną klasę "rozwiazanie", która i tak będzie musiała za pomocą funkcji array_search szukać takich słów jak plus, razy, minus, podzielić i wykonać operację na pozostałych wartościach. Jaki jest sens i potrzeba tworzenia kolejnych klas? Jeżeli ktoś może mi to wytłumaczyć to będe bardzo wdzięczny za pomoc. Nie jestem w stanie nawet zrobić sobie szkicu takiego rozwiązania jak to miałoby wyglądać.


Pozdrawiam,
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Trochę durny pomysł z przekazywaniem tych trzech informacji (dwie liczby, operacja) w formie tablicy, ale mniejsza z tym.

Ogólnie w ćwiczeniu chodzi o pokazanie pewnej dosyć popularnej struktury kodu zwanej strategią. W wiki masz podany całkiem przyzwoity opis tego wzorca projektowego.

Jaki jest sens tego wszystkiego? Przykładowo w tej chwili masz umożliwić realizację jedynie czterech operacji - dodawania, odejmowania, dzielenia oraz mnożenia. Mógłbyś to zrobić chociażby w takiej formie:
  1. public function wykonajOperacje($a, $b, $operacja) {
  2. switch ($operacja) {
  3. case 'dodawanie':
  4. return $a + $b;
  5. case 'odejmowanie':
  6. return $a - $b;
  7. case 'mnożenie':
  8. return $a * $b;
  9. case 'dzielenie':
  10. if ($b == 0) {
  11. throw new RuntimeException('Próba dzielenia przez zero');
  12. }
  13.  
  14. return $a / $b;
  15. default:
  16. throw new InvalidArgumentException('Nieznana operacja');
  17. }
  18. }
Jaki jest problem tego kodu? W przypadku chęci zmiany czegoś bądź dodania nowej operacji musimy zmodyfikować ten kod, a to wiąże się z pewnymi komplikacjami. Dodatkowo w przypadku gdyby każda z tych czterech operacji wymagała nieco więcej niż jednej linijki kodu powstałby straszny śmietnik, trudny do utrzymania, udokumentowania czy testowania.

Dlatego też same operacje wydzielamy do osobnych obiektów - wtedy wszystko mamy ładnie rozdzielone, dodanie nowej operacji jest proste i nieinwazyjne, a całością jest łatwiej zarządzać.

W polskiej wiki masz to ładnie opisane spróbuj to zaimplementować. Jeśli nie dasz rady skorzystaj z innych źródeł (angielska wiki, bądź Google i fraza php strategy pattern).

@Sephirus: Zadanie proste i bardzo, ale to bardzo typowe. (IMG:style_emoticons/default/wink.gif) Może z tego opisu nie zrozumiałeś o co do końca chodzi.

Ten post edytował Crozin 15.03.2012, 13:52:23
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: 14.10.2025 - 12:12