Quase todo mundo sabe o que é, mas poucos o definem. Sigo a definição original do Uncle Bob, já que este é um dos seus princípios SOLID. Segundo Mr. Robert C. Martin, o princípio da responsabilidade única define que "nunca deve haver mais de um motivo para uma classe mudar", ou ainda, "uma classe só deve mudar por um único motivo". Mais conhecido como Single Responsibility Principle (SRP).

Pronto, pare de se preocupar se o método/propriedade/evento que você está introduzindo faz parte do objeto ou não. Faça-se esta pergunta: esta classe vai ter que mudar por mais um motivo com esta introdução que estou fazendo? Se sim, o método/propriedade/evento está na classe errada.

O mesmo vale para métodos. Eles devem ter apenas um motivo para mudar.

Assim, se você fez uma classe "produto", e ela abstrai um produto da empresa, então ela só deve mudar se uma das características abstraídas do produto da empresa mudarem. Se, por acaso, a classe de produto mandar e-mail quando um preço subir, essa é uma razão a mais para ela mudar: o método de envio de e-mails pode mudar. Ou se a classe de produtos passar a controlar o estoque: esse é outro motivo para mudar, talvez a maneira de manter o estoque mude.

Qual o resultado disso? Muitos métodos pequenos, com muitas classes pequenas. Muita modularidade. Excelente!

- Mas em OO não devemos colocar dados e comportamento juntos?

Claro! Mas o que isso tem a ver com a história? Eles continuam juntos, mas modularizados. Agora, só porque você criou uma classe de produto, a tal classe tem que ir no banco, se configurar, obter dados, dar desconto, assobiar e chupar cana?

- Mas eu vou ficar com muitas funções pequenas na minha classe. Não vou conseguir entender.

Você já fica com poucas funções gigantes, que são ainda mais difíceis de entender. Depois do quinto nível de identação, ninguém mais sabe se aquele "}" está fechando um "if", um "while", um "for", ou o que for. Ainda por cima, funções gigantes tem um problema sério de efeitos colaterais, mas isso é outro problema. Com muitas funções, cada uma vai fazer só uma coisa, e vai fazer ela direito. É o paraíso do teste unitário!

- Mas eu vou ficar com muitas classes no sistema. Não vou conseguir entender.

Vai conseguir entender sim. Você dá nomes corretos para cada uma. Em vez de criar um "cliente", e lá dentro colocar um código para "AvaliarSePodePromoverParaPremium", você cria a classe cliente, e uma classe de serviço "AvaliadorDeClientePremium", com o tal método "AvaliarSePodePromoverParaPremium". Pronto, duas classes colaborando. Tudo mais modular, o cliente ficou mais fácil de entender, e a tal função "AvaliarSePodePromoverParaPremium" ficou mais fácil de testar (se você estiver trabalhando com abstrações).

Lembre-se desse princípio. É um dos mais importantes que você vai encontrar.


Postado na(s) categoria(s) Arquitetura pelo giovanni bassi em 18 de fevereiro de 2009 às 11:05 | Tags: , , ,

Comentários


fevereiro 18. 2009 14:00
Fabio
Muito bom o site do Uncle BOB. Em pequenos artigos, conceitos são muito bem clarificados. É engraçado como centenas de sistemas são projetados fugindo totalmente destes princípios. Acho que é nosso papel evangelizar os que estão vindo e mostrar a importância de um design robusto. Parabéns pelo artigo e boa sorte com aulas, pois ensinar OO não é uma tarefa trivial.

http://www.mgrtconsultoria.com/http://www.mgrtconsultoria.com/


fevereiro 18. 2009 23:55
Felipe Fujiy
Vi que você leu alguns livros sobre Design Patterns. Achei um em C#, o C# 3.0 Design Patterns da editora O´reilly. Conhece alguem que ja leu e se é do mesmo nivel que o Head First?

Vlw

http://blog.fujiy.net/http://blog.fujiy.net/


fevereiro 18. 2009 23:57
Felipe Fujiy
Vi que você leu alguns livros sobre Design Patterns. Achei um em C#, o C# 3.0 Design Patterns da editora O´reilly. Conhece alguem que ja leu e se é do mesmo nivel que o Head First?

Vlw

http://blog.fujiy.net/http://blog.fujiy.net/


fevereiro 19. 2009 11:33
Giovanni Bassi
Felipe, não conheço...

http://unplugged.giggio.net/http://unplugged.giggio.net/


janeiro 12. 2010 17:30
Marlon
cara muito bom este artigo, assinei seu rss pra ler mais artigos como este, valeu!!

http://www.dharmasys.com.br/http://www.dharmasys.com.br/


julho 6. 2010 23:48
Diogo Menezes
Muito legal.

Mas não consigo imaginar como implantar isso nos projetos lá da empresa.

Devido ao fato de não usarmos DDD, temos 3 camadas ( business, Dao, Entity) e cada entity representa uma tabela do banco de dados... Gerando modelos anemicos e complicados de usar SRP.

Alguma recomendação ?

Abss

http://dmenezes.com.br/http://dmenezes.com.br/


julho 19. 2010 19:24
Giovanni Bassi
Tenho sim, Diogo: paciência, muita paciência...

http://unplugged.giggio.net/http://unplugged.giggio.net/

Comentar


(Vai mostrar seu Gravatar)

  Country flag

biuquote
  • Comentário
  • Pré-visualização
Loading



Quem é Giovanni Bassi

Giovanni Bassi Sou uma pessoa apaixonada por tecnologia e especificamente por .Net. Sou consultor independente especialista em .Net, focado em arquitetura e melhores práticas. Tenho dezenas de artigos publicados na .Net Magazine, revista da qual sou editor técnico. Ministro palestras e cursos de vez em quando, e quando dá tempo eu respiro um pouco. Mais detalhes nesta página.

Busca

Selos

Eu vou ao TechEd Brasil 2010, e você?

MVP

MCPD

MCSD

.Net Magazine

Abaixo ao if!

Calendário

«  julho 2010  »
seteququsedo
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678
Ver detalhamento de posts no calendário

Blogs interessantes

    OPMLDownload OPML file

    Postagens recentes

    Comentários recentes

    Disclaimer / Aviso
    As opiniões colocadas neste blog são minhas e pessoais e não expressam necessariamente as opiniões de meus empregadores, pareceiros e amigos. Da mesma forma, os comentários feitos por leitores do blog não expressam a minha opinião.

    © Copyright 2010 .Net Unplugged
    Log in