Embora a facilidade de entendimento e, até certo ponto, os componentes substituíveis sejam certamente boas razões, uma razão igualmente importante (e provavelmente a razão pela qual as camadas foram inventadas em primeiro lugar) é do ponto de vista da manutenção do software. A linha inferior é que dependências causam o potencial de quebrar coisas.
Por exemplo, suponha que A dependa de B. Como nada depende de A, os desenvolvedores são livres para alterar A no conteúdo de seus corações, sem ter que se preocupar com a possibilidade de quebrar algo diferente de A. No entanto, se o desenvolvedor quiser alterar B, qualquer alteração em B, o que é feito pode potencialmente quebrar A. Esse era um problema frequente nos primeiros dias do computador (pense no desenvolvimento estruturado), em que os desenvolvedores corrigiam um bug em uma parte do programa e geravam erros em partes aparentemente não relacionadas do programa em outros lugares. Tudo por causa de dependências.
Para continuar com o exemplo, agora suponha que A dependa de B AND B dependa de A. IOW, uma dependência circular. Agora, sempre que uma alteração é feita em qualquer lugar, isso pode potencialmente quebrar o outro módulo. Uma mudança em B ainda pode quebrar A, mas agora uma mudança em A também pode quebrar B.
Portanto, na sua pergunta original, se você estiver em uma equipe pequena para um projeto pequeno, tudo isso é um exagero, porque você pode alterar livremente os módulos à sua vontade. No entanto, se você estiver em um projeto considerável, se todos os módulos dependerem dos outros, sempre que for necessária uma alteração, isso poderá potencialmente danificar os outros módulos. Em um projeto grande, é difícil determinar todos os impactos, portanto é provável que você perca alguns impactos.
Isso piora em um projeto grande, onde existem muitos desenvolvedores (por exemplo, alguns que trabalham apenas na camada A, alguma camada B e outra camada C). Como é provável que cada mudança precise ser revisada / discutida com os membros das outras camadas, para garantir que suas alterações não quebrem ou forcem o retrabalho no que estão trabalhando. Se suas alterações forçam outras pessoas, você deve convencê-las de que elas devem fazer a alteração, porque não vão querer trabalhar mais só porque você tem essa nova e excelente maneira de fazer as coisas em seu módulo. IOW, um pesadelo burocrático.
Mas se você limitar as dependências para A depende de B, B dependerá de C, somente as pessoas da camada C precisarão coordenar suas alterações nas duas equipes. A camada B só precisa coordenar as alterações com a equipe da camada A e a equipe da camada A é livre para fazer o que quiser, porque o código não afeta a camada B ou C. Portanto, idealmente, você projetará suas camadas para que a camada C mude muito pouco, a camada B muda um pouco e a camada A faz a maior parte das alterações.