Использование true и false в качестве выражений в условной операции - PullRequest
14 голосов
/ 01 июля 2010

Я поддерживаю некоторый код и нашел следующий шаблон:

var isMale = (row["Gender"].ToString() == "M") ? true : false;

вместо этого:

var isMale = (row["Gender"].ToString() == "M");

Есть ли причина , почему кто-нибудь сделал бы это? Кто-нибудь думает, что первое более читабельно или понятнее? Есть ли какая-то старая C "уловка", от которой это задержка?

Ответы [ 9 ]

19 голосов
/ 02 июля 2010

веская причина?Нет.

Обычно его создают люди, которые на самом деле не понимают, что условие само по себе является выражением, производящим логический результат.В частности, люди обучаются на языке, где это не так, например, во многих вариантах Бейсика.

16 голосов
/ 01 июля 2010

Полагаю, если вам заплатит персонаж, который будет действительным.Кроме этого я не могу придумать ни одной причины.

10 голосов
/ 02 июля 2010

Если вы не можете доверять: (row["Gender"].ToString() == "M") правильному или ложному продукту, то вы, вероятно, тоже не можете доверять: (row["Gender"].ToString() == "M") ? true : false;. Безусловно, вам, безусловно, нужно повторить это хотя бы еще несколько раз:

(row["Gender"].ToString() == "M") ? true : false ? true : false ? true : false;

Опять же, может быть, вы не можете доверять комбинации == и ?: сами по себе - чтобы быть действительно уверен, вам, вероятно, нужно как минимум чуть больше избыточности:

if ((row["Gender"].ToString() == "M") ? true : false ? true : false ? true : false == true)
    isMale = true == true;
else
    isMale = false != false;

Хм ... может, я не спал прошлой ночью ...: -)

4 голосов
/ 02 июля 2010

Полагаю, некоторым людям неудобно присваивать что-либо, кроме true или false, логической переменной.Не знаю, почему это так, но я наблюдал это довольно много раз.

Итак, с этой стороны это выглядит так:

установить сарказм на

bool isMale = (row["Gender"].ToString() == "M"); //BAAAAD

но

bool isMale = (row["Gender"].ToString() == "M") ? true : false; //BETTER

и

bool isMale;
if (row["Gender"].ToString() == "M") 
    isMale = true;
else 
    isMale = false;   // BEST!

отключить сарказм

К счастью, Решарпер быстро справляется со всемиантишаблоны.

4 голосов
/ 02 июля 2010

Я думаю, что это полностью избыточно.

По моему опыту, это часто случается, когда условное утверждение развивается с течением времени и заканчивается явным истиной или ложью, а не подвыражением.

3 голосов
/ 02 июля 2010

if (somebool) return true;
else return false;

"шаблон" смеется почти везде, где я когда-либо работал. На мой взгляд, нет причин делать это.

2 голосов
/ 02 июля 2010

Применение троичного оператора?: Для выражения, которое может вычислять только значение true / false (x==y), просто избыточно (просто избыточно [избыточно]).

Приведенное выше предложение может быть проще для чтения тем, кто не очень хорошо понимает английский, так как они будут знать, что искать сначала в словаре и, если произнесут, из-за повторения.Тем не менее, для носителей английского языка это предложение неудобно и, ну, в общем, излишне.

В вашем примере, либо оператор используется в целях документирования, либо, не намереваясь обидеть, я подозреваю, что есть плохое пониманиео том, как работают операторы и выражения.

Будь то отсутствие понимания или какая-то странная попытка документирования, мы можем сделать это без лишних операторов, таких как:

var isMale = (row["Gender"].ToString() == "M"); // bool

или ...

var isMale = (row["Gender"].ToString() == "M"); // true/false

... или, что еще лучше, явно укажите соответствующий тип для isMale вместо того, чтобы полагаться на неявную типизацию:

bool isMale = (row["Gender"].ToString() == "M");

Я также видел, как люди пессимизируют свой кодпуть (или использование if / else):

bool something = some_int ? true: false;

Нет необходимости делать это, и, хотя компилятор может оптимизировать это, по своей природе менее эффективно полагаться на механизмы ветвления для чего-то столь простого:

bool something = some_int != 0;

..., который имеет тот же эффект, но без обходного процесса использования условного ветвления.

Этот видкода просто стыдно.Это все равно что видеть:

switch (x)
{
    case 1: 
        y = 1;
        break;
    case 2:
        y = 2;
        break;
    case 3:
        y = 3;
        break;
    // etc. for all possible values of x
}

Вышесказанное наверняка будет рассматриваться большинством как код uber-n00b, но логически он не менее избыточен, чем x == y ? true: false или x ? true: false (в отличие от x != 0).

1 голос
/ 02 июля 2010

Второй способ, безусловно, имеет смысл, и я думаю, что его легче читать.

2-й способ немного умнее.Я бы не сказал, чтобы я делал что-то похожее на то, что вы находите, если бы я делал код в пятницу днем, а мой мозг уже ушел на выходные: -)

1 голос
/ 02 июля 2010

Определенно избыточно.Может быть, оставшаяся практика из другого языка программирования / среды, которую сохранял первоначальный разработчик.Я также мог бы потенциально видеть разработчика, просматривающего первую строку, более читабельным, поскольку он / она может быстро увидеть, что он устанавливает логическое значение при просмотре кода.

...