• ArbitraryValue@sh.itjust.works
    link
    fedilink
    English
    arrow-up
    1
    ·
    edit-2
    2 months ago

    My issue with this is that it works well with sample code but not as well with real-world situations where maintaining a state is important. What if rider.preferences was expensive to calculate?

    Note that this code will ignore a rider’s preferences if it finds a lower-rated driver before a higher-rated driver.

    With that said, I often work on applications where even small improvements in performance are valuable, and that is far from universal in software development. (Generally developer time is much more expensive than CPU time.) I use C++ so I can read this like pseudocode but I’m not familiar with language features that might address my concerns.

  • arendjr@programming.dev
    link
    fedilink
    arrow-up
    1
    ·
    2 months ago

    While I can get behind most of the advice here, I don’t actually like the conditions array. The reason being that each condition function now needs additional conditions to make sure it doesn’t overlap with the other condition functions. This was much more elegantly handled by the else clauses, since adding another condition to the array has now become a puzzle to verify the conditions remain non-overlapping.

  • magic_lobster_party@fedia.io
    link
    fedilink
    arrow-up
    0
    ·
    2 months ago

    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.

    • wewbull@feddit.uk
      link
      fedilink
      English
      arrow-up
      1
      ·
      2 months ago

      It doesn’t hide. It makes them happen first and, here’s the important bit, closes their scope quickly.

      • Zexks@lemmy.world
        link
        fedilink
        arrow-up
        1
        ·
        2 months ago

        The scope is irrelevant it’s a single function class as presented. It was a single method that they broke out “to hide the ifs”. Then they just used compiler specialties to remove the word ‘if’ from the assignments. The comparisons are still there and depending on the execution path those constants may not be so constant during runtime.

      • Zexks@lemmy.world
        link
        fedilink
        arrow-up
        0
        arrow-down
        1
        ·
        2 months ago

        They’re still ifs. They’ve just been lambda’d and assigned to constants.

        • BrianTheeBiscuiteer@lemmy.world
          link
          fedilink
          arrow-up
          2
          arrow-down
          1
          ·
          2 months ago

          branching ≠ if ≠ conditional

          They’re all related but can’t just be used interchangeably. “if” is a reserved keyword to indicate a specific syntax is expected. It’s not the semantics the author was trying to change, it’s the syntax, and the overall point is that you aren’t always required to use the specific “if” syntax to write code just like you’re not required to use “while” to achieve looping.

          • Zexks@lemmy.world
            link
            fedilink
            arrow-up
            1
            arrow-down
            1
            ·
            2 months ago

            If you decompile that code you won’t get lambdas. You get ifs. Because that is how the hardware is build. Ifs/ands/Ors that is what computing is built on. Everything else is flavor.

            • platypus_plumba@lemmy.world
              link
              fedilink
              arrow-up
              1
              ·
              2 months ago

              The title of the post is “how to avoid if-else hell”, not “how to avoid conditionals”. Not sure what’s your point.

  • hector@sh.itjust.works
    link
    fedilink
    arrow-up
    0
    ·
    edit-2
    2 months ago

    EDIT: read the article turns out it’s super useful… It gives insight into decision table which is a pattern I did not know about until recently…

    Is this really a recurring design pattern for y’all?

    I mean, you can just use a switch. anyways I’ll read the article and see ;)

    • Carighan Maconar@lemmy.world
      link
      fedilink
      arrow-up
      2
      ·
      2 months ago

      Decision tables are nice. They hide the important part of the logic away out of view of another programmer trying to figure out a bug in the code.

      Very helpful! You take longer to find and fix bugs, and potentially miss a few extra ones because of stuff like this. Increased tech debt. Highly recommended! 👍

      • hector@sh.itjust.works
        link
        fedilink
        arrow-up
        0
        ·
        2 months ago

        I mean, you can just right click “Definition” in VSCode and see how it works… It’s not that inconvenient.

        It’s easy to read, write and refactor so I don’t really see what you mean.

        • BehindTheBarrier@programming.dev
          link
          fedilink
          arrow-up
          1
          ·
          edit-2
          2 months ago

          What’s fun is determining which function in that list of functions actually is the one where the bug happens and where. I don’t know about other langauges, but it’s quite inconvenient to debug one-linres since they are tougher to step through. Not hard, but certainly more bothersome.

          I’m also not a huge fan of un-named functions so their functionality/conditions aren’t clear from the naming, it’s largely okay here since the conditional list is fairly simple and it uses only AND comparisons. They quickly become mentally troublesome when you have OR mixed in along with the changing booleans depending on which condition in the list you are looking at.

          At the end of the day though, unit tests should make sure the right driver is returned for the right conditions. That way, you know it works, and the solution is resistant to refactor mishaps.

    • HamsterRage@lemmy.ca
      link
      fedilink
      arrow-up
      1
      ·
      2 months ago

      You might want to think about it a bit more before putting it to work. The comment with the streams example is far, far better.