Magazyn do przechowywania samochodów- metody i działanie serwisu

0

Witam wszystkich

Mam zadanie, z którym nie mogę sobie sam poradzić. Zaczynam zgłębiać tematykę programowania w Javie, więc prosiłbym o pomoc, nakierowanie mnie co do poprawnego kodu urzytego w tym zadaniu.

Mam stworzyć magazyn do przechowywania samochodów.
Klasa Car ma mieć pola producent i model.
Klasa CarWarehouse – klasa, która ma przechowywać auta. Wywołując konstruktor tej klasy ma przekazywać tylko jeden parametr :
– ile ten magazyn pomieści samochodów.
W klasie powinna znajdować się metoda odpowiedzialna za umieszczanie auta w magazynie.
Pamietać o tym, że gdy będzie brakowało miejsc to ma pojawić się w konsoli odpowiedni komunikat.
Kolejna metoda, ma drukować informację w konsoli dotyczącą tego jaki przykładowy samochód przekazaliśmy do wyszukiwania i
ile znaleziono samochodów o identycznych parametrach.
W klasie ma się znajdować odpowiednio skonstruowany getter, który zwróci aktualną listę samochodów przechowywanych
w magazynie (może być wraz z nullami), getter nie może złamać zasad hermetyzacji.
Wszystko mam przetestować w klasieCarWarehouseRunner.

Stworzyłem klase Car z polami i klasę CarWarehouse, która wywołuje konstruktora z parametrem ile ten magazyn pomieści samochodów.
Nie mogę sobie poradzić z metodami w zadaniu domowym. Jak poukładać to w całość by stworzyć te metody i dalej by to wszystko działało.
Prosiłbym o wskazówki jak to zrobić.
Z góry dzięki

public class Car {


    private String producer;
    private String model;

    public Car() {
    }

    public Car(String producer, String model) {
        this.producer = producer;
        this.model = model;
    }

    public String getProducer() { return producer; }

    public void setProducer(String producer) { this.producer = producer; }

    public String getModel() { return model; }

    public void setModel(String model) { this.model = model; }


    @Override
    public String toString() {
        return "Car{" +
                "producer='" + producer + '\'' +
                ", model='" + model + '\'' +
                '}';
    }

}

public class CarWarehouse {


    private Car[] carList;
    private int currentCarWarehouseCapacity;


    public CarWarehouse(int warehouseCapacity) { carList = new Car[ warehouseCapacity];
    }


    public Car[] getCarList() { return carList; }

2

Kilka uwag w przypadkowej kolejności.

  • Czy Car musi mieć settery ? bez nich byłby bardzo miły obiekt immutable. Nie zawsze stare szkoły (dawania seterów do wszystkiego) są potrzebne/celowe.
  • CarWarehouse zacząłeś dobrze. trzeba metodę bool AddCar(Car c)
  • ujawnianie wewnętrznego kontenera (tablicy którą nazywa list) nie zawsze jest dobre. Jest na jednym z wideo taki przykład negatywny (jak ktoś podrzuci link, będzie dobrze. Chyba mówcą był Kuba Kubryński):
   krokodyl.getUkladPokarmowy().getŻoładek().put(jedzenie)

gdy powinien być

krokodyl.nakarm(jedzenie);

Czyli udostępniać funkcjonalność, a nie struktury danych.

  • Ponieważ zadanie masz W klasie ma się znajdować odpowiednio skonstruowany getter, który zwróci aktualną listę samochodów przechowywanych
    w magazynie (może być wraz z nullami), getter nie może złamać zasad hermetyzacji.

ja zrobiłbym

public  Car[] getStoredCars() }{
    /* List */ list.toArray();
 }

A propos wymogu hermetyzacji, immutable Car bardzo do tego pasuje. Ktoś chcący ZOBACZYĆ samochody na składzie nie powinien móc ich ZMIENIAĆ, nie sądzisz?

0

dzięki za odzew :)
ad1.raczej nie potrzeba setterów, w razie czego mogę je dodać później, w takim razie usuwam
ad2. tak, ma to byc metoda addCar i kolejną metodę nazwałbym sampleCarInfo??
ad3. CarWarehouse zacząłem dobrze, ale Car[] carList jest już złym pomysłem???
ad4. gdzie wrzucić?

public  Car[] getStoredCars() }{
    /* List */ list.toArray();
 }
0

ad 4. oczywiście do Warehouse
ad 3. ujawnia wewnętrzną strukturę a nie funkcjonalność
ad 2. nie rozumiem drugiej części zdania, pewnie dobrze myślisz, ale ja nie wiem o co chodzi. Widzę że zadanie mówi o wyszukiwaniu itd... pewnie tak

1
  1. Czy model samochodu jest niezalezny od producenta? Czy Fiat produkuje Porsche Cayen?
  2. Dlaczego garaz ma zwracac nullowe samochody? To ma byc wyszukiwanie samochodow czy zajetosci miejsc? Jesli to drugie to jakas informacja o identyfikacji miejsca by sie przydala.
0

@vpiotr:
ad1. W zadaniu nie ma wzmianki o tym, ma to być uproszczone
ad2. Pierwsza metoda ma dodawać samochód a druga ma informować w konsoli jaki samochód został przekazany do wyszukiwania i ile znaleziono samochodów o identycznych parametrach
@AnyKtokolwiek .
ad2.Chodzi mi tutaj o nazwę drugiej metody, która ma informować jaki samochó został przekazany..
Nie potrawię sobie tego w głowie posortować i dojść do rozwiązania jak ma wyglądać kod w klasie Warehouse

Dodam jeszcze odnośnie metod, żę gdy będę dodawał samochód , który jest samplem w argumencie tej metody i metoda ma wyszukać samochody identyczne i je zliczyć to do tego mam uŻyć metodę equals() ale za nim jej użyję to mam porównać obiekty za pomocą metody hashCode. Jeśli hashCode dwóch obiektów tego przykładowałego samochodu i tego obiektu szukanego będą takie same to wtedy kolejny warunek, który będzie porównywać 2 obiekty za pomocą equals().
Panowie jak poskładać to w całość? Ktoś bardziej doświadczony może pomóc??

0

Próbuję coś wykombinować, póki co wygląda to tak.. @AnyKtokolwiek doradził mi wrzucenie fukcjonalności, ale nie potrafię tego poskładać w całość.
Mógłby ktoś zerknąć na kod i w miarę możliwości doradzić co poprawić??

public class CarWarehouse {


    private Car[] carList;
    private int currentCarWarehouseCapacity;


    public CarWarehouse(int warehouseCapacity) { carList = new Car[warehouseCapacity];
    }


    public Car[] getCarList() { return carList; }

    public void addCar(Car car) {
        if(car == null)
            System.out.println("Samochód nie może byc nullem!");
        else {
            if(currentCarWarehouseCapacity < carList.length) {
                carList[currentCarWarehouseCapacity] = car;
                currentCarWarehouseCapacity++;
                System.out.println("Samochód: " + car + " został dodany!");
            } else
                System.out.println(" Nie udało się dodać samochodu: " + car + ", ponieważ zabrakło miejsca!");
        }
4

NIGDY nie drukuj wyniku w podrzędnej funkcji. Zwłaszcza jak nie zwraca wyniku. To koszmar projektów studenckich.
Miało być **bool addCar(Car c) **- chyba jasne? Właśnie po to, aby użytek z tej wiedzy zrobiło miejsce wywołania. Może wcale nie chce drukować, tylko wykonać algorytm?

Na nullowy argument raczej się daje wyjątek

throw new IllegalArgumensException("Samochód nie może byc nullem!");

Podobnie jak dostałeś 80% gotowe getStoredCars() w oparciu o prawdziwą listę i toArray().
To właśnie była ta "funkcjonalność" jakkolwiek to dumnie brzmi.

public class CarWarehouse {

      private List<Car> carList;
    private int capacity;

    public CarWarehouse(int warehouseCapacity) {
        capacity = warehouseCapacity;
        carList = new ArrayList<Car>();
    }

    public Car[] getStoredCars() {
        return carList.toArray(new Car[1]);
    }

    public boolean addCar(Car car) {
        if (car == null) {
            throw new IllegalArgumentException("Samochód nie może byc nullem!");
        }

        if (carList.size() >= capacity) {
            return false;
        }

        carList.add(car);
        return true;
    }

Dodam jeszcze o "funkcjonalności". czasem to niemal tyle, ile zmiana nazwy. Zamawiającego guzik obchodzi w jakiej technicznej formie zwrócisz zbiór samochodów, grunt żeby były to Samochody w liczbie mnogiej.
A zwracania tablicy pisząc, że to jest lista, drażni tu myślę każdego.

**UPDATE **przy sobocie:
a zwracanie struktur danych tych "oryginalnych", jak pierwotnie miałeś, jest (poważnym) naruszeniem hermetyzacji.
Moje też nie jest idealne, kolekcja powinna być immutable z jakiejś dodatkowej biblioteki itd, ale to nie poziom tego wątku. Tu BARDZO ważne jest, że Car jest immutable, inaczej by trzeba było zwracać w kolekcji kopie obiektów, a nie oryginały.

0

@AnyKtokolwiek: dzięki za pomoc. Próbowałem sam coś zrobić ale analizując teraz to co stworzyłęm gołym okiem widać, że popełniłem sporo błedów.
Zamapiętam wzmiankę o funkcjonalności!
Potrzebuje jeszcze dopisać wzmiankę odnośnie braku miejsca w magazynie i odpowiednim komunikacie informującym w konsoli.

1 użytkowników online, w tym zalogowanych: 0, gości: 1