Are multiple conditional operators in this situation a good idea?

前端 未结 21 2736
名媛妹妹
名媛妹妹 2020-12-15 06:23

I just saw this block of code on the Wikipedia article on conditional operators:

Vehicle new_vehicle = arg == \'B\' ? bus      :
                      arg ==         


        
相关标签:
21条回答
  • 2020-12-15 07:12

    This is a great example of conditional operator use. I use it in this manner all the time in C++, Java, and Perl.

    0 讨论(0)
  • 2020-12-15 07:14
    Vehicle new_vehicle = getVehicleByType(arg);
    
    Vehicle getVehicleByType(char arg){
      if (arg == 'B') return bus;
      if (arg == 'A') return airplane;
      if (arg == 'C') return car;
      if (arg == 'T') return train;
      if (arg == 'H') return horse;
      return feet;
    }
    

    I like this better. The nested conditional is clever, but I think this is almost as concise and less likely to confuse a future reader. Sorry if the syntax is off, I'm not doing much C nowadays.

    EDIT: Fixed return type omission noted in comments. thx!

    EDIT: I'm not horrified at your version by the way. I did not exclaim WTF or OMG when i saw it. I just prefer mine a little more :)

    0 讨论(0)
  • 2020-12-15 07:15

    Purely practical:

    Plus: The ternary sequence is more flexible, and can be used to avoid the limitations of switch, you could use other operators (e.g. <=, >=) or any other tests, including e.g. string comparisons.

    x = IsEven(arg) ?  0 : 
        (arg < 0)   ? -1 : 1; // or whatever
    

    Also, if the switch is a performance bottleneck and you have uneven probabilities, you can force the likeliest tests being done first (due to the not evaluated guarantee for the path not chosen).

    So-So Unlike a switch statement, order is important (unless you stick to ==). That can be an advantage, but being otherwise similar to switch that might be misleading when the maintainer is unfamiliar with the concept or in a hurry.

    Many developers may shy away because they aren't sure about the details (which terms will be evaluated, is the rpecedence of the operators ok?) - However, if your developer pool won't grasp a well-presented example, you might have problems that can't be solved by banning ternary operators.

    Minus It isn't as common as switch, thus the optimizer might not treat it the same. Optimizers are know to select the best fit implementation for a switch (table, binary search, comparison sequence, or any combination of this). Optimizers can't reaarange wevaluaiton order, and are less likely to support a table lookup here.

    Requires good formatting to be easily recognizable (lining up the '?' and ':') - Sucks when you use tabs.

    Aesthetics

    I like it for its precision and succinctness, close to mathematical notations. However, that might as well be used against it. It's probably an eyebrow raiser at code reviews, because it is less common and more brittle.

    0 讨论(0)
  • 2020-12-15 07:16

    Just for comparison, in C++0x you can have an expression without using the conditional operator or an out-of-line function:

    Vehicle new_vehicle = [&]() -> Vehicle {
        if (arg == 'B') return bus;
        if (arg == 'A') return airplane;
        if (arg == 'T') return train;
        if (arg == 'C') return car;
        if (arg == 'H') return horse;
        return feet;
    }();
    

    Not really any better, though.

    0 讨论(0)
  • 2020-12-15 07:17

    Purely a stylistic choice. For small data sets like you present here, then as long as your programming team isn't thrown by such a thing, then its fine in my book.

    0 讨论(0)
  • 2020-12-15 07:18

    Not only is there nothing wrong with it, it communicates the intent of the operation in the most concise and clear way possible.

    Replacing with if else, or switch construction requires that the snippet

    "new_vehicle =  "
    

    be repeated in every instance, which requires that the reader read every repeating instance of it to ensure that it is in fact the same in every instance..

    0 讨论(0)
提交回复
热议问题