• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Mały code review

Object Storage Arubacloud
0 głosów
172 wizyt
pytanie zadane 27 grudnia 2017 w Rozwój zawodowy, nauka, praca przez LockeLamora Użytkownik (740 p.)

To dopiero moje początki z javą, napisałem dwa proste programy i prosiłbym o mały code review żeby ktoś mi powytykał błędy zebym ich później nie powtarzał. Programy są w sumie dość podobne ale nie mam pomysłu co innego pisać, może przy okazji ktoś podpowie jakies pomysły na program na podobnym poziomie a najlepiej troche wyższym ale bez przesady wink

https://github.com/Kamil159 

Dlaczego w strumieniach jak miałem .peek na koncu to było ignorowane a jak tylko dodałem .count to peek działało normalnie

1 odpowiedź

+1 głos
odpowiedź 27 grudnia 2017 przez ShiroUmizake Nałogowiec (46,300 p.)

No to po kolei:

  1. Pliki konfiguracyjne zbędne
  2. Pliki impl zbędne
  3. Brak infomacji jak odpalić
  4. Nazwa nie sugeruje to co ma mówić: 
       ControlApp controlApp = new ControlApp();
            controlApp.hotelControl();
        }

     

  5. Jesteś pewny, że chcesz tylko po przez konstruktor wstrzykiwać zależności? 
    public ControlApp() {
            hotel = new Hotel();
            dataReader = new DataReader();
        }
  6. Field nie wkszuje na to co robi: 

    private Hotel hotel
  7. Wcięcie 

    }
    
    
        public void hotelControl() {
            Option option = null;

     

  8. Dlaczego nie jako pole? I tak go nullujesz 

    Option option = null;
  9. A potem sprawdzasz co zawiera? 

            while (option != Option.EXIT)
  10. Można by go przerzucić do throw metody, ładniej by to wyglądało 

    try {
                    printOptions();
                    option = Option.createFromInt(dataReader.readInt());
                    switch (option) {
                        case DISPLAY_ALL_ROOMS:
                            printAllRooms();
                            break;
                        case DISPLAY_FREE_ROOMS:
                            printFreeRooms();
                            break;
                        case DISPLAY_ROOM:
                            printRoom();
                            break;
                        case RENT_ROOM:
                            rentRoom();
                            break;
                        case RELEASE_ROOM:
                            releaseRoom();
                            break;
                        case EXIT:
                            break;
                        default:
                            System.out.println("Brak opcji o takim numerze");
                    }
                }catch (InputMismatchException e){
                    System.out.println("Wrowadzona liczba ma niepoprawny format");
                }catch ( NoSuchElementException e) {
                    System.out.println("Brak opcji o takim numerze");
                }
            }
  11. Użyłbym strategii. 

    switch (option) {
                        case DISPLAY_ALL_ROOMS:
                            printAllRooms();
                            break;
                        case DISPLAY_FREE_ROOMS:
                            printFreeRooms();
                            break;
                        case DISPLAY_ROOM:
                            printRoom();
                            break;
                        case RENT_ROOM:
                            rentRoom();
                            break;
                        case RELEASE_ROOM:
                            releaseRoom();
                            break;
                        case EXIT:
                            break;
                        default:
                            System.out.println("Brak opcji o takim numerze");
                    }
  12. Przerzuciłym to do osobnej klasy np: DataReaderStrategy. Metoda nie mówi tego co robi

  13. Przerzuciłbym to do osobnej klasy np: ConsolePrinter i na podstawi akcji tworzyłbym event. (Poczytaj o strategii)

     private void printOptions() {
            System.out.println("\nWybierz opcje");
            for (Option o : Option.values()) {
                System.out.println(o);
            }
        }
    
        private void printAllRooms() {
            for (int i = 1; i <= Hotel.getMaxRooms(); i++) {
                System.out.println(hotel.getRoom(i));
            }
        }
    
        private void printFreeRooms() {
            long count = hotel.getRooms().values().stream().filter(x -> x.getLastName()==null)
                    .sorted(new Hotel.sortByNr()).peek(System.out::println).count();
        }
    
        private void printRoom() {
            System.out.println("Podaj numer pokoju 1...25");
            Room p = hotel.getRoom(dataReader.readInt());
            if (p == null) {
                System.out.println("Nie ma takiego pokoju");
            } else
                System.out.println(p);
    
        }
    
  14. Można jako osobną kolekcje metod: + plus metoda nie mówi tego co robi
    long count = hotel.getRooms().values().stream().filter(x -> x.getLastName()==null)
                    .sorted(new Hotel.sortByNr()).peek(System.out::println).count();
    

     

  15.  Za duża odpowiedzialność klasy, mógłbyś pociągnić pod klasę typu serwis: RentService 
     private void rentRoom() {
    
            Room p = dataReader.readPerosn();
            if(p.getRoomNumber()>25) {
                System.out.println("Nie ma takiego pokoju");
            }else
            hotel.rentRoom(p);
        }
    
    
        private void releaseRoom(){
            System.out.println("Podaj dane wynajmującego");
                Room p = dataReader.readPerosn();
                String fullName = p.getFullName();
                String roomNr= Integer.toString(p.getRoomNumber());
                if(hotel.getRooms().get(fullName).equals(hotel.getRooms().get(roomNr))) {
                    hotel.releaseTheRoom(p);
                }else
                System.out.println("Nie ma takiej osoby");
        }
  16. Na pierwszy rzut oka, ten if nic nie mówi. Powinno być osobną metodą. Poczytaj o kompozyt. 

    if(p.getRoomNumber()>25) {
    if(hotel.getRooms().get(fullName).equals(hotel.getRooms().get(roomNr))) 
  17. Dlaczego enum jest wraz hotelControl ? 
    public enum Option {
            EXIT(0, "Wyjście"),
            DISPLAY_ALL_ROOMS(1, "Wyświetl wszystkie pokoje"),
            DISPLAY_FREE_ROOMS(2, "Wyświetl wolne pokoje"),
            DISPLAY_ROOM(3, "Wyświetl informacje o pokoju"),
            RENT_ROOM(4, "Wynajmij pokój"),
            RELEASE_ROOM(5, "Zwolnij pokój");
    
            private int value;
            private String description;
    
            Option(int value, String description) {
                this.value = value;
                this.description = description;
            }
  18. ??? . Poczytaj o mapowaniu.

    blic static Option createFromInt(int i) throws NoSuchElementException, ArrayIndexOutOfBoundsException {
                Option result = null;
                try {
                    result = Option.values()[i];
                } catch (NoSuchElementException | ArrayIndexOutOfBoundsException e) {
                    throw new NoSuchElementException("Brak opcji o wskazanym numerze");
                }
                return result;
            }

     

  19. To samo co wcześniej, za duża odpowiedzialność: 

    public class Hotel
  20. Co zostało podektywowane za tym rozwiązaniem? 

     room = new TreeMap<>();
  21. Możesz również to za pomocą filter. 

     public static class sortByNr implements Comparator<Room> {
            @Override
            public int compare(Room p1, Room p2){
                if(p1==null && p2==null) return 0;
                if(p1==null) return 1;
                if(p2==null) return -1;
                Integer i1 = p1.getRoomNumber();
                Integer i2 = p2.getRoomNumber();
                return i1.compareTo(i2);
                }
        }

    Poczytaj o standardach o strukturze javowych projektów

Praktycznie te same błędy w 2 projekcie. 

 

 

 

 

komentarz 27 grudnia 2017 przez LockeLamora Użytkownik (740 p.)
1,2 Ok, zapamiętam.

3. Potrzebne są jakieś informacje, przeciez to tylko skompilować trzeba?

4. To jaka powinna być nazwa? Wydaje mi się ze mówi co trzeba.

5. A jak jeszcze?

9. Sprawdzam czy nie zawiera exit, coś tu jest nie tak?

10. Co przerzucić?

11,12,13. Strategii i eventów jeszcze nie znam.

14. ??

17. Dlaczego nie?

18. Czemu źle?

20. Mógłbyś rozwinąć?

21. Jak?
komentarz 28 grudnia 2017 przez ShiroUmizake Nałogowiec (46,300 p.)
3. Nie, to co odpalasz to jedynie wersja devowa, musisz zbudować manifest, wskażnik do class. Musisz zrobić tak by JRE był w stanie odczytać. Więcej na ten temat zapraszam tutaj: http://www.skylit.com/javamethods/faqs/javaindos.html. Choć to jest mała przyjemna metoda dla użytkownika , lepiej za pomocą projekt-builderów jak maven: http://www.vogella.com/tutorials/ApacheMaven/article.html

4.W architekturze, przyjęło się Controler jako 'warstwa' komunikacyjna się między warstwami. A po drugie typowy problem z OPP. Czy kontrolkaApplikacji potrafi rezerwować pokój.?

5.Za pomocą faktorek :), jeżeli chemy rozwijać nasz system pojawia się, że inne zasady będą dla hotelu roboczego, dla małego hotelu, pensjonatu. Np: w moim projekcie mam ponad 15 obiektów typu DAO, obsługujących różne persystancje. Po drugie, za każdym razem jak będę chciał odwołować się do innego hotelu to będę musiał tworzyć obiekt Control??

10.Zobacz obsługę wyjątków: https://docs.oracle.com/javase/tutorial/essential/exceptions/throwing.html . Możesz spowodować, za każdym razem będzie sprawdzane try/catch

11.Kolekcja metód jako osobny obiekt przykład: https://bitbucket.org/s14216/serviceapi/src/39877d1d0ef14a2721ff32dc864046dcbafdf829/src/main/java/pl/edu/pjatk/mpr/lab5/service/OrdersService.java?at=master&fileviewer=file-view-default

17. A jak będę miał klasę na 1000 linijek?? Będę szukał enum. Inna systuacja co jeżeli będę chciał użyć gdzieś indziej?

20. Dlaczego zdecydowałeś na treeMap a nie np na hashMap

21.filter, sorted? A jak nie tak to masz wbudowane comparator w streamAPI. https://www.leveluplunch.com/java/tutorials/007-sort-arraylist-stream-of-objects-in-java8/

Podobne pytania

0 głosów
0 odpowiedzi 107 wizyt
pytanie zadane 14 sierpnia 2020 w Nasze projekty przez KopfSzmercen Bywalec (2,870 p.)
0 głosów
0 odpowiedzi 345 wizyt
pytanie zadane 26 czerwca 2021 w Java przez ITshnyk Obywatel (1,800 p.)
0 głosów
2 odpowiedzi 365 wizyt
pytanie zadane 25 stycznia 2021 w Nasze projekty przez Bakkit Dyskutant (7,600 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...