Bem, a medida que uso, ou gosto de pensar que uso, é esta:
Para cada requisito funcional independente, de uma linha, do tipo pegar ou largar, faça um instantâneo da base de código antes de implementá-la. Em seguida, implemente-o, incluindo a localização e correção de bugs introduzidos no processo. Em seguida, execute um diff
entre a base de código antes e depois. O diff
mostrará uma lista de todas as inserções, exclusões e modificações que implementaram a alteração. (Como inserir 10 linhas consecutivas de código, há uma alteração.) Quantas alterações ocorreram? Quanto menor esse número, normalmente, mais sustentável o código.
Eu chamo isso de redundância do código fonte, porque é como a redundância de um código de correção de erros. As informações estavam contidas em 1 pedaço, mas foram codificadas como N pedaços, que todos precisam ser feitos juntos, para serem consistentes.
Eu acho que essa é a idéia por trás do DRY, mas é um pouco mais geral. O motivo pelo qual essa contagem é baixa é boa: se forem necessárias N alterações para implementar um requisito típico, e como programador falível, você obtém apenas N-1 ou N-2 deles corretamente no início, você inseriu 1 ou 2 erros. Além do esforço de programação O (N), esses bugs precisam ser descobertos, localizados e reparados. É por isso que N pequeno é bom.
Manter não significa necessariamente legível para um programador que não aprendeu como o código funciona. A otimização de N pode exigir algumas ações que criam uma curva de aprendizado para os programadores.
Aqui está um exemplo.
Uma coisa que ajuda é se o programador tentar antecipar mudanças futuras e deixar instruções no comentário do programa.
Eu acho que quando N é reduzido o suficiente (o ideal é 1), o código fonte se parece mais com uma linguagem específica de domínio (DSL). O programa não "resolve" tanto o problema como "declara" o problema, porque, idealmente, cada requisito é apenas reapresentado como um único pedaço de código.
Infelizmente, não vejo pessoas aprendendo muito a fazer isso. Em vez disso, eles parecem pensar que substantivos mentais devem se tornar classes, e verbos, métodos, e tudo o que eles precisam fazer é girar a manivela. Isso resulta em código com N de 30 ou mais, na minha experiência.