Hej
Pisząc swoją małą aplikację wpakowałem się w stos IF'ów, który wygląda tragicznie i łamie zasadę S z SOLID, ale nie mam pomysłu jak ją zastąpić czymś sensownym.
Kawałek kody wygląda tak:
public List<Offer> sortBy(List<Offer> offersToSort, String sortBy, String order) {
if (order.equals("ASC")) {
if (sortBy.equals("price")) {
offersToSort.sort(Comparator.comparingInt(Offer::getPrice));
}
if (sortBy.equals("title")) {
offersToSort.sort(Comparator.comparing(Offer::getTitle));
}
if (sortBy.equals("year")) {
offersToSort.sort(Comparator.comparingInt(Offer::getYear));
}
if (sortBy.equals("mileage")) {
offersToSort.sort(Comparator.comparingInt(Offer::getMileage));
}
if (sortBy.equals("engineSize")) {
offersToSort.sort(Comparator.comparing(Offer::getEngineSize));
}
if (sortBy.equals("enginePower")) {
offersToSort.sort(Comparator.comparingInt(Offer::getEnginePower));
}
if (sortBy.equals("doors")) {
offersToSort.sort(Comparator.comparingInt(Offer::getDoors));
}
if (sortBy.equals("colour")) {
offersToSort.sort(Comparator.comparing(Offer::getColour));
}
if (sortBy.equals("model")) {
offersToSort.sort(Comparator.comparing(o -> o.getModel().getName()));
}
if (sortBy.equals("bodyStyle")) {
offersToSort.sort(Comparator.comparing(o -> o.getBodyStyle().getName()));
}
if (sortBy.equals("fuelType")) {
offersToSort.sort(Comparator.comparing(o -> o.getFuelType().getName()));
}
} else if (order.equals("DESC")) {
if (sortBy.equals("price")) {
offersToSort.sort(Comparator.comparingInt(Offer::getPrice).reversed());
}
if (sortBy.equals("title")) {
offersToSort.sort(Comparator.comparing(Offer::getTitle).reversed());
}
if (sortBy.equals("year")) {
offersToSort.sort(Comparator.comparingInt(Offer::getYear).reversed());
}
if (sortBy.equals("mileage")) {
offersToSort.sort(Comparator.comparingInt(Offer::getMileage).reversed());
}
if (sortBy.equals("engineSize")) {
offersToSort.sort(Comparator.comparing(Offer::getEngineSize).reversed());
}
if (sortBy.equals("enginePower")) {
offersToSort.sort(Comparator.comparingInt(Offer::getEnginePower).reversed());
}
if (sortBy.equals("doors")) {
offersToSort.sort(Comparator.comparingInt(Offer::getDoors).reversed());
}
if (sortBy.equals("colour")) {
offersToSort.sort(Comparator.comparing(Offer::getColour).reversed());
}
if (sortBy.equals("model")) {
offersToSort.sort(Comparator.comparing((Offer o) -> o.getModel().getName()).reversed());
}
if (sortBy.equals("bodyStyle")) {
offersToSort.sort(Comparator.comparing((Offer o) -> o.getBodyStyle().getName()).reversed());
}
if (sortBy.equals("fuelType")) {
offersToSort.sort(Comparator.comparing((Offer o) -> o.getFuelType().getName()).reversed());
}
}
return offersToSort;
}
W skrócie o co chodzi, do metody dostarczam liste ofert, znacznik po czym sortujemy i znacznik ordeowania. W zależności od znaczników zwracana jest odpowiednio posortowana/orderowana lista
Jak to rozgryźć bez ifów?