Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Java]Jak zastąpić IF polimorfizmem - czysty kod
Forum PHP.pl > Forum > Przedszkole
gregi
czy może ktoś podrzucić przykład jak zastąpić if, case polimorfizmem ?
Chciałbym to zrozumieć : )
PrinceOfPersia
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.
gregi
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. }
PrinceOfPersia
  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.
peter13135
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.
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.