Outro mecanismo bastante útil na programação funcional é o que chamamos de partial application. Trata-se do processo de construção de uma função que especializa outra função pré-existente por meio do fornecimento de parte de seus argumentos.

Vamos a um exemplo prático. Desta vez trata-se de um código escrito em CoffeeScript para uma single-page app:

define [
    'view/Aviso'
], (Aviso) ->

  sucesso: ->
    _.partial(@_aviso, 'alert-success').apply @, arguments

  erro: ->
    _.partial(@_aviso, 'alert-error').apply @, arguments

  _region: new Backbone.Marionette.Region(el: '#avisos')

  _aviso: (tipo, msg) ->
    @_region.show(
      new Aviso
        mensagem: msg
        className: tipo
    )

As funções sucesso e erro constroem e invocam novas funções resultantes da aplicação parcial da função _aviso. Estas funções demonstram o poder da aplicação parcial: funções abstratas são especializadas por meio da aplicação parcial.

JavaScript é uma linguagem bastante flexível e é claro que o CoffeeScript não fica para trás. O runtime do JS permite que qualquer função seja aplicada parcialmente, o que pode ser feito de diferentes maneiras.

A título de curiosidade vejamos a implementação da função partial do Underscore:

  // Partially apply a function by creating a version that has had some of its
  // arguments pre-filled, without changing its dynamic `this` context.
  _.partial = function(func) {
    var args = slice.call(arguments, 1);
    return function() {
      return func.apply(this, args.concat(slice.call(arguments)));
    };
  };

Chamamos de closure a função retornada por esta função, pelo fato de seu escopo incluir variáveis não-locais (no caso, a variável de nome args declarada na linha 4).

Para concluir, gosto de ter a aplicação parcial como uma ferramenta para fazer especializações triviais, como no exemplo que foi dado. É o tipo de problema que não precisa ser resolvido com polimorfismo, ou pior, com um design pattern qualquer.

Rafa Noronha

Rafa Noronha gosta de construir aplicações web inovadoras em qualquer plataforma. Possui experiência em diversas tecnologias mas a única com quem rolou algo mais sério foi a Web. Nos últimos anos precisou se especializar em JavaScript, single-page apps e Backbone.js. Na Lambda3 Rafa Noronha jura que Java é legal e está sempre vencendo seus colegas nos confrontos de Mortal Kombat e FIFA14.