Eu acho que muitas pessoas tentam criar soluções em excesso. Eles adotam a abordagem "Adão e Eva", quando apenas um pouco mais prática simplificaria bastante as coisas.
Classes especializadas não são más, são a consequência natural do design de software de som.
Muitos programadores, na minha opinião, não conseguem entender isso e não há nenhum livro que conheça que torne isso claro.
Outra coisa que certamente ajuda é o TDD, que permite entender "como" você usará a classe na prática e, em muitos casos, pode salvar o dia, porque mostra eventuais problemas / limitações no início do dia.
Por último, outra coisa MUITO importante que eu procuraria se fosse você são os padrões de design. Padrões de design são como as pessoas mais inteligentes que você ou eu resolvem problemas de programação. A idéia por trás dos padrões, adivinhe ?, é que eles não devem ser usados como livros de receitas, receitas que você acaba de lançar, mas com atenção e compreensão do domínio do aplicativo em primeiro lugar.
Um uso sábio do padrão reduzirá bastante a quantidade de detalhes que você precisa gerenciar.
Uma boa biblioteca de padrões de design projetada para atender às suas próprias necessidades será inestimável. Vamos ver um exemplo muito simples apenas para colocar as coisas em contexto:
imagine que você tem um formulário no qual, quando um botão é pressionado, outros formulários precisam se atualizar. Este é um padrão típico de "observador". Você tem um assunto e vários observadores, que se registram no assunto. Por que você precisa implementar uma interface? Você pode simplesmente adicionar os métodos, ou melhor ainda, usar uma interface para os observadores e uma lista genérica para o assunto. Agora você tem o melhor dos dois mundos: independência para os observadores e nada de coisas estranhas sobre o assunto.
Espero que faça sentido para você!
Andrea