Qual a diferença entre um Facade e um Business Object?

Olá pessoal,

Então, gostaria de saber qual a diferença entre esses 2 padrões, pois ambos parecem iguais.
No meu entendimento o business object poderia carregar alguma lógica dentro de si, enquanto o façade seria exclusivamente um repassador, seria essa a diferença?

Abraços.

[quote=tiagomac]Olá pessoal,

Então, gostaria de saber qual a diferença entre esses 2 padrões, pois ambos parecem iguais.
No meu entendimento o business object poderia carregar alguma lógica dentro de si, enquanto o façade seria exclusivamente um repassador, seria essa a diferença?
[/quote]

Business Object não é um padrão, já começa por ser um diferença. Business Object é uma categoria. Todos os objetos que pertencem ao andar (layer) de business são business objects (Wikipedia. Não se deixe enganar pelo “padrão” Business Object do Core J2EE.

Por tradição o nome Business Object se refere a essa coisa que o Core J2EE erradamente classificou como pattern. É um objeto que atua no sistema traduzindo regras do negocio. O real pattern para isso é Service.

Um serviço é um objeto sem estado que faz algo por alguem e pode conter regras de negocio se for do andar de negocios. Um service não necessariamente é de negocio (pode ser de estrutura, de integração, etc…)

Um objeto Façade é um objeto que executa uma ação e esconde do invocador quem realiza essa ação. A diferença é que um Façade tem que usar mais do que um outro objeto para realizar a ação. Um melhor nome seria Orquestrator, porque o real papel de um Façade é criar uma funcionalidade pela combinação de coisas que já existem.

Imagine-se que temos o serviço A que envia email para endereços de email e um repositorio de clientes onde é possivel pesquisar por coordenada geográfica. Um serviço C poderia , dado uma coordenada, recuprar todos os clientes perto dela e enviar um email para cada um. O serviço C teria como entradas a coordenada , o raio de acção (que define “perto”) e uma mensagem a ser colocada no email. O serviço C seria um Façade porque a implementação dele é apenas a orquestração de coisas que já existem.

Um objeto que delega para um único outro objeto é um Adapter, um Proxy ou um Decorator, dependendo da situação, das classes, etc… mas não é um Façade.

Eu fiquei bem confuso agora.

Veja essa imagem como exemplo:

Nessa imagem, o facade tem alguns Business Objects e faz o repasse das atividades para eles… mas o que fiquei em dúvida seria se o Facade poderia levar qualquer tipo de código que não fosse uma unica linha de chamada do método específico do BO tipo eu posso fazer uma validação dos dados que estão sendo passados como atributos por exemplo no próprio façade ou só poderia fazer isso no Business Object? desculpa, fiquei confuso.

Abraços.

O façade pode ter quantas linhas quiser. loops, ifs, ler arquivo o que for necessário.
padrões não se definem pelo codigo e sim pela responsabilidade. Qual é a responsabilidade de um Façade ? Orquestrar.

Se o façade faz algo que apenas ele sabe fazer ( como validar) então ele tem mais responsabilidade que orquestrar, logo, isso não é um façade. O façade pode fazer algo mais que orquestrar ? Não.

Como eu valido os dados ?
Eu utilizo um Business Object ( aka um objeto de negocio) para validar. Ou seja, o façade usa um outro objeto que sabe fazer validações ( normalmente um objeto QualquerCoisaValidator)

Não ha logica proprio no façade. É por isso que se chama façade (Fachada. Parece que ele faz, mas é só fachada)
O que quero diz com isto é que esta padrão está ligado e a fazer acreditar , nas aparencias. O objeto, não faz, realmente nada.
Realmente nada além de orquestrar. Claro.

Façade é quase que um adjetivo. Você pode ter um qualquer tipo de objeto, service, builder, factory, etc… se esse objeto apenas chama objetos do mesmo tipo (e mais do que 1) ele é um façade, service façade, builder façade, factory façade, etc…

Repare no pobre do web componente. Ele acha que está chamando um objeto super esperto que sabe fazer um monte de coisas. Mas na realidade esse cara é só fachada, ele chama um monte de outros caras para fazer o serviço real. Sacou ? :slight_smile:


[/quote]

Acho que saquei, pelo menos clareou bastante…

Pelo que entendi então eu uso um Facade com os business object dentro dele, sendo que as regras de negócio, validações, etc eu posso incluir nesses business objects e o facade será apenas o “atalho” que vai unir todos esses business object, certo?

Mas eu ainda fiqueis só com uma dúvida, ex. lá no trabalho os colegas usam o facade apenas como atalho mesmo, não vai nem um If dentro dele… os métodos no facade simplesmente chamam outros métodos que estão espalhados entre outras classes, as vezes BOs, as vezes não…

Quando você disse que um facade pode levar um If por exemplo, eu fiquei com uma dúvida, por Ex. se eu tenho um facade que leva 2 business objects chamados “OficinaNormalBo” e “OficinaLuxoBo” e no facade eu tenho um método chamado “consertar” que vai chamar o método consertar de um desses BOs, para saber qual método eu vou encaminhar o conserto, digamos que no facade o método fique assim:

public boolean consertar(Carro carro){
 if (carro.getMarca() == Marca.FERRARI){
  return oficinaLuxoBo.consertar(carro);
 }else{
  return oficinaNormalBo.consertar(carro);
 }
} 

esse tipo de método violaria o padrão do facade? será que eu não deveria de alguma forma fazer essa lógica dentro do BO, pois, se não utilizar o Facade nesse caso pode ocorrer um equivoco e uma Ferrari terminar indo parar em uma oficina normal :O???

Obrigado pela ajuda.
Aguardo um retorno.
Abração!!

É por isso que vc tem que enxergar o que significa Business Object. Todo e qualquer objeto que tenha logica de negocios é um business object. Contudo, é verdade, que o façade pode invocar coisas que não são BO. Não ha uma obrigação ou limitação. O façade invoca o que precisar.

Não. Este é exatamente o uso dele (um dos usos).

Sim. É possivel refactorar para ter um mecanismo melhor mas imagine que esses BO foram feitos por outro grupo e vc não tem acesso a mudar o seu codigo. O façade é uma forma elegante de resolver a situação, sobretudo se ele herdar de officina tb.

[quote=sergiotaborda]…Ele acha que está chamando um objeto super esperto que sabe fazer um monte de coisas. Mas na realidade esse cara é só fachada, ele chama um monte de outros caras para fazer o serviço real.[/quote]Acho que já trabalhei com gente assim… :roll:

Eu achava que eram enganadores, mas na verdade são simplesmente pessoas que implementam em suas vidas o pattern Façade.

[quote=gomesrod][quote=sergiotaborda]…Ele acha que está chamando um objeto super esperto que sabe fazer um monte de coisas. Mas na realidade esse cara é só fachada, ele chama um monte de outros caras para fazer o serviço real.[/quote]Acho que já trabalhei com gente assim… :roll:

Eu achava que eram enganadores, mas na verdade são simplesmente pessoas que implementam em suas vidas o pattern Façade.[/quote]

*rssss, isso é mais comum do que vc pensa, pior pra eles que não aprendem…

@sergiotaborda

Valeu mesmo, deu uma clareada boa e deu para entender o propósito de cada um no projeto. obrigado mesmo cara! Abração!!!