Resposta curta: Sim, as strings não são ideais para nenhuma tarefa além de armazenar e acessar uma sequência de caracteres textuais e, mesmo que os bits subjacentes de uma abstração sejam strings, há benefícios em referenciá-los como variáveis ou constantes .
Resposta longa: a maioria dos idiomas oferece tipos que estão mais próximos do domínio do seu problema e, mesmo que não, eles provavelmente possuem algum método pelo qual você pode definir leftcomo uma entidade diferente de right(etc etc). Transformar isso em uma string usando "left"é simplesmente perda da linguagem e da funcionalidade útil do IDE, como verificação de erro. Mesmo se você precisar usar
left = "left";
ou algo equivalente, ele tem vantagens em usar a string quando você se refere a ela em seu código. Por exemplo,
if (player.direction == Left)
seria detectado como um erro em tempo de compilação (na melhor das hipóteses, java e outros) ou seria sinalizado por qualquer IDE que tivesse seus bits como errado (na pior das hipóteses, básico e tal).
Além disso, ter a noção de leftuma entidade referenciável o ajudará a acomodar qualquer direção que você decidir seguir com o tipo de direção. Ao usar "left", a direção está comprometida em ser a String. Se você encontrar ou criar uma abstração melhor para o tipo, precisará procurar por todo o corpo do código, alterando cada instância de "left". Uma constante ou variável não exigirá nenhuma alteração se o tipo for elaborado.
O tipo que você realmente deseja é específico para o seu domínio. O que seu código está planejando fazer com o seu left? Talvez você queira espelhar o eixo x de uma textura ou sprite que esteja voltado para a esquerda ou avance; leftNesse caso, convém criar um objeto com uma propriedade ou método que reflita esse comportamento, com o rightobjeto tendo o resultado não espelhado oposto. Você pode fazer essa lógica em um objeto que representa os sprites ou texturas; nesse caso, novamente, você sofrerá o uso, em "left"vez de leftpelos motivos mencionados acima.
Em Java (e provavelmente em outras linguagens que ainda não conheço), enumé uma boa alternativa porque, em Java, enumé tão útil quanto final classem um conjunto finito de instâncias. Você pode definir comportamentos, se precisar deles, e pode mudar para uma classe aberta sem aborrecimentos fora do arquivo que declara o enum, mas muitos idiomas vêem isso enumcomo um tipo primitivo ou requerem sintaxe especial para usar. Isso vaza o enumcódigo para o código que não tem nada a ver com ele e pode precisar ser corrigido posteriormente. Certifique-se de entender o conceito de um idioma enumantes de considerar a opção.