this post was submitted on 24 Sep 2024
84 points (92.0% liked)

Programming

17408 readers
74 users here now

Welcome to the main community in programming.dev! Feel free to post anything relating to programming here!

Cross posting is strongly encouraged in the instance. If you feel your post or another person's post makes sense in another community cross post into it.

Hope you enjoy the instance!

Rules

Rules

  • Follow the programming.dev instance rules
  • Keep content related to programming in some way
  • If you're posting long videos try to add in some form of tldr for those who don't want to watch videos

Wormhole

Follow the wormhole through a path of communities !webdev@programming.dev



founded 1 year ago
MODERATORS
you are viewing a single comment's thread
view the rest of the comments
[–] magic_lobster_party@fedia.io 29 points 1 month ago (4 children)

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.

[–] Kissaki@programming.dev 9 points 1 month ago* (last edited 1 month ago)

Using early returns and ternary conditional operator changes

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;
    }
}

to

private boolean meetsRiderPreferences(Rider rider, Driver driver) {
    if (driver.rating < 4.0) return false;
    if (driver.rating < 4.5) return true;

    return rider.preferences.includes('Premium Driver') ? driver.isPremiumDriver : true;
}

dunno if java has them, but in C# switch expressions could put more of a case focus on the cases

private boolean meetsRiderPreferences(Rider rider, Driver driver) {
    return driver.rating switch {
        < 4.0 => false,
        < 4.5 => true,
        _      => rider.preferences.includes('Premium Driver') ? driver.isPremiumDriver : true,
    };
}

or with a body expression

private boolean meetsRiderPreferences(Rider rider, Driver driver) => driver.rating switch {
    < 4.0 => false,
    < 4.5 => true,
    _      => rider.preferences.includes('Premium Driver') ? driver.isPremiumDriver : true,
};

The conditional has a true result so it can be converted to a simple bool condition as well.

private boolean meetsRiderPreferences(Rider rider, Driver driver) => driver.rating switch {
    < 4.0 => false,
    < 4.5 => true,
    _      => !rider.preferences.includes('Premium Driver') || driver.isPremiumDriver,
};
load more comments (3 replies)