Является ли хорошей практикой использование оператора xor для логических проверок?

TL; DR

Правильный способ сделать это в mongo

Не использовать RegExp

Перейти к естественному и использовать встроенное индексирование mongodb, поиск

Шаг 1:

db.articles.insert(
   [
     { _id: 1, subject: "coffee", author: "xyz", views: 50 },
     { _id: 2, subject: "Coffee Shopping", author: "efg", views: 5 },
     { _id: 3, subject: "Baking a cake", author: "abc", views: 90  },
     { _id: 4, subject: "baking", author: "xyz", views: 100 },
     { _id: 5, subject: "Café Con Leche", author: "abc", views: 200 },
     { _id: 6, subject: "Сырники", author: "jkl", views: 80 },
     { _id: 7, subject: "coffee and cream", author: "efg", views: 10 },
     { _id: 8, subject: "Cafe con Leche", author: "xyz", views: 10 }
   ]
)

Шаг 2:

Необходимо создать индекс в зависимости от того, какое поле TEXT вы хотите искать, без запроса индексирования будет чрезвычайно медленным

db.articles.createIndex( { subject: "text" } )

шаг 3:

db.articles.find( { $text: { $search: "coffee",$caseSensitive :true } } )  //FOR SENSITIVITY
db.articles.find( { $text: { $search: "coffee",$caseSensitive :false } } ) //FOR INSENSITIVITY

148
задан nbro 22 February 2018 в 20:16
поделиться

8 ответов

Можно просто использовать != вместо этого.

296
ответ дан vaxquis 22 February 2018 в 20:16
поделиться

Я думаю, что это было бы хорошо, если бы Вы прокомментировали его, например, // ^ == XOR.

14
ответ дан nbro 22 February 2018 в 20:16
поделиться

Я нахожу, что у меня есть подобные переговоры много. С одной стороны, у Вас есть компактный, эффективный метод достижения Вашей цели. С другой стороны, у Вас есть что-то, что остальная часть Вашей команды не могла бы понять, будучи сложно поддерживать в будущем.

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

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

16
ответ дан nbro 22 February 2018 в 20:16
поделиться

Я недавно использовал xor в проекте JavaScript на работе, и закончил тем, что добавил 7 строк комментариев для объяснения, что продолжалось. Выравнивание для использования xor в том контексте состояло в том, что одно из условий (term1 в примере ниже) могло взять не два но три значения: undefined, true или false, в то время как другой (term2) мог быть true или false. Я должен был бы добавить дополнительную проверку на эти undefined случаи, но с xor, следующее было достаточно, так как xor вынуждает первый срок быть сначала оцененным, поскольку булевскую переменную, позволяя undefined рассматривают как [1 110]:

if (term1 ^ term2) { ...

Это было, в конце, чем-то вроде излишества, но я хотел сохранить его там так или иначе как вид пасхального яйца.

6
ответ дан nbro 22 February 2018 в 20:16
поделиться

Если шаблон использования выравнивает по ширине его, почему нет? В то время как Ваша команда не распознает оператор сразу же, со временем они могли. Люди изучают новые слова все время. Почему не в программировании?

единственная осторожность, которую я мог бы заявить, состоит в том, что "^" не имеет семантики короткого замыкания Вашей второй булевой проверки. Если Вам действительно нужна семантика короткого замыкания, то статический util метод работает также.

public static boolean xor(boolean a, boolean b) {
    return (a && !b) || (b && !a);
}
-1
ответ дан Alan 22 February 2018 в 20:16
поделиться

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

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

27
ответ дан Martin 22 February 2018 в 20:16
поделиться

! = в порядке для сравнения двух переменных. Это не работает, тем не менее, с несколькими сравнениями.

-3
ответ дан 22 February 2018 в 20:16
поделиться
if((boolean1 && !boolean2) || (boolean2 && !boolean1)) 
{ 
  //do it 
} 

ИМХО, этот код можно упростить:

if(boolean1 != boolean2) 
{ 
  //do it 
} 
5
ответ дан 23 November 2019 в 22:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: