Skip to content

Latest commit

 

History

History
134 lines (100 loc) · 4.78 KB

File metadata and controls

134 lines (100 loc) · 4.78 KB

EX12

Class Cargo

Selleks, et mitte luua iga kauba tüübi jaoks eraldi klassi, loome enum`i.

public enum CargoType {
    HUMAN(1), WOOD(2), WATER(4), FUEL(5), FIRE(6);

    int dangerLevel;

    CargoType(int value) {
        this.dangerLevel = value;
    }

}

Selleks, et igal kaubal oleks riskitase, kasutan annan igale enumi väärtusele kaasa numbri, mis tähendab riskitaset.

public Cargo(CargoType cargoType) {
    this.cargoType = cargoType;
}

public int getDangerLevel() {
    return cargoType.dangerLevel;
}

Class Car

Siin klassis võiks olla muutuja, mis hoiab enda sees klassi Cargo objekti (või mitte hoiab, juhul kui car on tühi). Kuna car võib tühi olla, siis peab olema võimalus seda täita kaubaga. Näiteks iga Cargo objekti sees võib olla muutuja, kuhu pannakse sisse kaup.

public String getCargoName() {
  if (cargo == null) {
    return "EMPTY";
  } else {
    return cargo.getName();
  }
}

Class Engine

Kuna veduriga peab andma kaasa tema riskitaset, siis peaks juba konstruktoris määrama, et veduri loomisel seda kindlasti annakse kaasa. Sellele võiks järgneda kontroll selleks, et keegi kogemata ei paneks riskitaseme väärtuseks negatiivse arvu või nulli.

if (riskLevel <= 0) {
    risklevel = 1;
}

Class Train

Kuna rongil on vedur ja vagunid, siis rongi loomisel peaks andma talle veduri ja vaguneid. On vaja meeles pidada, et mõned kaubad ei sobi koos vedamiseks, seega on vaja teha kontroll. Näiteks, lisada kõik potentsiaalsed kaubad listi ja siis kirjutada abimeetod. Kui lugeda hoolikalt läbi kaupade mittesobivused, siis osutub, et õigeid kombinatsioone pole väga palju.

private boolean cargosAreOk() {
  return cargos.size() == 0 || cargos.size() == 1 || cargos.contains(Cargo.CargoType.FUEL)
          && cargos.contains(Cargo.CargoType.FIRE) || cargos.contains(Cargo.CargoType.WATER) && cargos.contains(Cargo.CargoType.HUMAN)
          || cargos.contains(Cargo.CargoType.WOOD) && cargos.contains(Cargo.CargoType.HUMAN);
}

Kui kontroll on tehtud, siis oleks vaadata ka seda, et riskitase ei läheks liiga suureks. Võiks teha listi, kuhu pannakse kõik vagunid, mille summaarne riskitase oleks väiksem kui vedur võimaldab.

int sum = 0;
for (Car car: a) {
    if (sum + car.getCargo().getDangerLevel() <= engine.getRiskLevel()) {
        trainCars.add(car);
        sum += car.getCargo().getDangerLevel();
    }
}

Class Depot

Võiks olla list kus hoitakse selle depoo vagunid ning ka selle depoo vedurid. Peab olema võimalus lisada ja eemaldada listidest elementid (kuna depoosse võib olmuda uus rong või siis vedur). Peamiseks meetodiks depoo klassis on rongi tegemine. Rongide mäletamiseks pärast rongi tegemist võiks seda lisada listi. Algul peaks tegema kaupade kontrolli (vaata meetodit üleval).

Siis peaks tegema valuku veduri suhtes. (Mõistlik teha eraldi meetodis) PS. Siin valitakse parimat vedurit (boonus)

if (engineList.size() > 0) {
    if (cargoTypes.length == 1 && cargoTypes[0].getDangerLevel() > this.getBestEngine().get()
            .getRiskLevel()) {
            return Optional.empty();
        }
    }
    int index = 0;
    for (int i = 0; i < engineList.size(); i++) {
        if (engineList.get(i).getRiskLevel() > engineList.get(index).getRiskLevel()) {
            index = i;
        }
    }
    Engine head = engineList.get(index);
    engineList.remove(index);

Nüüd peab panema kaubad vagunitesse ja teha rongi. Alljärgnevas koodis on vaadatud juhtum kus esimeseks vaguniks ei tohi olla fuel (tehakse Boonust). Vaadake kindlasti üle ka teised juhtumid (kui rongi ei tagastata) ja tagastake tühka Optional`i. Tulemus salvastatakse rongide listis.

if (riskLevel <= 0) {
    risklevel = 1;
}
if (chosenCarsss.size() > 0) {
  if (chosenCarsss.get(0).getCargoName().equals("FUEL")) {
    return Optional.empty();
  }
Train trainNew = new Train(head, chosenCarsss.toArray(new Car[chosenCarsss.size()]));
trainList.add(trainNew);
return Optional.of(trainNew);
}

Boonus

Selles osas on vaja kasutada erindite püüdmist ning ka teha erindeid. Soovitan lugeda sellest siin: https://ained.ttu.ee/javadoc/Exceptions.html#erindiga-tegelemine-exception-handling Lisaks sellele on vaja kirjutada testid. Testide kirjutamise kohta saab teada siin (lõpus): https://ained.ttu.ee/mod/charon/view.php?id=6045

Kontroll selleks, et kütus poleks esimeseks kaubaks on realiseeritud ning veduriks valitakse ka parima riskitasemega vedur.