Princ?pio da ?nica Responsabilidade:
“Nunca deve haver mais de um motivo para uma classe ser alterada”
Cada responsabilidade constitui-se uma dimens?o de mudan?as. Se uma classe tem mais de uma responsabilidade, ent?o haver? mais de uma raz?o para alter?-la. Quanto mais responsabilidades h? numa classe, mais fr?gil (maior risco de para de funcionar) torna-se o projeto.
Viola??o do princ?pio:
Considere a Classe TAD:

import java.util.Vector;
/**
*
* @author Edgard Davidson
*/
public class TAD
private Vector vector;
public TAD()
vector = new Vector();
public void empilhar(Object element)
vector.insertElementAt(element, 0);
public Object desempilhar()
if (!this.eVazia())
Object result = vector.firstElement();
vector.removeElementAt(0);
return result;
else
return null;
}
public void enfileirar(Object element)
vector.add(element);
public Object desenfileirar()
if (!this.eVazia())
Object result = vector.firstElement();
vector.removeElementAt(0);
return result;
else
return null;
}
public int obtemTamanho()
return vector.size();
public boolean eVazia()
return vector.isEmpty();
}
Como pode ser visto, a classe TAD (Tipo Abstrato de Dados) ? uma classe que possui mais de uma responsabilidade. Ela implementa o contrato de um Pilha com os m?todos (empilha e desempilha) e o contrato de uma Fila com os m?todos (enfileira e desenfileira). A classe TAD viola o princ?pio da ?nica responsabilidade. Para se adequar ao princ?pio, ? necess?rio aplicar a refatora??o Extrair Classe. Essa t?cnica de refatora??o ? a mais indicada para o caso da viola??o do SRP. Sempre que houver uma classe fazendo o trabalho que deveria ser feito por duas classes, aplique a referida refatora??o para criar uma nova classe movendo os campos e m?todos pertinentes da classe antiga para a classe nova.
Al?m de aplicar a refatora??o Extrair Classe, na adequa??o ? viola??o do princ?pio, foi renomeado tamb?m a classe TAD, que n?o possuia um nome significativo ao seu contrato. Ap?s aplica??o de Refatora??o temos:
Adequa??o ao princ?pio:
Antes de mostrar a solu??o, a figura abaixo ilustra o contrato de uma Pilha e o contrato de uma Fila. Ambas s?o estruturas de dados com comportamentos diferenciados. A pilha implementa um algoritmo de LIFO (Last In, First Out), o ?ltimo a entrar ? o primeiro a sair. J? a fila implementa um algoritmo de FIFO (First In, First Out), o primeiro a entrar ? o primeiro a sair.

O diagrama de classe original foi refatorado e a classe TAD foi renomeada para Pilha e todos os m?todos referentes ao contrato de uma fila, ap?s aplicado o Extrair Classe e foram movidos para a classe Fila

Implementa??o da classe Pilha
import java.util.Vector;
/**
*
* @author Edgard Davidson
*/
public class Pilha
private Vector vector;
public Pilha()
vector = new Vector();
public void empilhar(Object element)
vector.insertElementAt(element, 0);
public Object desempilhar()
if (!this.eVazia())
Object result = vector.firstElement();
vector.removeElementAt(0);
return result;
else
return null;
}
public int obtemTamanho()
return vector.size();
public boolean eVazia()
return vector.isEmpty();
}
Implementa??o da classe Fila
import java.util.Vector;
/**
*
* @author Edgard Davidson
*/
public class Fila
private Vector vector;
public Fila()
vector = new Vector();
public void enfileirar(Object element)
vector.add(element);
public Object desenfileirar()
if (!this.eVazia())
Object result = vector.firstElement();
vector.removeElementAt(0);
return result;
else
return null;
}
public int obtemTamanho()
return vector.size();
public boolean eVazia()
return vector.isEmpty();
}
Com essa nova implementa??o, a classe Pilha e a classe Fila s?o extremamente coesas, possuem apenas um prop?sito, uma ?nica responsabilidade e apenas um contrato
Outras refer?ncias
- http://engenhariadesoftwareagil.com/?p=236
- http://www.objectmentor.com/resources/articles/srp.pdf
- http://davidhayden.com/blog/dave/archive/2005/05/29/1066.aspx
- http://c2.com/cgi/wiki?SingleResponsibilityPrinciple
- http://msdn.microsoft.com/en-us/magazine/cc546578.aspx
- http://codebetter.com/blogs/david_laribee/archive/2008/09/09/why-solid-gimme-an-s.aspx
- Head First Design patterns. pags 185, 336, 339, 367
- Agile Principles, Patterns, and Practices in C#.
- UML for Java Programmers












