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

Wypożyczalnia samochodów - jak operować na tym samym obiekcie w różnych klasach

VPS Starter Arubacloud
0 głosów
323 wizyt
pytanie zadane 10 lipca 2018 w Java przez must Bywalec (2,980 p.)

Cześć, tworzę drugi wątek, bo tamten mogłem opisać trochę niezrozumiale.
Tworzę wypożyczalnie samochodów.
Stworzyłem dwie klasy - DataGetter (która ma w sobie metody pobierające wymagane dane do metod z DataBase np. dla klienta są potrzebne dane: imie, nazwisko... a dla samochodu: marka, rok produkcji) oraz RentalCarEngine. Mam problem z operowaniem na tym samym obiekcie, w wyniku czego w klasie Main tworzę jeden obiekt Klienta i przesyłam go do dwóch metod z dwóch różnych klas. Nie wiem czy to jest dobry sposób, jeżeli nie to w jaki sposób tego uniknąć. Wygląda to tak:

 

public class Main {
 
    public static void main(String[] args) throws SQLException {
        Client client = new Client();
        Car car = new Car();
        CarRentalEngine carRentalEngine = new CarRentalEngine();
        DataGetter dataGetter = new DataGetter();
 
        dataGetter.getDataClient(client);
        carRentalEngine.createNewCustomer(client);
 
    }
}

Klasa DataGetter

public class DataGetter {
    Scanner input = new Scanner(System.in);
 
    void getDataClient(Client client) {
        System.out.print("name: ");
        client.setName(input.next());
        System.out.print("surname: ");
        client.setSurname(input.next());
        System.out.print("city: ");
        client.setCity(input.next());
        System.out.print("house number: ");
        client.setHouseNumber(input.nextInt());
        System.out.print("street: ");
        client.setStreet(input.next());
        System.out.print("pesel number: ");
        client.setPeselNumber(input.nextLong());
        System.out.print("rent date: ");
        client.setRentDate(input.next());
    }

Klasa RentalCar

public class CarRentalEngine {
    private DataBase dataBase = new DataBase();
 
    public CarRentalEngine() throws SQLException {
    }
 
    void createNewCustomer(Client client) throws SQLException {
        dataBase.insertNewCustomer(client.getName(), client.getSurname(), client.getStreet(), client.getHouseNumber(), client.getCity(), client.getPeselNumber(), client.getRentDate());
    }

Myślałem o tym, by metoda `getDataClient` tworzyła nowy obiekt klienta od razu i jakoś go przesłać do tych pozostałych klas, ale nie mam pojęcia jak. Bo metoda `dataBase.insertNewCustomer` potrzebuje konkretnych danych, a nie całego obiektu.

2 odpowiedzi

0 głosów
odpowiedź 10 lipca 2018 przez mbabane Szeryf (79,280 p.)
wybrane 10 lipca 2018 przez must
 
Najlepsza
  dataGetter.getDataClient(client);

Nazwa metody raczej nie jest najlepsza - może sugerować, że zwraca obiekt typu DataClient.

Możesz to przekształcić tak:

Client createClient()
{
    Client client = new Client();
    System.out.print("name: ");
    client.setName(input.next());
    System.out.print("surname: ");
    client.setSurname(input.next());
    System.out.print("city: ");
    client.setCity(input.next());
    System.out.print("house number: ");
    client.setHouseNumber(input.nextInt());
    System.out.print("street: ");
    client.setStreet(input.next());
    System.out.print("pesel number: ");
    client.setPeselNumber(input.nextLong());
    System.out.print("rent date: ");
    client.setRentDate(input.next());

    return client;
}

A tutaj:

void createNewCustomer(Client client) throws SQLException {
        dataBase.insertNewCustomer(client.getName(), client.getSurname(), client.getStreet(), client.getHouseNumber(), client.getCity(), client.getPeselNumber(), client.getRentDate());
    }

Dużo czytelniej będzie jeśli metoda insertNewCustomer również będzie przyjmować obiekt klasy Client. Im mniej dana metoda przyjmuje argumentów tym lepiej.

Według mnie na tym etapie jakim jesteś Dependency-Injection, może wprowadzić Ci tylko dodatkowy zamęt. Opanuj najpierw zwykłe podejście, a dopiero potem przejdź do bardziej zaawansowanych technik.

komentarz 10 lipca 2018 przez must Bywalec (2,980 p.)

@mbabane, o coś takiego mi chodziło :) Dzięki wielkie! 

Postaram się jakos przebudować tę klasę, by przyjmowała Clienta.

public void insertNewCustomer(String name, String surname, String street, int houseNumber, String city, long peselNumber, String rentDate) throws SQLException {
            preparedStatement = connection.prepareStatement("insert into client" + "(namee, surname, street,houseNumber,city,peselNumber,rentDate)" + "values(?,?,?,?,?,?,?)");

            preparedStatement.setString(1, name);
            preparedStatement.setString(2, surname);
            preparedStatement.setString(3, street);
            preparedStatement.setInt(4, houseNumber);
            preparedStatement.setString(5, city);
            preparedStatement.setLong(6, peselNumber);
            preparedStatement.setString(7, rentDate);

            preparedStatement.executeUpdate();
        }

 

0 głosów
odpowiedź 10 lipca 2018 przez Mariusz08 Maniak (62,300 p.)
Na pierwszy rzut oka robisz to dobrze - poczytaj o DependencyInjection (czy też wstrzykiwaniu zależności).
komentarz 10 lipca 2018 przez must Bywalec (2,980 p.)

tak, czytałem o tym właśnie szukając rozwiazania tego.

Ale chyba nie widzę tutaj innej sposobności na to co teraz robie, z tego wzgledu, ze 

dataBase.insertNewCustomer

potrzebuje konkretnych danych czyli client.getName(), a te dane ustawiane są w innej klasie.

komentarz 10 lipca 2018 przez Mariusz08 Maniak (62,300 p.)
No i dobrze, potrzebujesz zastosować ten wzorzec to go stosujesz. Troszkę nie rozumiem dlaczego szukasz dziury w całym?
komentarz 10 lipca 2018 przez must Bywalec (2,980 p.)
Z tego względu, że getter powinien coś zwracać, a nie przyjmować parametr, dlatego coś mi tu nie gra.
komentarz 10 lipca 2018 przez Mariusz08 Maniak (62,300 p.)

getter zwraca wartość którą pobiera (np. getName() zwraca imię), a setter przyjmuje parametr (np. setName())

komentarz 10 lipca 2018 przez must Bywalec (2,980 p.)

Tak, wiem. Nie o to chodzi. Popatrz na moja metodę w DataGetter. Ona jest getterem, jak kilka kolejnych metod, które zamierzałem w ten sam sposób dorobić. Powinna coś zwracać i tutaj jest właśnie problem. 

 

Podobne pytania

0 głosów
0 odpowiedzi 307 wizyt
pytanie zadane 8 lipca 2018 w Java przez must Bywalec (2,980 p.)
0 głosów
2 odpowiedzi 603 wizyt
pytanie zadane 6 lipca 2018 w Java przez must Bywalec (2,980 p.)
0 głosów
1 odpowiedź 365 wizyt

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...