2015-12-02 1 views
0

Я написал код, который присваивает переменные, используя результаты условий выражения без явного использования IF-ELSE заявления.Blending Булева алгебра и Числовой Алгебра назначить переменные

В простейшем виде проблема выглядит следующим образом:

Version 1

if (x < K) 
    y = A; 
else 
    y = B; 

Я видел «трюк» в прошлом, в котором люди выполнить ту же задачу в одном линии без условного так:

Version 2

y = (x < K) * A + !(x < K) * B; 

Этот подход довольно легко распространяется для обработки заданий IF-ELSE IF-ELSE. Хитрость заключается в том, чтобы гарантировать, что условия являются взаимоисключающими.

С точки зрения модульного тестирования, я должен достичь 100% покрытия кода.

Мои коллеги согласны, что версия 2 является более элегантным, но они утверждают, что это менее читаемыми. Более того, они утверждают, что я являюсь «боковым шагом» по охвату покрытия и что я смог бы достичь 100% -ного охвата пути путем «скрытия» условной логики внутри одной строки кода без фактического осуществления обоих условий ((x < K) и !(x < K)).

Я утверждаю, что я могу смешивать булеву алгебру и числовую алгебру для выполнения назначения переменных, потому что компьютер рассматривает логические «истинные» и «ложные» как «1» и «0», которые можно умножить на «float» и переменные 'int'. Для меня это просто арифметическое выражение с нулями и множителями.

Почему я это делаю?

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

Вопрос

Является ли эта практика (и тройные операторы) осуждено с точки зрения модульного тестирования?

Если этот вопрос слишком субъективен, предложите изменения.

+0

1.Это не компьютер, который «обрабатывает логические« истинные »и« ложные »как« 1 »и« 0 », это особый язык. Других языков нет. 2. Почему бы просто не использовать условный оператор? Это, по-видимому, должно избегать «охвата бокового шага», одновременно удовлетворяя ваши другие цели. –

+0

Спасибо за информацию. Я не понимал, насколько это зависит от языка. К сожалению, условный оператор недоступен на языке, который я использую. – zigzag

ответ

1

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

cond(bool, x, y) { if (bool) return x; else return y; } 

себя и написать y = cond(x < K, A, B). Это более читаемо, сложнее сделать ошибку при записи, можно использовать с не-числовыми типами и правильно рассматривается в охвате путей. Он оценивает обе стороны, в отличие от фактического условного оператора (если у языка нет макросов или ленивой оценки), но так же описанный трюк.

+0

Это подход, который я использовал. – zigzag

 Смежные вопросы

  • Нет связанных вопросов^_^