Novemade
Todas as experiências

Emprestar um resolvedor em vez de reescrever as regras

Quando uma demonstração precisa da lógica de um produto, é mais seguro incorporar o código verdadeiro do que reescrever uma versão simplificada dele?

EXPERIMENTO

·

Uma demonstração de navegador normalmente reimplementa apenas o suficiente do produto para parecer certa. Isso serve até que a parte interessante do produto seja uma regra fácil de descrever e difícil de acertar — momento em que a reescrita publica discretamente uma versão pior daquilo que se anuncia.

O Glow Garden é exatamente esse caso. A sua regra lê-se como um cliché de puzzle: um pirilampo por linha, por coluna, por região colorida, nenhum a tocar noutro. Mas o jogo não verifica as colocações contra essas regras. Pergunta a um resolvedor se o tabuleiro ainda pode ser concluído, e recusa o toque se não puder. Isso significa que uma colocação pode ser legal isoladamente e ainda assim ser rejeitada, que é o que faz o jogo parecer justo em vez de arbitrário — e é precisamente a subtileza que uma reescrita teria achatado.

Por isso, em vez de reescrever, o núcleo de regras foi copiado da aplicação sem alterações, o seu resumo criptográfico foi registado, e colocou-se à frente dele uma fronteira tipada para que a compilação quebre se o original alguma vez se afastar. A mesma abordagem funcionou depois para a função de estêncil do Veyra.

O que aprendemos

Conclusões até agora.

  1. 01

    A parte que vale a pena copiar raramente é a parte que parece complicada. É a parte em que uma reimplementação plausível estaria subtilmente errada e ninguém repararia.

  2. 02

    Incorporar código precisa de uma fronteira, não só de uma cópia. Uma superfície tipada escrita à mão à frente do código emprestado é o que transforma «afastou-se» de uma mudança silenciosa de comportamento numa compilação falhada.

  3. 03

    Só funciona onde a lógica já é pura. As duas peças que se transplantaram de forma limpa não tinham importações nem qualquer framework por baixo, e essa é uma propriedade que se obtém escrevendo-as assim, não desejando-a mais tarde.

  4. 04

    Um tabuleiro fixo precisa ainda assim da garantia do verdadeiro gerador. O tabuleiro da demonstração foi procurado com o próprio resolvedor da aplicação até aparecer um com exatamente uma solução, em vez de ser desenhado à mão e esperado o melhor.

Vê-lo a funcionar

A verificação de regras é o código do próprio Glow Garden, retirado sem modificações, incluindo o solucionador que recusa qualquer colocação que deixasse o tabuleiro insolúvel. O tabuleiro é fixo em vez de gerado, e foi procurado com esse mesmo solucionador até aparecer um com exatamente uma solução.