Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Java]Jak zastąpić IF polimorfizmem - czysty kod
gregi
post 1.05.2015, 13:15:38
Post #1





Grupa: Zarejestrowani
Postów: 100
Pomógł: 0
Dołączył: 11.09.2003

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


czy może ktoś podrzucić przykład jak zastąpić if, case polimorfizmem ?
Chciałbym to zrozumieć : )
Go to the top of the page
+Quote Post
PrinceOfPersia
post 1.05.2015, 13:25:51
Post #2





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

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


Taki przykład.

PSEUDOKOD:

Kod
function  drawRectangle() {
}

function  drawCircle() {
}


switch (figure.type) {
   case 'rectangle':
       drawRectangle();
       break;
   case 'circle':
       drawRectangle();
       break;
}

zamienia sie w:
Kod
class Rect implements Figure {
   function draw() {
      // rysuje prostokat
   }
}

class Circle implements Figure {
   function  draw() {
      // rysuje okrag
   }
}

figure.draw(); // wywolujemy polimorficzna metode draw zamiast switch/case.


i to był pseudokod, a jak to będzie w konkretnym języku programowania to sobie doczytasz.

Ten post edytował PrinceOfPersia 1.05.2015, 13:27:07


--------------------
Go to the top of the page
+Quote Post
gregi
post 2.05.2015, 07:18:44
Post #3





Grupa: Zarejestrowani
Postów: 100
Pomógł: 0
Dołączył: 11.09.2003

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


Mam standardową i pewnie nieoptymalną konstrukcję z if. Czy da się to zrobić optymalnej zgodnie z zasadami clean code?
JAVA
  1. if (0 == punktyUser)
  2. {
  3. connector.updateScheduledTimeSlowko_TODO(slowko_ang, 3); // update czasu
  4. connector.updatePointsUser(slowko_ang, 1); //update punktów
  5. System.out.println("Matryca =0p");
  6. }
  7.  
  8. else if (-1 == punktyUser)
  9. {
  10.  
  11. connector.updateScheduledTimeSlowko_TODO(slowko_ang, 3); // update
  12. connector.updatePointsUser(slowko_ang, 1); // czasu
  13. System.out.println("Matryca =-1p");
  14. } else if (-2 == punktyUser)
  15. {
  16. connector.updateScheduledTimeSlowko_TODO(slowko_ang, 3);
  17. connector.updatePointsUser(slowko_ang, 1);
  18. System.out.println("Matryca =-2p");
  19. }
  20.  
  21. else if (-2 > punktyUser)
  22. {
  23. connector.updateScheduledTimeSlowko_TODO(slowko_ang, 3);
  24. connector.updatePointsUser(slowko_ang, 1);
  25. System.out.println("Matryca =-<<<-2p");
  26.  
  27. }
  28.  
  29. else if (1 == punktyUser)
  30. {
  31. connector.updateScheduledTimeSlowko_TODO(slowko_ang, 10);
  32. connector.updatePointsUser(slowko_ang, 2++punktyUser);
  33. System.out.println("Matryca =1");
  34. } else if (2 == punktyUser)
  35. {
  36. connector.updateScheduledTimeSlowko_TODO(slowko_ang, 10);
  37. connector.updatePointsUser(slowko_ang, ++punktyUser);
  38. System.out.println("Matryca =2");
  39. }
  40.  
  41. else if (2 < punktyUser)
  42. {
  43. connector.updateScheduledTimeSlowko_TODO(slowko_ang, 15);
  44. connector.updatePointsUser(slowko_ang, ++punktyUser);
  45. System.out.println("Matryca <<<<<<<2");
  46. } else
  47. {
  48. System.out.println("matryca........!!!!!!!!!......./n/n");
  49. System.err.println("matryca........!!!!!!!!!......./n/n punkty usera: "+punktyUser);
  50. }
  51. }
Go to the top of the page
+Quote Post
PrinceOfPersia
post 2.05.2015, 11:44:24
Post #4





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

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


  1. System.out.println("Matryca =-1p");

wnioskuję, że to nic nie znaczy tylko do debugowania? Więc to olewam.

Co do reszty kodu to przede wszystkim, jedyne co tak naprawdę zmieniasz to liczby w parametrach, a czasem nawet nie to:

  1. connector.updatePointsUser(slowko_ang, 2++punktyUser); // swoja droga tu nie ma literowki? czy ta 2 nie jest tu przez przypadek?
  2. ....
  3. .....
  4. connector.updatePointsUser(slowko_ang, ++punktyUser);
  5. ...
  6. ...
  7. connector.updatePointsUser(slowko_ang, ++punktyUser);

albo:
  1. connector.updateScheduledTimeSlowko_TODO(slowko_ang, 3);
  2. ...
  3. ...
  4. connector.updateScheduledTimeSlowko_TODO(slowko_ang, 10);

Ja bym zanim przechodził na polimorfizm, to zaczął od doprowadzenia tego, żeby to w formie if wyglądało normalnie. Czyli jak robisz to samo:
  1. connector.updatePointsUser(slowko_ang, ++punktyUser)

nie ma sensu tego pisać ponownie.

Jak się parametr, który podajesz zmienia:
  1. connector.updateScheduledTimeSlowko_TODO(slowko_ang, 10);
  2. ...
  3. ...
  4. connector.updateScheduledTimeSlowko_TODO(slowko_ang, 15);

to nie ma sensu pisać ponownie całej funkcji, skoro możesz sobie wydzielić jakąś zmienną scheduleTime i tam przypisywać 10 albo 15. A potem tę zmienną odpalać:

  1. connector.updateScheduledTimeSlowko_TODO(slowko_ang, scheduleTime);


A co do całokształtu kodu to problem jest z tym, że za cholerę nie wiadomo o co w nim chodzi. Poza tym nie wiem, czy wiesz, ale istnieje coś takiego jak operatory logiczne AND/OR etc. i można ująć kilka warunków w jeden:
Kod
-1 == punktyUser || -2 == punktyUser

|| to OR
&& to AND
bo kod, który tam wykonujesz, niczym się nie różni od siebie (oprócz innego tekstu w System.out.println)

Cytat
A potem tę zmienną odpalać:

*miałem na myśli: a potem tę zmienną podawać do odpalanej funkcji.


--------------------
Go to the top of the page
+Quote Post
peter13135
post 3.05.2015, 13:01:30
Post #5





Grupa: Zarejestrowani
Postów: 1 447
Pomógł: 191
Dołączył: 26.03.2008

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


Cytat
Mam standardową i pewnie nieoptymalną konstrukcję z if. Czy da się to zrobić optymalnej zgodnie z zasadami clean code?

Optymanlość, a czystość kodu to dwie różne rzeczy, które niekoniecznie idą w parze.

Tam gdzie wydajność ma priorytetowe znaczenie, tam rezygnuje się z czystości kodu.

Tworzenie dodatkowych warstw abstrakcji zwiększa czytelność kodu, a więc produktywność programistów, ale ma to negatywny wpłw na wydajność.

PS. Nie ma czegoś takiego jak "bardziej optymalne" lub "mniej optymalne" . Albo coś jest optymalne, albo nie.

Ten post edytował peter13135 3.05.2015, 13:58:03


--------------------
:)
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 28.05.2025 - 06:06