Looks like it’s JavaScript, but in Java I would prefer to use the Stream API, something like this:
return availableDrivers.stream()
.filter(driver -> calculateDistance(rider, driver) < 5)
.filter(driver -> isPreferredVehicle(rider, driver))
.filter(driver -> meetsRiderPreferences(rider, driver))
.findFirst()
.orElse(null);
Then we have:
private boolean meetsRiderPreferences(Rider rider, Driver driver) {
if (driver.rating >= 4.5) {
if (rider.preferences.includes('Premium Driver')) {
return driver.isPremiumDriver;
} else {
return true;
}
} else if (driver.rating >= 4.0) {
return true;
} else {
return false;
}
}
This increases the separation of concern in a neat way, and it becomes more clear what the for loop does at a glance (get the first driver satisfying a set of conditions). The more complicated logic is isolated in meetsRiderPreferences, which now only returns true or false. Reading the method is more about making a mental map of a truth table.
It’s also easy to expand the logic (add more filter conditions, sort the drivers based on rating and distance, break out meetsRiderPreferences into smaller methods, etc.).
Not sure how the equivalent in JavaScript would look like, but this is what I would do in Java.