Estou escrevendo o código Ruby para um exercício de criptografia simples e frequentemente encontro esse dilema (o exercício é uma cifra de paciência, se você precisar saber). É uma questão de saber se eu devo preencher minha lógica com variáveis descritivas e instruções de etapa única que tornam a função legível em vez de instruções concisas e até densas que eliminam a repetição e / ou minimizam as oportunidades de erros.
Meu exemplo mais recente: Meu programa recebe entrada e, devido às rígidas diretrizes de formato, pode determinar facilmente se a entrada deve ser criptografada ou descriptografada. Para simplificar, uma vez que a chave e a mensagem de criptografia são convertidas / geradas para serem compatíveis, é uma questão de subtrair a chave da mensagem criptografada ou adicionar a chave a uma mensagem não criptografada, para obter a saída desejada (pense na chave como criptografia, mensagem + criptografia = código; código - criptografia = mensagem). A posição DRY diz para mim que devo converter minha mensagem criptografada de forma diferente da mensagem não criptografada para que a função que recebe a chave de criptografia e a aplica à mensagem nunca precise distinguir. Descobri que isso significa que preciso de algumas instruções if aninhadas na função, mas a lógica parece sólida. Este código, no entanto, não é facilmente legível.
Por outro lado, eu poderia escrever duas funções diferentes chamadas com base em um sinalizador definido quando o aplicativo determina a criptografia ou descriptografia. Isso seria mais simples de ler, mas duplicaria a função de alto nível de aplicar a chave de criptografia a uma mensagem (fazendo com que ela fosse criptografada ou descriptografada).
Devo me inclinar para código legível ou código conciso? Ou eu perdi outra maneira de obter essa funcionalidade e satisfazer os dois princípios? É uma posição em uma escala em que é preciso considerar o objetivo do projeto e tomar as melhores decisões para servir a esse objetivo?
Até agora, costumo enfatizar o código DRY conciso sobre o código legível.