Campanha anti-if
A campanha anti-if visa eliminar o uso inadequado da instrução IF. Pode parecer bizarro a princípio, mas se pararmos para pensar a respeito vemos que faz sentido. Vejamos um exemplo retirado do site da campanha.
Primeiro, com if:
/* Exemplo em Java */
// Bond class
double calculateValue() {
if(_type == BTP) {
return calculateBTPValue();
} else if(_type == BOT) {
return calculateBOTValue();
} else {
return calculateEUBValue();
}
}
{ Exemplo em Delphi }
// TBond class
function TBond.calculateValue: Extended;
begin
if _type = BTP then
Result := calculateBTPValue
else if _type = BOT then
Result := calculateBOTValue
else
Result := calculateEUBValue;
end;
E agora sem o dito-cujo:
/* Exemplo em Java */
// Bond class
double calculateValue() {
_bondProfile.calculate();
}
// AbstractBondProfile class
abstract double calculate();
// classe BTPBondProfile >> AbstractBondProfile
double calculate() {
...
}
// classe BOTBondProfile >> AbstractBondProfile
double calculate() {
...
}
// classe EUBondProfile >> AbstractBondProfile
double calculate() {
...
}
{ Exemplo em Delphi }
// TBond class
function TBond.calculateValue: Extended;
begin
Result := _bondProfile.calculate;
end;
// TAbstractBondProfile class
type
TAbstractBondProfile = class abstract
public
function calculate: Extended; virtual; abstract;
end;
// classe TBTPBondProfile >> AbstractBondProfile
function TBTPBondProfile.calculate: Extended;
begin
...
end;
// classe TBOTBondProfile >> AbstractBondProfile
function TBOTBondProfile.calculate: Extended;
begin
...
end;
// classe TEUBBondProfile >> AbstractBondProfile
function TEUBBondProfile.calculate: Extended;
begin
...
end;
Através da orientação a objetos, eliminamos a necessidade do IF naquele código. Vantagens? Vamos lá:
- Reusabilidade: A rotina de cálculo de cada “bond profile” (não me pergunte o que é isso, só estou utilizando a terminologia do exemplo retirado do site da campanha) foi implementada separadamente umas das outras, e separadamente da classe Bond. Isso permite que estes cálculos sejam reutilizados de uma forma que não seria possível no primeiro exemplo.
- Legibilidade: O método calculateValue() da classe Bond ficou muito mais simples. Antes haviam vários possíveis caminhos de execução, e agora temos apenas um. Isso torna muito mais fácil ler e entender o código.
- Adaptabilidade: Ficou muito mais simples adaptar o código para a inclusão de novos “bond profiles”. Olhe no método calculateValue() da classe Bond e imagine que aquele _bondProfile é obtido dinamicamente, podemos então adicionar novos tipos de “bond profile” sem modificar a classe Bond, isso torna muito simples adaptar o sistema a novas regras de negócio. Com isso, estamos aderindo ao chamado “Princípio aberto/fechado”, que diz que uma classe deve ser aberta para extensão, mas fechada para modificações. Ou, em outras palavras: Deve ser possível extender uma classe sem a necessidade de modificar o código fonte da mesma.
Vale ressaltar que o objetivo da campanha não é eliminar o uso do IF, pois existem situações onde seu uso é correto. Por exemplo:
/* Extemplo em Java */
public void efetuarVenda(Cliente cliente) {
if (cliente.bloqueado())
throw new ClienteBloqueadoException();
// Prossegue com a venda
.....
}
procedure TVenda.efetuarVenda(Cliente cliente);
begin
if cliente.bloqueado then
raise EClienteBloqueado.Create;
// Prossegue com a venda
....
end;
Para quem se interessar, neste link pode ser obtido o código para inserir o logotipo em seu site.
Editado em 19/06/2010 para adicionar exemplos em Delphi


Olá Magno,
Muito bom os artigos do seu blog!
Mas seria possível, neste post e no anterior, você utilizar exemplos em Delphi?
Olá, Daniel, obrigado pela visita.
Eu editei um dos posts para adicionar exemplos em Delphi, mas o outro infelizmente tem mais código e estou um pouco enrolado no momento… Mas acho que dá para entender a idéia daqueles exemplos, mesmo para quem não programa em Java, pois são códigos simples. Mas se tiver qualquer dúvida, pode perguntar aqui mesmo que eu tento ajudar
A campanha é interessante, mas deveria se chamar AntiBadUseOfIf, já que se trata da eliminação apenas do uso inadequado do IF. O motivação principal é a flexibilidade do código, mas flexibilidade, convenhamos, não é exclusividade da OO.
Na verdade, essa parte de “eliminar apenas o uso inadequado” eu acrescentei por minha própria conta, não achei nada no site falando sobre isso (até achei que houvesse algo, mas procurei agora e não encontrei agora). Mas creio que deve ser apenas um descuido do autor do site em não fazer essa observação, duvido que alguem em sã consciência queira remover completamente o uso do “if”