dawciobiel

odpowiedz na facebooku

May 14th, 2020
292
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.12 KB | None | 0 0
  1. 1) Switch jest fajny... ale nie za bardzo.
  2. Nie krytykuję użycia tutaj ale jeżeli się już go chwyciłeś to spróbuj JDK 14 - tam zdaje się wprowadzili nową, lepszą składnię.
  3.  
  4. 2) W switch-case (zakładając że bym go w ogóle w tym przypadku użył) ja bym poukładał / posortował case'y wg:
  5.  
  6. addNewWorker();
  7. fillWorkerAdditionalData();
  8. fillWorkingDaysStatics();
  9. salary.printS-L()
  10. salary.printW-L()
  11.  
  12. Ale to jest akurat mało istotne poza czytelnością kodu.
  13.  
  14. 3) Metoda  addNewWorker() ... jak sama nazwa skazuje ponoć dodaje pracownika (employee?).
  15. No dobra, to jedziemy z kodem i spodziewamy się, że faktycznie tak ma robić konwencji nazewniczej.
  16. I co widzimy?
  17.  
  18. Tworzenie Worker'a:
  19.  - wypisywanie tekstu na ekran
  20.  - ustawianie zmiennych (PESEL, city, birthDay, baseSalaryGross )
  21.  - tworzenie obiektu Worker z w/w danymi
  22. Dodawanie obiektu worker do (jak mniemam) pola salary w klasie // Aktualizacja: źle stwierdziłem, bo to jest (wg komentarza z opisu programu na facebooku) to jest boolean który sygnalizuje niepowodzenie.
  23. Wywiływanie metod na obiekcie worker:
  24.  - worker.fillWorkerAdditionalData();
  25.  - worker.setWorkingDays(5);
  26.  
  27. 3a) Zmienna lokalna PESEL jest pisana cała wielkimi znakami - raczej nie jest to zgodne z konwencją nazewniczą w Java. Ja wiem, że "PESEL" dla oka wygląda fajniej niż "pesel" ale konwencja to konwencja, a wielkie litery oznaczają że to może być stała.
  28. 3b) baseSalaryGross - to jest podstawowa pensja brutto. Skoro tak to czemeu jest w "int" a nie np. w BigDecimal?
  29. 3c) do tworzenia obiektu klasy Worker można spróbować użyć wzorca projektowego budowniczy. A przy okazji się nauczysz że ktoś kiedyś wymyślił już koło.
  30. https://pl.wikipedia.org/wiki/Budowniczy_(wzorzec_projektowy)
  31. 3d) worker.setWorkingDays(5); // Tutaj ustawiasz na sztywno "5" dni roboczych. Skoro jest na sztywno to ja bym użył tutaj stałej w klasie:
  32. private static int WORKING_DAYS_5 = 5;
  33.  
  34. 3 podsumowanie)
  35. Czyli metoda addNewWorker() robi tworzenie, wypisywanie, dodawanie workera do pola klasy, DOPIERO TERAZ wywołuje metody na obiekcie worker (czyli zmienia jego stan).
  36. Czyli jest źle. Bo wg założeń metoda ma robić tylko to co jest napisane w jej nazwie i nic więcej i nic mniej.
  37. Poczytaj też o SOLID https://pl.wikipedia.org/wiki/SOLID_(programowanie_obiektowe)
  38.  
  39. I metoda addNewWorker() wyglądała by i nazywała by się tak:
  40.  private Employee getEmployeeDataFromUser() {
  41.    Employee emp = displayEmployeeInformation()
  42.    return createEmployee(emp)
  43.  }
  44.  
  45. Wiesz, ustawiasz pole klasy (jak mniemam też musi być statyczne) na obiekt Worker. A potem w tej metodzie jeszcze modyfikujesz ten obiekt. Więc może najpierw go zmodyfikuj a potem zwróć z metody zwykłm return'em.
  46. Wtedy ani pole nie musi być statyczne, ani metoda. Ze static'ami jest więcej kwestii niż myślisz - ale to może ktoś kto wie by się wypowiedział w której części pamięci JVM są one przetrzymywane oraz w kestii pracy garbage collector'a.
  47. Do tego dojdzie kwestia wielowątkowości. Np. jeżeli w twojej aplikacji wprowadzisz wiele wątków które będą sobie działać na polach/metodach statycznych - to sam kiedyś zobaczysz, że dzieją się dziwne rzeczy. I żeby temu zapobiegać musisz wprowadzać bloki statyczne i specjalne modyfikatory.
  48. A jeżeli tak zrobisz to jeden tylko wątek będzie mógł przetwarzać dany fragment kodu - a wtedy tracisz wielowątkowość de facto.
  49. Póki co statici olej.
  50.  
  51. 4) Metoda fillWorkerAdditionalData()
  52. A więc to jest ta słynna metoda z dodatkowymi danymi która po nazwie ... robi dodatkowe rzeczy - nie wiadomo do końca na czym.
  53. A nie wiadomo, bo:
  54. ustawia:
  55. - name
  56. - surname
  57. - sex
  58. - phoneNumber
  59. ..
  60.  
  61. I TERAZ - CUDA !!!
  62.  
  63.        Worker.fillWorkerAdditionalData();  // wywołujesz statyczną metodę z klasy Worker
  64.        worker.fillWorkerAdditionalData();  // wywołujesz (próbujesz) wywołać statyczną metodę z obiektu klasy Worker
  65.        worker.setWorkingDays(5); // A tutaj po raz kolejny ustawiasz mu 5 dni roboczych
  66.  
  67. No nie wiem czy taki był twój zamysł czy to tylko literówki czy what-da-fak ale to działać tak nie może.
  68. Zresztą po co rozdzialać pobieranie danych od użytkownika na temat Employee na dwa różne zestawy pytań, skoro można je pobrać za pierwszym razem.
  69.  
  70.  
  71. 4a) A co się stanie jeżeli użytkownik podczas wpisywania tekstu naciśnie np. CTRL+C ? Albo wprowadzi baaaardzo dużą ilość znaków? albo nic nie wpisze i naciśnie ENTER?
  72. Walidacje trzeba zrobić.
  73.  
  74. 5) Widzę komentarz typu:
  75. //boolean ktorej zadaniem jest sprawdzenie czy dodanie pracownika się udało
  76.  
  77. Nie, nie, nie. Nie idźcie tą drogą. Jeżeli coś się ma niepowieść - to wyrzuć sztucznie "twój" wyjątek. A potem gdzieś "wyżej" go przechwyć i zareaguj odpowiednio. Po to są wyjątki.
  78.  
  79. 6) Poczytaj sobie o wzorcach projektowych. Na początek tak pobieżnie chociaż o tych podstawowych GoF (Gang of four). Może ci się przydadzą kiedyś.
  80.  
  81. 7) Zacznij myśleć o kodzie w Javie jako kodzie obiektowym - bo taka właśnie Java jest i do obiektowego programowania powstała.
  82. Do metody przekazujesz argumenty, ona je przetwarza i zwraca "wynik" jako obiekt.
  83. A u ciebie jest np.
  84. addNewWorker() - bez argumeentów
  85. metoda coś tam mieli, tworzy, wykonuje cuda wianki przy czym zmienia zewnętrzny stan pól statycznych w klasie
  86. i na końcu metoda niczego nie zwraca.
  87.  
  88. 8) Jak już na siłę używasz String.out.print() to można tę klasę zaimportować statycznie. Wtedy w kodzie nie musisz pisać każdorazowo:
  89. String.out.print()
  90. tylko:
  91. out.print()
  92.  
  93. 9) Tak się zastanawiam jak w łatwy sposób rozwiązać u ciebie problem typu:
  94. - zestaw pytań które zadać użytkownikowi
  95. - i przechowywać do każdego pytania odpowiedź użytkownika
  96.  
  97. I jak to osiągnąć? co? Zamiast beszczelnie wypisywać String.out.print() tekst i potem scanner.nextLine()
  98.  
  99. Czyli jak stworzyć sobie listę złożoną z elementów:
  100. Pytanie - Odpowiedź
  101. String - String
  102.  
  103. A może by tak sobie stworzyć klasę... która by przechowywała w sobie Pytanie i jej Odpowiedź?
  104. class QAClass { // he he, trzeba się zastanowić jak ją sensownie nazwać
  105.   public String question;
  106.   public String answer;
  107. }
  108.  
  109. A potem stworzyć wiele takich pytań o konkretnej treści i stworzyć z nich "łańcuszek"?
  110.  
  111. qa1 = new QAClass("Podaj imię pracownika:")
  112. qa2 = new QAClass("Podaj telefon:")
  113.  
  114. List<QAClass> listaPytań = new LinkedList<>();
  115.  
  116. listaPytań.add(qa1)
  117. listaPytań.add(qa2)
  118.  
  119.  
  120. A potem aby zadać otrzymać wszysktie odpowiedzi:
  121.  
  122. for(QAClass qa: listaPytań) {
  123.  System.out.print( qa.getQuestion() )
  124.  qa.setAnwer(  scanner.nextLine() )
  125. }
  126.  
  127.  
  128. A jak potem stworzyć z listy odpowiedzi obiekt Employee?
  129. aaa w zasadzie to ta klasa nie jest nam już w ogóle potrzebna ALE jeżeli ktoś by się uparł to się da. Ale trzeba tutaj na sztywno wiedzieć któro pytanie w kolejności jaką odpowiedź przetrzymuje.
  130. Tzn. Klasa LinkedList przechowuje pytania w odpowiedniej kolejności. Więc wyciągając element spod konkretnego indexu wiemy co on zawiera:
  131.  
  132. Employee emp = new Employee();
  133. String odpowiedź = listaPytań.get(1) // będzie imie pracownika
  134. emp.setName( odpowiedź )
Add Comment
Please, Sign In to add comment