O desenvolvimento de código para uma interface é, tanto quanto eu sei recomendado, pois permite que você faça alterações sem precisar reescrever e / ou refatorar seu código.
Dito isto, acredito que ter um acoplamento fraco pode até certo ponto ferir a manutenção. O principal problema que vejo é que as pessoas podem perder o controle sobre o que estão fazendo nos métodos anteriores, o que pode causar dores de cabeça ao depurar problemas. Um exemplo excessivamente simplificado seria:
public class Login
{
public void verifyLogin(...)
{
if(VerifyUtlis.isUserValid(...))
{
//redirect to home
}
//redirect to somewhere else
}
}
public class FTPHandler
{
public void verifyLogin(...)
{
if(VerifyUtlis.isUserValid(...))
{
//redirect to home
}
//redirect to somewhere else
}
}
public class VerifyUtils
{
public boolean isUserValid(...)
{
...
}
}
Ao depurar código em VerufyUtils
um desenvolvedor (talvez alguém que acabou de entrar) pode achar difícil manter o controle de onde ele / ela obteve (admitidamente, o acima é simplificado, mas espero que você entenda como as coisas obter quando você tem 100 classes chamando uns aos outros).
Se o desenvolvedor pode ter dificuldade em rastrear qual método é usado onde, qualquer alteração que ele fizer pode potencialmente tornar o aplicativo instável. Então, se você está indo para uma abordagem de casal, certifique-se que o código que você tem e todas as alterações feitas são documentadas. Não há necessidade de ter milhares de palavras, mas geralmente explicar por que as coisas são como são (em vez de escrever comentários para explicar o que o código está fazendo) ajuda a manter sistemas fracamente acoplados no escopo.