Uma das formas de se projetar objetos de software é pensar em suas responsabilidades. Essas responsabilidades podem se tratar de um pequeno objeto a uma divisão macro do sistema.
Essas responsabilidades devem descrever o que um objeto deve fazer e o que o deve saber.
História do dia-a-dia
Suponhamos que você tenha que entregar um relatório para seu chefe sobre uma fórmula química de um produto de limpeza. Mas você não conhece nada de química.
Fácil, não é?
Você delega esta atividade a um químico, para que ele escreva o relatório da fórmula química para você.
Pronto, sem mistério ou complicação.
Atribuindo responsabilidade
O desenvolvimento de software deve ser tão fácil quando a história acima.
As responsabilidades devem ser atribuídas aos objetos que tem a informação necessária para satisfazer as responsabilidade.
Vejamos o modelo seguinte, qual é o melhor objeto para informar a quantidade de tomadas de um quarto?

Sabemos que o Quarto tem conhecimento das suas paredes, e que cada Parede tem o conhecimento da quantidade de suas suas tomadas.
Desta forma a melhor solução para aplicamos a responsabilidade de obter a quantidade de tomadas é através do objeto Quarto, que delega a cada Parede que informe sua quantidade de tomada. Assim a quantidade total de tomadas é a soma das tomadas presente em cada parede.

O método TotalTomadas() do objeto Quarto:
1 2 3 4 5 6 7 8 9 | public int TotalTomadas() { int ret = 0; foreach(Parede parede in paredes) { ret += parede.GetQtdTomadas(); } return ret; } |
Para melhorar ainda mais esse trabalho, podemos criar um objeto chamado Paredes que estenda o Array (Collection) de paredes presente no objeto quarto, e criarmos um método GetTomadas() que faça o trabalho da soma das tomadas.
Assim, a nossa lista de Paredes presente no objeto Quarto ficaria com a responsabilidade de obter o total de tomadas de cada item interno e somá-los.
Desta forma o método TotalTomadas() fica assim:
1 2 3 4 | public int TotalTomadas() { return paredes.GetTomadas(); } |
O método GetTomadas() do objeto Paredes:
1 2 3 4 5 6 7 8 9 | public int GetTomadas() { int ret = 0; foreach(Parede parede in this) { ret += parede.GetQtdTomadas(); } return ret; } |
Isso nos permite reaproveitar código, pois se no projeto existisse objetos como Galpão, Prédio, etc. Poderíamos utilizar o mesmo objeto Paredes para ambos (dependendo do contexto), pois certamente, Galpão e Prédio têm paredes. Assim estaríamos evitando a duplicação de código e facilitando sua manutenção.

Vale a pena fazer um próximo post mostrando generalização/especialização usando o exemplo citado de prédio, galpão, etc..
Quero ver onde vai ser conectada a classe “Parede”
Olá Edu.
Estava de férias, mas ainda hoje escrevo sobre generalização/especialização, talvez mude alguma coisa, pois acho que não fui muito feliz no exemplo escolhido deste post.
Abç