Ativar e desativar os recursos da interface do usuário (ou outros) com base nas datas - um cheiro de código?

11

Temos um sistema horrível escrito no ASP.NET 2.0 ao qual precisamos adicionar algumas funcionalidades. O problema é que um determinado produto possui recursos de interface do usuário que precisam ser ativados para negócios iniciados após uma certa data (e outros desativados), enquanto a página deve aparecer igual para os negócios existentes.

Estou pressionando para que a página seja reescrita para novos negócios, pois instintivamente acho que a ideia de opções de interface do usuário JavaScript baseadas em datas e a mistura de controles da Web para que os antigos e os novos sejam "desarrumados" (por falta de uma palavra melhor) )

A prática de ter uma interface do usuário baseada em tempo apresenta uma prática amplamente aceita e, se não, quais são os riscos conhecidos de seguir esse curso de ação?

NMrt
fonte
13
Se os requisitos do domínio de negócios especificarem que algum recurso não estará disponível para o usuário, exceto dentro de um período de tempo específico, será "por design". Se você não gosta da ideia de que os controles ux aparecem e desaparecem, desative-os em vez de ocultá-los. Independentemente disso, a técnica é perfeitamente válida.
Robert Harvey
1
Acho que a frase "negócios iniciados após uma certa data" não é clara. Você quer dizer negócios com sua empresa (para clientes que se inscrevem após uma determinada data) ou negócios iniciados com seu cliente (para que seu cliente só possa fazer certas coisas com os dados do aplicativo se o cliente se inscrever após uma data específica)? No primeiro caso, você está falando sobre os recursos disponíveis para seus clientes. No último caso, você está falando sobre a restrição de ações inválidas em determinados dados (com base nas condições nos próprios dados). A resposta pode ser muito diferente nessas circunstâncias.
jpmc26

Respostas:

22

Não há nada de errado em ajustar uma interface do usuário com base em quais recursos estão habilitados para um cliente ou em quais tipos de implantação eles escolheram, mas a alteração deve

  1. depende de sinalizadores significativos, por exemplo, "HAVE_EXPORT" para ativar / desativar uma opção de exportação, não em comparações de datas estranhas. A interface do usuário não tem negócios conhecendo a regra de negócios sobre o que foi publicado quando, deve cumprir apenas sua tarefa de interface do usuário e obedecer às instruções específicas da interface.
  2. Seja controlado pelo servidor, para que um cliente não possa ativar clandestinamente recursos pelos quais não pagou.

(Note-se que o oposto - dis características abling após um certo tempo - é um grande não-não ser que você tenha claramente comunicada que você está vendendo uma versão de teste limitado no tempo Criando tais. Bombas de tempo em quaisquer outras circunstâncias vai fazer as pessoas odiá você mais rápido do que quase qualquer outra coisa.)

Kilian Foth
fonte
2
The UI has no business knowing the business rule about what was published when- Tudo bem, mas mesmo o Stack Exchange tem essas regras de interface do usuário. Por exemplo, o link "excluir" não aparece para outros usuários em perguntas fechadas até dois dias decorridos e a opção Migração é desativada após 60 dias.
Robert Harvey
Esclarei a pergunta com base nesta resposta: alguns controles serão removidos e outros serão adicionados, dependendo da data.
NMrt
13
@RobertHarvey, mas como é programado na exibição? É algo parecido if (showDelete) { <button>delete</button> }ou if ((post.date - today).days > 2) { <button>delete</button> }?
Arturo Torres Sánchez
@ ArturoTorresSánchez: O primeiro - a idéia toda é colocar a lógica de negócios (como a data da calibração) no servidor. Enfim, isso faria uma boa pergunta :-).
sleske
11

O requisito em si não é problemático, mas existem maneiras boas e ruins de implementá- lo. Se você tiver copiado e colado o código em todo o lugar que se parece com:

if (businessInitiationDate > cutoffDate)
  enableNewControlsForThisOneLittlePiece();
else
  enableOldControlsForThisOneLittlePiece();

Isso vai ser muito difícil de manter, mesmo que pareça mais rápido no momento. Por exemplo, talvez em algum momento alguns clientes mais antigos desejem o novo visual. Talvez em algum momento haja uma terceira configuração com sua própria data de corte.

Idealmente, você deseja que essa instrução if apareça exatamente uma vez no seu código, de preferência no lado do servidor. No entanto, você também deseja evitar apenas duplicar o aplicativo inteiro e fazer alterações. Encontre o código comum e considere-o, e crie pequenas funções separadas apenas para as partes que são diferentes. Em seguida, ative ou desative essas funções em um local central.

Karl Bielefeldt
fonte
6

É um requisito e, embora pareça fedorento - basicamente configuração baseada em um valor de data e hora - não há razão para que o tempo não possa ser usado para alterar sua interface do usuário. O case clássico é uma tela de navegação por satélite que muda de cores brilhantes durante o dia para um tema escuro à noite (e se você é realmente dedicado, uma cor suave no meio).

No entanto, uma coisa que posso sugerir como melhoria é remover o conceito de uma data que habilita os controles, mas um número de versão. A versão define a configuração da interface do usuário (ou seja, você tem um sinalizador configurado para NewCustomer e, no futuro, pode ser expandido para atender aos controles adicionais que o NewNewCustomer deseja e assim por diante). É muito mais fácil lidar com o código e tem um cheiro muito melhor.

Então você tem apenas um problema que está definindo o número da versão com base em alguns critérios, e isso pode ser feito por uma verificação de data hoje, possivelmente uma opção de configuração do servidor mais tarde ou até mesmo um cookie definido pelo login do usuário em algum momento o futuro.

gbjbaanb
fonte
5

Parece um caso especial de uma pergunta mais geral: é uma prática recomendada desativar os recursos da interface do usuário por motivos específicos, de acordo com regras predefinidas? A resposta, então, é "claro que não". A entrega de datas, em particular, pode ser complicada porque as datas e os horários são difíceis , mas, em princípio, não há uma boa razão para não fazer isso, se for o que seus requisitos de negócios exigem.

Mason Wheeler
fonte
3

Se as alterações tiverem a ver com algum objetivo comercial específico que seja sensível à data, será um mal necessário.

Se se trata de implantar uma revisão no programa que o alterará permanentemente e o design antigo nunca será usado novamente, é melhor implantar uma atualização no momento correto.

Robert Harvey
fonte
1
"é melhor simplesmente implantar uma atualização na hora correta" Nitpick: não necessariamente .... Por exemplo, a implantação pode exigir tempo de inatividade, o que não é prático no momento em que a troca deve ser feita. Ou talvez haja algum período de uso paralelo ... realmente depende.
sleske
Ou talvez você queira ter um botão "tocar jingle bells" no dia de Natal. Você pode não querer implantar isso todo Natal.
sixtyfootersdude
2

Soa bem. É bastante comum que as UIs se adaptem a diferentes usuários, por exemplo, aqui no stackoverflow, diferentes recursos são ativados ou desativados com base no karma de um usuário individual.

O motivo pelo qual você não gosta é que obviamente adiciona complexidade em relação a uma solução em que todos veem a mesma interface do usuário. No entanto, a complexidade parece ser complexidade essencial , ie. é um requisito de negócios, não um artefato de uma má decisão arquitetural. É claro que terá um custo (que você deve comunicar ao negócio), mas se a empresa decidir que vale o custo, você o implementará.

Riscos conhecidos: o maior risco é provavelmente testar a interface do usuário nas várias configurações. Se você começar a ativar / desativar os recursos da interface do usuário para vários grupos de usuários, poderá obter rapidamente uma explosão de configurações possíveis.

Você também deve implementar as restrições na camada de lógica de negócios, para verificar se os clientes não podem executar operações às quais eles não têm permissão, mesmo que a interface do usuário não permita isso em primeiro lugar:

JacquesB
fonte
Sim, o teste é realmente complicado se a interface do usuário puder mudar com base em vários fatores. Se for necessário, deve ser feito, mas ajuda a manter a variação no mínimo - e fornece uma maneira de alternar a interface do usuário para teste, independentemente de coisas como a data atual.
sleske
2

O que você está descrevendo é o conceito de namoro eficaz , que não é de modo algum uma idéia nova e, em essência, um tipo de problema temporal ao qual você pode aplicar um padrão temporal .

Basicamente, o que você faria em seu banco de dados é aplicar uma data efetiva aos módulos ou às versões do formulário (aqui denominadas componentes), armazenando alguns metadados sobre esses componentes e suas datas efetivas de início / término. Obviamente, você também precisará de alguns dados sobre seus usuários no aplicativo.

Parece que você pode ter outros motivos mais convincentes para considerar reescrever este aplicativo. Se os problemas efetivos de namoro são seus únicos problemas, sugiro que talvez implementar o namoro eficaz seja uma opção melhor. Caso contrário, você terá que avaliar isso com base no seu cenário.

ravibhagw
fonte
1

É um recurso que alterna com a ativação com base na data - o que é perfeitamente válido. Imagine se o recurso fosse usado apenas durante um período promocional ou tivesse que terminar quando uma nova regulamentação do governo entrar em vigor em uma determinada data.

Você está trabalhando no APS.NET e no JavaScript, mas o Togglz do quadro de recurso de alternância de recurso Java possui especificamente uma regra de ativação baseada em data (e hora!) .

user11393
fonte