Obviamente, o princípio YAGNI lhe dirá para aplicar o SRP antes que você realmente precise. Mas a pergunta que você deve se fazer é: preciso aplicar o SRP primeiro e somente quando tiver que alterar meu código?
De acordo com a minha experiência, o aplicativo do SRP oferece um benefício muito antes: quando você precisa descobrir onde e como aplicar uma alteração específica no seu código. Para esta tarefa, você deve ler e entender suas funções e classes existentes. Isso fica muito mais fácil quando todas as suas funções e classes têm uma responsabilidade específica. Portanto, IMHO, você deve aplicar o SRP sempre que facilitar a leitura do código, sempre que tornar suas funções menores e mais auto-descritivas. Portanto, a resposta é sim , faz sentido aplicar o SRP mesmo para o novo código.
Por exemplo, quando seu código de impressão lê um documento, formata o documento e imprime o resultado em um dispositivo específico, essas são 3 responsabilidades claras e separáveis. Portanto, faça pelo menos três funções com elas, atribua-lhes os nomes. Por exemplo:
void RunPrintWorkflow()
{
var document = ReadDocument();
var formattedDocument = FormatDocument(document);
PrintDocumentToScreen(formattedDocument);
}
Agora, quando você obtém um novo requisito para alterar a formatação do documento ou outro para imprimir em PDF, você sabe exatamente em qual dessas funções ou locais no código você deve aplicar as alterações e, mais importante, onde não.
Assim, sempre que você chegar a uma função que não entendem porque a função faz "muito", e você não tem certeza se e onde aplicar uma alteração, em seguida, considerar a possibilidade de refazer a função em funções separadas, menores. Não espere até ter que mudar alguma coisa. O código é 10 vezes mais lido do que alterado, e funções menores são muito mais fáceis de ler. Pela minha experiência, quando uma função tem uma certa complexidade, você sempre pode dividi-la em responsabilidades diferentes, independentemente de saber quais mudanças virão no futuro. Bob Martin normalmente vai um passo além, veja o link que eu dei nos meus comentários abaixo.
EDIT: ao seu comentário: A principal responsabilidade da função externa no exemplo acima não é imprimir em um dispositivo específico ou formatar o documento - é integrar o fluxo de trabalho de impressão . Portanto, no nível de abstração da função externa, um novo requisito como "documentos não deve mais ser formatado" ou "documento deve ser enviado por correio em vez de impresso" é apenas "o mesmo motivo" - ou seja, "o fluxo de trabalho de impressão mudou". Se falamos sobre coisas assim, é importante manter o nível certo de abstração .