Cordão Mágico - Magic string

Na programação de computadores , uma string mágica é uma entrada que um programador acredita que nunca virá externamente e que ativa funções que de outra forma seriam ocultas. Um usuário deste programa provavelmente forneceria informações que forneceriam uma resposta esperada na maioria das situações. No entanto, se o usuário de fato fornece inocentemente a entrada predefinida, invocando a funcionalidade interna, a resposta do programa é frequentemente inesperada para o usuário (parecendo assim "mágica").

Fundo

Normalmente, a implementação de strings mágicas é devido a restrições de tempo. Um desenvolvedor deve encontrar uma solução rápida em vez de se aprofundar em um problema e encontrar uma solução melhor.

Por exemplo, ao testar um programa que obtém os dados pessoais de um usuário e verifica seu número de cartão de crédito, um desenvolvedor pode decidir adicionar um atalho de string mágico em que inserir a entrada improvável de "***" como um número de cartão de crédito faria com que o programa para proceder automaticamente como se o cartão fosse válido, sem perder tempo verificando. Se o desenvolvedor esquecer de remover a string mágica e um usuário do programa final inserir "***" como um número de cartão de crédito de espaço reservado ao preencher o formulário, o usuário inadvertidamente acionará a funcionalidade oculta.

Resolução

Situações / questões de causa

Freqüentemente, existem restrições de tempo significativas fora do controle do desenvolvedor desde o início de seu envolvimento em um projeto. Problemas comuns que podem levar a este antipadrão como resultado:

  • Nulo! = Nulo ou qualquer variação em que um tipo de dados não se compara bit a bit a um tipo supostamente idêntico. Esse é um problema que pode ocorrer até mesmo no mesmo ambiente de desenvolvimento (mesma linguagem de programação e compilador). Este problema tem uma longa história para tipos numéricos e booleanos e muitos compiladores lidam bem com isso (com avisos e erros aplicáveis, resolução padrão, etc ...). Tipos anuláveis , como cadeias de caracteres, têm a dificuldade de definições historicamente diferentes para NULL . Os erros / avisos produzidos são geralmente gerais ou um erro padrão de 'melhor ajuste' cuja mensagem não descreve realmente o que está acontecendo. Se o desenvolvedor não conseguir pistas suficientes para rastrear o problema através da depuração, pegar um atalho e codificar em uma string 'padrão' pode ser a única maneira de manter o projeto dentro do cronograma. Uma solução para isso pode ser a aplicação do padrão Objeto Nulo .
  • Programado em um canto. Às vezes, um design parece direto e até mesmo simples, mas acaba apresentando uma falha lógica, dependente das possíveis entradas do usuário, devido a uma circunstância muitas vezes imprevista no final do desenvolvimento planejado. Assim, um desenvolvedor pode sentir a necessidade de implementar uma entrada do usuário com permissões especiais de segurança / operacionais para lidar com tais circunstâncias. Isso pode ser particularmente irônico, pois às vezes ficará óbvio que um design mais robusto desde o início provavelmente teria deixado espaço para lidar com a falha. No entanto, talvez isso levasse muito tempo para ser implementado e pudesse entrar em conflito com o conceito fundamental de engenharia do KISS , mantendo um design e implementação simples e atendendo apenas aos requisitos iniciais necessários.
  • Permitindo acesso externo a uma bandeira global . O excesso de confiança de que um sinalizador global nunca pode ser definido acidentalmente ou de forma mal-intencionada (geralmente uma suposição bastante razoável) justifica tal implementação para fins de teste e depuração, especialmente para pequenos aplicativos com interfaces simples. Se a distribuição do programa for considerável, no entanto, geralmente é apenas uma questão de tempo até que alguém defina a bandeira. Uma solução óbvia é nunca usar uma variável global dessa maneira. Um desenvolvedor também pode tornar o sinalizador circunstancialmente acessível. Portanto, a string mágica por si só seria tratada pelo programa como qualquer outra entrada. O usuário deve então reproduzir a configuração, bem como produzir alguma coleção de outros eventos, que a interface do usuário discretamente permite, para que o sinalizador aceite a configuração; um cenário muito mais improvável, embora ainda seja possível.

Formatação estrita

Restringir o formato da entrada é uma possível solução de manutenção (correção de bug). Essencialmente, isso significa validar as informações de entrada para verificar se estão no formato correto, a fim de reduzir a possibilidade de a string mágica ser descoberta pelo usuário. Os exemplos incluem validar um número de telefone para garantir que contenha apenas dígitos (e possivelmente espaços e pontuação até certo ponto) ou verificar se o nome de uma pessoa tem um nome próprio e um sobrenome (e está apropriadamente em maiúscula). Uma exceção é feita para a string mágica no código de validação para que ela não seja rejeitada pela validação. Espera-se que, como um usuário provavelmente notaria rapidamente a aplicação estrita da formatação, provavelmente não ocorreria ao usuário tentar inserir uma string que não estivesse em conformidade com o formato. Portanto, é muito improvável que o usuário tente a string mágica.

Como em qualquer processo de validação de entrada, é importante garantir que o formato não seja restritivo de uma forma que restrinja acidentalmente o uso do aplicativo por alguns usuários. Um exemplo disso é restringir a entrada de número de telefone ou código postal com base no sistema de um país (por exemplo, exigir que cada usuário forneça um código postal de cinco dígitos ), causando problemas para usuários legítimos que residem em outros países.

Implementação proposital

Como costuma ser o caso com antipadrões, existem cenários específicos em que strings mágicas são a solução correta para uma implementação. Os exemplos incluem códigos de trapaça e ovos de Páscoa . Além disso, há casos em que os usuários inventam cadeias de caracteres mágicas e os sistemas que não foram codificados para aceitá-los podem produzir resultados inesperados, como placas de veículos ausentes.

Veja também

Referências

  1. ^ Chris Falter (06-03-2008), A Good Solution for Magic String Data , "Egghead Cafe Tuturiols" at Egghead Cafe , recuperado em 11/05/2009 Link externo em |publisher= ( ajuda ) CS1 maint: parâmetro desencorajado ( link )
  2. ^ Frank Naude (06-12-2008), NULL , "Oracle Wiki" em Oracle Wiki , recuperado em 13-05-2009 Link externo em |publisher= ( ajuda ) CS1 maint: parâmetro desencorajado ( link )
  3. ^ Wang Lam (2003/05/21), o comportamento de NULL de em SQL "da Universidade de Stanford" no Stanford Infolab , recuperado 2009-05-13 Link externo em |publisher= ( ajuda ) CS1 maint: parâmetro desencorajado ( link )
  4. ^ Eric Freeman, Elisabeth Freeman, Kathy Sierra, Bert Bates; 2004, Head First Design Patterns , 1ª ed., O'Reilly, Capítulo 6, pág. 214, The Command Pattern , ISBN   0-596-00712-4 , ISBN   978-0-596-00712-6
  5. ^ James McCaffrey (2009), Test Automation for ASP.NET Web Apps with SSL , "Microsoft" no MSDN , recuperado em 13/05/2009 Link externo em |publisher= ( ajuda ) CS1 maint: parâmetro desencorajado ( link )
  6. ^ Andrew Cumming; 2007, SQL Hacks , 1ª ed., O'Reilly, pág. 174, Prevent an SQL Injection Attack , ISBN   0-596-52799-3 , ISBN   978-0-596-52799-0
  7. ^ Brian Knight, Allan Mitchell, Darren Green, Douglas Hinson, Kathi Kellenberger; 2005, Professional SQL Server 2005 integration services , 1st ed., John Wiley and Sons, Capítulo 5, pág. 129, Handling Dirty Data , ISBN   0-7645-8435-9 , ISBN   978-0-7645-8435-0
  8. ^ Sezen, Tonguc Ibrahim; Isikoglu, Digdem (2007-04-27). "DOS OZANOS PARA OS MODOS DE DEUS: ENGANANDO NO ENTRETENIMENTO INTERATIVO DE CULTURAS DIFERENTES" (PDF) : 8 . Página visitada em 24/01/2009 . Citar diário requer |journal= ( ajuda ) CS1 maint: parâmetro desencorajado ( link )
  9. ^ https://www.snopes.com/autos/law/noplate.asp