Facade Pattern em ColdFusion

On 13 de outubro de 2014, in CFML, Design Pattern, by andersonstraube

Em padrões de projeto de software, um façade (fachada em francês) é um objeto que disponibiliza uma interface simplificada para uma das funcionalidades de uma API, por exemplo. Um façade pode:
Tornar uma biblioteca de software mais fácil de entender e usar;
Tornar o código que utiliza esta biblioteca mais fácil de entender;
Reduzir as dependências em relação às características internas de uma biblioteca, trazendo flexibilidade no desenvolvimento do sistema;
Envolver uma interface mal desenhada, com uma interface melhor definida.
Fonte: http://pt.wikipedia.org/wiki/Fa%C3%A7ade

Em resumo, um Facade é um objeto que proporciona uma visão simplificada de um sistema subjacente mais complexo, o que torna mais fácil de usar e entender.
Vamos exemplificar o uso deste padrão com um sistema bem simples de construção de carros.
Um carro é formado por um conjunto de objetos e cada um deles pode ser complexo, por exemplo: Direção Hidráulica exige uma série de fatores/passos para construir, envolve caixa de direção, coluna de direção, mangueira, bomba hidráulica, polia, correia, etc… Assim como a construção do próprio carro exige uma série de objetos e passos para construí-los, imagine criar um sistema desses com um método de construção de carros onde a lógica está toda envolvida nesse método, ou seja, por si só a construção de um carro já é complexa, some isso com cada objeto subjacente que necessita ser criado para formar o todo.


O Facade é adotado nesse tipo de problema, onde temos um sistema complexo e desejamos simplificá-lo fornecendo uma interface para as funcionalidades e/ou criação desses objetos complexos, tornando assim um sistema mais fácil de entender.
Vamos ao código:

Chassi.cfc

Essa classe é responsável pela criação do chassi. Como o foco deste post é mostrar o Facade, desconsiderei as classes subjacentes criando apenas um método “adicionar” nelas.


<cfcomponent displayname="Chassi" output="false">
	<cffunction name="init" access="public" returntype="Chassi">
		<cfreturn this />
	</cffunction>
	<cffunction name="adicionar" access="public" returntype="void">
		<!--- whatever --->
	</cffunction>
</cfcomponent>

Cor.cfc


<cfcomponent displayname="Cor" output="false">
	<cffunction name="init" access="public" returntype="Cor">
		<cfreturn this />
	</cffunction>
	<cffunction name="pintar" access="public" returntype="void">
		<!--- whatever --->
	</cffunction>
</cfcomponent>

Motor.cfc


<cfcomponent displayname="Motor" output="false">
	<cffunction name="init" access="public" returntype="Motor">
		<cfreturn this />
	</cffunction>
	<cffunction name="adicionar" access="public" returntype="void">
		<!--- whatever --->
	</cffunction>
</cfcomponent>

Roda.cfc


<cfcomponent displayname="Roda" output="false">
	<cffunction name="init" access="public" returntype="Roda">
		<cfreturn this />
	</cffunction>
	<cffunction name="adicionar" access="public" returntype="void">
		<!--- whatever --->
	</cffunction>
</cfcomponent>

CarroFacade.cfc

Este componente é o nosso Facade que faz a ligação das classes subjacentes, ele torna a criação do carro mais fácil de ser entendida e reduz a complexidade do relacionamento entre as classes fornecendo um método único de acesso ao subsistema.


<cfcomponent displayname="CarroFacade" output="false">
	<cfscript>
		variables._chassi = "";
		variables._roda   = "";
		variables._motor  = "";
		variables._cor 	  = "";
	</cfscript>
	<cffunction name="init" access="public" returntype="CarroFacade">
		<cfargument name="chassi" type="Chassi" required="true">
		<cfargument name="roda"   type="Roda"   required="true">
		<cfargument name="motor"  type="Motor"  required="true">
		<cfargument name="cor"    type="Cor"    required="true">
		<cfset variables._chassi = arguments.chassi />
		<cfset variables._roda   = arguments.roda />
		<cfset variables._motor  = arguments.motor />
		<cfset variables._cor    = arguments.cor />
		<cfreturn this />
	</cffunction>
	<cffunction name="criarCarro" access="public" returntype="void">
		<cfset variables._chassi.adicionar() />
		<cfset variables._roda.adicionar() />
		<cfset variables._motor.adicionar() />
		<cfset variables._cor.pintar() />
		<!--- Poderia ter aqui o faturamento, transporte, etc... --->
		<cfoutput>Carro criado</cfoutput>
	</cffunction>
</cfcomponent>

test.cfm


<cfscript>
	chassi = CreateObject("component","Chassi").init();
	roda = CreateObject("component","Roda").init();
	motor = CreateObject("component","Motor").init();
	cor = CreateObject("component","Cor").init();
	carroFacade = CreateObject("component","CarroFacade").init( chassi: chassi, roda: roda, motor: motor, cor: cor );
	carroFacade.criarCarro();
</cfscript>

Vale lembrar que poderíamos ter outros Facades, um para cada subclasse quando for o caso, por exemplo, se criar um motor for algo complexo onde envolve várias outras subclasses, poderíamos então criar um FacadeMotor e abstrair a criação do mesmo, dessa forma vamos simplificando o sistema.
Veja abaixo o diagrama UML apresentando uma possível estrutura do Facade:

estrutura facade

* Fonte da imagem: http://www.pg.cefetpr.br/coinf/simone/patterns/facade.php

Até a próxima, abraço.

Tagged with:  

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *