Quando aplicamos Orientação a Objetos em nossos projetos e principalmente quando definimos padrões de desenvolvimento.
Muitas vezes torna-se inviável deixar que desenvolvedores implementem sem seguir as regras de implementação da nossa arquitetura.
Um exemplo disso, é ter uma camada onde tenhamos classes que devam seguir nomeclaturas específicas nos métodos.
Como uma camada DAO sem ORM. Onde definamos que os métodos do crud básico se chamam:
find(); findByKey( Numeric id ); save( DTO dto ); remove( DTO dto );
Dessa forma, para seguirmos um padrão em todas as classes DAO de nossa aplicação, exigimos que esses métodos se chamem assim e sejam assinados assim para qualquer uma implementação.
Mas podemos contratar um programador teimoso e o mesmo resolve implementar assim:
buscar(); buscarId( id ); salvar( id, nome, sobrenome, idade ); editar( id, nome, sobrenome, idade ); remover( id );
Funcionaria se a implementação do método fizer o que tiver que ser feito. Mas e o padrão?
Também para evitar esses problemas, existe uma coisa chamada Interface.
Interface seria uma Classe que contém um conjunto de assinaturas, que servem como base/regra para toda e qualquer classe que implemente essa Interface.
Ou seja, uma classe que implementa uma Interface, é obrigada a conter a implementação de todos os métodos assinados na Interface. Pode conter mais métodos, mas não pode deixar de ter nenhum dos métodos assinados na Interface.
Já na Interface só pode ter a assinatura, e nunca a implementação do método.
Por convenção e em alguns casos por Regra, o nome de uma Interface deve começar pela Letra I em maiúsculo. Ex. IBusiness.cfc
Vejamos um exemplo de uma Interface no ColdFusion e sua implementação em uma classe.
<cfinterface displayname="IBusiness">
<cffunction name="find" returntype="Query" output="no">
</cffunction>
<cffunction name="findByKey" returntype="Query" output="no">
<cfargument name="id" type="numeric" required="true" />
</cffunction>
<cffunction name="save" returntype="void" output="no">
<cfargument name="dto" type="Any" required="true" />
</cffunction>
<cffunction name="remove" returntype="void" output="no">
<cfargument name="id" type="Numeric" required="true" />
</cffunction>
</cfinterface>
<cfcomponent displayname="UserDAO" implements="IBusiness">
<cffunction name="find" returntype="Query" output="no">
<!--- Implementação do método --->
<cfreturn query />
</cffunction>
<cffunction name="findByKey" returntype="Query" output="no">
<cfargument name="id" type="numeric" required="true" />
<!--- Implementação do método --->
<cfreturn query />
</cffunction>
<cffunction name="save" returntype="void" output="no">
<cfargument name="dto" type="Any" required="true" />
<!--- Implementação do método --->
</cffunction>
<cffunction name="remove" returntype="void" output="no">
<cfargument name="id" type="Numeric" required="true" />
<!--- Implementação do método --->
</cffunction>
</cfcomponent>
Bom como vimos, é bem símples implementar usando Interfaces.
Façam testes, deixem de implementar um método assinado na Interface e vejam como se comporta.
E usem, é muito interessante usar esse recurso, garante uma integridade no código das suas aplicações.
A Interface no ColdFusion funciona desde a versão 8 e pode ser visto mais detalhes na documentação clicando AQUI.
Abraços