Как объясненный Zach, можно использовать:
xor = bool(a) ^ bool(b)
Лично, я одобряю немного отличающийся диалект:
xor = bool(a) + bool(b) == 1
Этот диалект вдохновлен логическим языком схематического изображения, который я выучил в школе, где "ИЛИ" был обозначен полем, содержащим ≥1
(больше, чем или равный 1), и "XOR" был обозначен полем, содержащим =1
.
Это имеет преимущество корректной реализации эксклюзивного или на нескольких операндах.
Попробуйте:
navigator.__defineGetter__('userAgent', function(){
return 'foo' // customized user agent
});
navigator.userAgent; // 'foo'
Пробовали в FF2 и FF3.
Нет, я сомневаюсь, что вы можете сделать это с помощью javascript. Но с помощью переключателя пользовательских агентов Firefox вы можете протестировать любой пользовательский агент, какой захотите, так почему бы просто не использовать его?
Обновление:
Судя по комментариям, похоже, что у многих есть проблемы с XML. Я знаю, что сейчас это круто, и у него есть свои проблемы, но в данном случае я думаю, что это работает. Одна из других причин, по которой я выбрал его, заключается в том, что существует множество библиотек для его анализа, что может облегчить жизнь.
Другая ключевая концепция заключается в том, что информация действительно нереляционная . Так что да, вы можете хранить данные в любом конкретном примере в кучу разных таблиц с большим количеством объединений, но это больно. Но если бы я продолжал приводить вам несколько другие примеры, держу пари, вам придется до бесконечности изменять свой дизайн. Я не думаю, что добавление таблиц и изменение сложных операторов SQL - это очень весело. Так что немного расстраивает то, что за комментарий @ scheibk проголосовали.
Исходное сообщение:
Я думаю, что проблема, с которой вы можете столкнуться с хранением информации о квестах в базе данных, состоит в том, что она не совсем реляционная (то есть не очень легко помещается в таблицу). Возможно, именно поэтому у вас возникли проблемы с разработкой таблиц для данных.
С другой стороны, если вы поместите информацию о вашем задании непосредственно в код, это означает, что вам придется редактировать код и перекомпилировать каждый раз, когда вы хотите добавить квест. Хромой.
Так что, если бы я был вами, я мог бы подумать о том, чтобы сохранить информацию о моих квестах в XML-файле или в чем-то подобном. Я знаю, что это универсальное решение для чего угодно, но в данном случае оно мне подходит. XML действительно создан для хранения не связанных и / или иерархических данных, точно так же, как материал, который вам нужно хранить для вашего квеста.
Резюме: вы можете придумать свою собственную схему,
Думаю, я бы выбрал метод внедрения зависимостей. Вместо:
function myFunction() {
var userAgent = navigator.userAgent;
// do stuff with userAgent
}
Может быть, сделайте что-нибудь вроде:
function myFunction(userAgent) {
// do stuff with userAgent
}
function getUserAgent() {
window.userAgentReal = +window.userAgentReal || 0;
return [ navigator.userAgent ][window.userAgentReal++];
}
function getUserAgentMock() {
window.nextUserAgentMock = +window.nextUserAgentMock || 0;
return [
'test user agent1',
'test user agent2',
'test user agent3'
][window.nextUserAgentMock++];
}
var userAgent;
while (userAgent = getUserAgent()) {
myFunction(userAgent);
}
Затем вы можете «смоделировать» getUserAgent ()
, выполнив:
function getUserAgentReal() { // formerly not 'Real'
// ...
}
function getUserAgent() { // formerly 'Mock'
// ...
}
Этот дизайн все еще не полностью автоматизирован (вам нужно вручную переименовать геттер для выполнения вашего тестирования), и он добавляет кучу сложности к чему-то столь же простому, как работа с navigator.userAgent
, и я не уверен, как вы на самом деле идентифицируете какие-либо ошибки в myFunction
, но я просто решил, что брошу его туда, чтобы дать вам несколько идей, как с этим можно справиться.
Может быть, идея «внедрения зависимостей», представленная здесь, каким-то образом может быть интегрирована с FireUnit.