No meu aplicativo, existem alguns modelos de expressão predefinidos que podem ser usados para filtrar dados. Um deles é " between x and y
". Um engenheiro de controle de qualidade afirma que há um defeito em sua definição porque " between 100 and 200
" fornece resultados diferentes de " between 200 and 100
". A expressão é traduzida internamente para " value >= x and value <= y
", portanto, obviamente não há resultados quando o segundo limite é mais baixo que o primeiro. Eu verifiquei que o mesmo comportamento está no SQL - " between x and y
" assume que y> = x ou não há resultados. Isso significa que o operador não é comutativo, pelo menos no SQL.
Então, o controle de qualidade está certo de que " between x and y
" deve ser comutativo?
requirements
pkalinow
fonte
fonte
between
deve incluir ou excluir os valores mais altos e mais baixos. A pessoa do controle de qualidade pode ser pedante, mas enquanto houver incerteza, alguém precisará esclarecer as histórias / requisitos do usuário. Pode acontecer que da maneira como é feito, como deveria ser, mas é necessário tomar uma decisão.Respostas:
Se sua especificação atual deixa isso indefinido, o comportamento é completamente arbitrário, não há definição "certa" ou "errada". Portanto, se o seu engenheiro de controle de qualidade não puder apontar o parágrafo exato da especificação em que esse comportamento está definido, você provavelmente poderá negar a solicitação dele (embora não pareça ser um requisito que exija muito esforço para implementá-lo). Se você não conseguir encontrar um consenso, uma pessoa em sua equipe terá que tomar uma decisão sobre o que é mais importante no contexto do aplicativo:
Qualquer que seja a decisão que sua equipe tome, pode ser uma boa idéia documentar o comportamento e o motivo pelo qual a decisão foi tomada.
fonte
Esta é uma questão de usabilidade ou experiência do usuário. Como o SQL ou qualquer outro sistema se comporta é irrelevante, a questão é o que faz mais sentido da perspectiva dos usuários.
O comportamento atual não faz sentido da perspectiva do usuário. Xey devem ser intercambiáveis ou não deve ser permitido selecionar um x maior que y. Permitir x maior que y, mas retornar um conjunto vazio, introduz uma possibilidade desnecessária de erros sem fornecer nenhum benefício.
Portanto, o engenheiro de controle de qualidade está correto, pois existe um defeito, mas a solução proposta não é necessariamente a melhor. Você precisa executar testes de usabilidade para decidir isso ou, pelo menos, perguntar a alguns usuários representativos o que lhes parece mais natural.
Como alternativa, você pode fazer a pergunta em /ux// . As pessoas ali sabem alguma coisa sobre a experiência do usuário.
fonte
Existem algumas opções sensatas, e a escolha depende do resto do sistema e das expectativas de seus usuários.
Você pode, como ressalta o engenheiro de controle de qualidade, tornar a expressão comutativa e a tradução seria
between x and y
=>value >= min(x, y) and value <= max(x, y)
Você pode restringir o uso válido a
x <= y
, o que exige que sua interface do usuário possa exibir "isso não é uma expressão válida" o mais cedo possível.Como uma variação do acima, a restrição
x < y
se você tiver uma expressãoequals x
e preferir que avaliarvalue >= x and value <= x
fonte
value >= min(x, y) and value <= max(x, y)
. Pré-calcule o que puder para salvar o trabalho do servidor de banco de dados, especialmente se for redundante assim (você pode executar as operações relevantes uma vez e definir os dois resultados de acordo). Pode não interessar, dependendo do servidor de banco de dados e dos valores específicos em que você está inserindo, mas um servidor SQL mal escrito pode executar omin
emax
para cada registro se você os colocar nowhere
e se pode retirar esse esforço , não há razão para não fazê-lo.value >= min(x, y) and value <= max(x, y)
é tão legível quantovalue >= minXY and value <= maxXY
, ondeminXY
emaxXY
são os limites pré-calculados. No entanto, para o último, será necessário escrever um código para adicionar essas novas duas variáveis ao sistema, preenchê-las antecipadamente, não se esqueça de atualizar esses valores quando xey mudar, e assim por diante. Dados redundantes sempre apresentam um certo risco de erros.Em um cenário não interativo, onde seus limites são criados por um script, geralmente faz sentido exigir que eles estejam em ordem. Isso cria menos uma verificação de validação, faz mais sentido semanticamente e é trivial de gerenciar.
Em um ambiente interativo, você deseja ajudar o usuário. Se possível, crie uma GUI que não permita a inserção de intervalos trocados ou, pelo menos, facilite a inserção de intervalos em ordem. Se você estiver inserindo os intervalos por texto, pegue uma página do vim, esse modelo de usabilidade e solicite ao usuário que troque automaticamente os intervalos invertidos:
Se seu engenheiro de controle de qualidade não tivesse nada no UX para mostrar a ele que um intervalo invertido seria indesejável, ele fez uma suposição razoável.
fonte
Francamente? Não use "entre". Em absoluto.
Primeiro, o termo é incrivelmente ambíguo, especialmente em inglês. É comutativo? Os termos são exclusivos? Inclusivo?
Segundo, se você estiver fazendo uma interface separada do back-end, não se preocupe com o comportamento do back-end; e também não permita que seus usuários assumam comportamentos herdados. Claro, o SQL define
BETWEEN
como inclusivo, mas esse quase nunca é o comportamento desejado (por exemplo - se você fizer algo comorows BETWEEN :start and :start + :stride
obterstride + 1
linhas).Em vez disso, você deve listar explicitamente as comparações para os pontos de extremidade. "Maior ou igual a x". "Antes de hoje". Isso remove a ambiguidade. Também ajuda a escrever um código mais limpo e evita alguns erros traiçoeiros. O exemplo de linhas anteriores é essencialmente o post de Djikstra sobre indexação . E permitir que o SQL use um limite superior inclusivo em alguns tipos pode resultar na seleção de dados incorretos .
fonte
Não é produtivo discutir com seu controle de qualidade sobre quem está "certo" e quem está "errado". Você interpretou as especificações de forma diferente do que elas. Isso significa que a especificação é suficientemente ambígua para exigir esclarecimentos.
Se a interface do usuário for a especificação e não for o comportamento que o controle de qualidade espera, não será o comportamento que alguns usuários esperam. Isso indica um problema de usabilidade (mesmo se você quiser discutir o PEBKAC). Trabalhe com seu controle de qualidade para encontrar uma solução satisfatória para isso.
Como ponto geral, tenha cuidado com palavras como "entre" que parecem claras, mas não são. Além do seu desacordo sobre se deve ou não ser comutado, há problemas com a inclusão de ambos os lados e podem intuitivamente significar coisas diferentes em domínios diferentes (por exemplo, "entre sexta e segunda" significa algo diferente para a maioria das pessoas do que "entre segunda e segunda" Sexta-feira")
fonte
Vou bifurcar um princípio UNIX que fala sobre interfaces simples.
Onde quer que exista uma interface que você esteja oferecendo ao mundo exterior, mantenha a coisa o menos surpreendente possível!
Agora que reduzi a declaração do problema para uma mais pragmática, acho que você levará apenas alguns momentos para perceber que, ao especificar intervalos de números, é óbvio manter o menor como o anterior ***. Se ainda é um enigma, pense assim: quantas vezes você usou a maneira inversa de representar dois números e dizer às crianças como compará-los?
Se o seu engenheiro de controle de qualidade chamar isso de bug, diga-lhe educadamente que espera alguns erros reais , e não maneiras de transmitir energia dispendiosa em coisas triviais.
fonte
Faça seu código de depuração gerar uma condição de erro ou registrar um aviso sempre que os valores forem passados na ordem errada. Dessa forma, o código de chamada pode verificar e trocar parâmetros, se necessário. Dessa forma, os usuários desse 'recurso' ficarão cientes e farão a coisa certa (que você não sabe de antemão).
fonte