public class GeradorExtrato {
public void emitirExtrato(String tipo) {
if (tipo.equals("SimplificadoMensal")) {
// TODO...
} else if (tipo.equals("SimplificadoQuinzenal")) {
// TODO...
} else if (tipo.equals("SimplificadoSemanal")) {
// TODO...
} else if (tipo.equals("Completo")) {
// TODO...
}
}
}
public enum TipoExtrato {
public abstract void processarExtrato();
SimplificadoMensal {
public void processarExtrato() {
// TODO ...
}
},
SimplificadoQuinzenal {
public void processarExtrato() {
// TODO ...
}
},
SimplificadoSemanal {
public void processarExtrato() {
// TODO ...
}
},
Completo {
public void processarExtrato() {
// TODO ...
}
};
}
public class GeradorExtrato {
public void emitirExtrato(String tipo) {
TipoExtrato.valueOf(tipo).processarExtrato();
}
}
Uma classe deve ter apenas uma responsabilidade.
public class Automobile {
public void start() {}
public void stop() {}
public void changeTires([]Tire tires) {}
public void drive()
public void wash()
public int getOil()
}
Em uma folha de papel , escreva várias vezes:
"O(A) __________ __________ sozinho(a)."
"O(A) __________ __________ sozinho(a)."
"O(A) __________ __________ sozinho(a)."
"O(A) __________ __________ sozinho(a)."
"O(A) __________ __________ sozinho(a)."
"O(A) __________ __________ sozinho(a)."
Primeiro espaço, nome da classe. Segundo espaço, método.
"O automobile start sozinho."
"O automobile stop sozinho."
"O automobile changeTires sozinho."
"O automobile drive sozinho."
"O automobile wash sozinho."
"O automobile getOil sozinho."
Primeiro espaço, nome da classe. Segundo espaço, método.
"O automobile start sozinho."
"O automobile stop sozinho."
"O automobile changeTires sozinho."
"O automobile drive sozinho."
"O automobile wash sozinho."
"O automobile getOil sozinho."
Primeiro espaço, nome da classe. Segundo espaço, método.
"O automobile start sozinho."
"O automobile stop sozinho."
"O automobile changeTires sozinho."
"O automobile drive sozinho."
"O automobile wash sozinho."
"O automobile getOil sozinho."
Primeiro espaço, nome da classe. Segundo espaço, método.
"O automobile start sozinho."
"O automobile stop sozinho."
"O automobile changeTires sozinho."
"O automobile drive sozinho."
"O automobile wash sozinho."
"O automobile getOil sozinho."
Primeiro espaço, nome da classe. Segundo espaço, método.
"O automobile start sozinho."
"O automobile stop sozinho."
"O automobile changeTires sozinho."
"O automobile drive sozinho."
"O automobile wash sozinho."
"O automobile getOil sozinho."
Primeiro espaço, nome da classe. Segundo espaço, método.
"O automobile start sozinho."
"O automobile stop sozinho."
"O automobile changeTires sozinho."
"O automobile drive sozinho."
"O automobile wash sozinho."
"O automobile getOil sozinho."
Primeiro espaço, nome da classe. Segundo espaço, método.
"O automobile start sozinho."
"O automobile stop sozinho."
"O automobile changeTires sozinho."
"O automobile drive sozinho."
"O automobile wash sozinho."
"O automobile getOil sozinho."
public class Automobile {
public void start() {}
public void stop() {}
public int getOil()
}
public class Mechanic {
public void changeTires([]Tire tires) {}
}
public class Driver {
public void drive()
}
public classe CarWash {
public void wash()
}
Deve ser aberto para extensões e fechado para modificações.
Objetos em um programa devem ser substituíveis com instâncias de seus subtipos, sem alterar a correção desse programa.
Hashtable matricula = new Properties();
matricula.put("Marcio", "3542");
matricula.put("Marcelo", "4433");
matricula.put("Joaquim", 3224);
((Properties) matricula).list(System.out);
Hashtable matricula = new Properties();
matricula.put("Marcio", "3542");
matricula.put("Marcelo", "4433");
matricula.put("Joaquim", 3224);
((Properties) matricula).list(System.out);
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer
cannot be cast to java.lang.String at java.util.Properties.list(Unknown Source) at
...
Muitas interfaces específicas são melhores do que uma interface de uso geral".
type Worker interface {
work()
eat()
}
type Developer struct {}
func (*Developer) work() {}
func (*Developer) eat() {}
type Manager struct {}
func (*Manager) work() {}
func (*Manager) eat() {}
type Jaspion struct {} // Neoway Slack Bot...
func (*Jaspion) work() {}
func (*Jaspion) eat() {} // Ouch! :(
Dependa de abstrações. Não dependa de classes concretas.
type Developer struct {}
func (*Developer) work() {}
type Manager struct {
Developer *Developer
}
func (m *Manager) work() {
m.Developer.work()
}
Dependa de abstrações. Não dependa de classes concretas.
type Developer struct {}
func (*Developer) work() {}
type Manager struct {
Developer *Developer
}
func (m *Manager) work() {
m.Developer.work()
}
type Jaspion struct {}
func (*Jaspion) work() {}
Dependa de abstrações. Não dependa de classes concretas.
type Worker interface {
work()
}
type Manager struct {
Someone Worker
}
func (m *Manager) work() {
m.Someone.work()
}
type Developer struct {}
func (*Developer) work() {}
type Jaspion struct {}
func (*Jaspion) work() {}