Pure Function
Usa os objetos como argumentos, mas não os modifica. o valor de retorno é ou um primitivo ou um novo objeto criado dentro do método.
Um método é considerado uma função pura se o resultado depender apenas dos argumentos, e não ter efeitos colaterais, como modificar um argumento ou imprimir algo. O único resultado de chamar uma função pura é o seu valor de retorno.
Na transformação funcional pura, um conjunto de funções, chamadas funções puras, definem a forma de como transformar um conjunto de dados estruturados a partir de sua forma original para outra forma. A palavra “pura” indica que as funções são combináveis, que exige que elas sejam:
Auto-suficiente, de modo que elas podem ser livremente ordenada e rearranjada sem emaranhamento ou interdependências com o resto do programa. Transformações puras não têm conhecimento ou efeito sobre o meio ambiente. Ou seja, as funções utilizadas para a transformação não tem efeitos colaterais.
Sem mudança de estado, de modo que a execução da mesma função ou conjunto específico de funções na mesma entrada sempre resultará na mesma saída. Transformações puras não têm memória do seu uso anterior. Funções puras ajudar a gerenciar a complexidade dos grandes projetos.
Modifiers
Usa objetos como argumentos e modifica alguns elementos ou todos eles. Muitas vezes, retorna uma void. Um método modificador muda a forma como os objetos funcionam.
Fill-in
Um dos argumentos é um objeto vazio que é preenchido pelo método. Tecnicamente, este método também é um tipo de Modifier.
Melhores Praticas
É recomendado que você escreva funções puras sempre que for razoável, e recorra aos Modifiers e Fill-ins apenas se houver uma grande vantagem.
Métodos Modifiers e Fill-in são eficientes porque eles não têm que criar novos objetos. Mas se torna mais difícil de isolar partes de um programa, e em grandes projetos podem causar erros que são difíceis de encontrar.
Em síntese estes conceitos passam a substituir a nomenclatura das funções e procedimentos das linguagens de programação procedural, por serem métodos integrantes de objetos e não mais procedimentos ou funções auto suficientes, porem ainda são estruturalmente iguais.
Exemplo:
Neste exemplo escrevemos três métodos diferentes: Pure function, Modifier e um fill-in, e manipulamos objetos utilizando estes métodos.
Java
Classe #1 – Principal
public class Metodos
{
// Método - Pure Function
static boolean maxRet(Retangulo ret, int altura, int largura)
{
if ((ret.altura <= altura) && (ret.largura <= largura))
{
return true;
}
else
{
return false;
}
}
// Método - Modifiers
static void posicao(Retangulo ret, int x, int y)
{
ret.x = ret.x + x;
ret.y = ret.y + y;
}
// Método - Fill-in
static void modRet(Retangulo r1, Retangulo r2, Retangulo r3)
{
r1.x = r2.x + r3.x;
r1.y = r2.y + r3.y;
r1.altura = r2.altura + r3.altura;
r1.largura = r2.largura + r3.largura;
}
public static void main(String[] args)
{
Retangulo ret1 = new Retangulo(50,50,200,300);
Retangulo ret2 = new Retangulo(15,15,120,150);
Retangulo ret3 = new Retangulo();
ret1.imprimeRet();
System.out.println("Retangulo está dentro do limite maximo:" + maxRet(ret1, 500, 600));
System.out.println();
System.out.println("Modifica posição do retangulo:");
posicao(ret1, 20, 20);
ret1.imprimeRet();
System.out.println();
System.out.println("Modifica tamanho do retangulo:");
modRet(ret3, ret1, ret2);
ret3.imprimeRet();
}
}
Classe #2 – Retangulo
public class Retangulo
{
public int x;
public int y;
public int altura;
public int largura;
public Retangulo ()
{
}
public Retangulo (int x, int y, int altura, int largura)
{
this.x = x;
this.y = y;
this.altura = altura;
this.largura = largura;
}
public void imprimeRet()
{
System.out.println("X =" + x + " Y= " + y + " Altura="+ altura + " Largura=" + largura );
}
}
C++
Classe #1 – Principal
include "stdafx.h"
#include <iostream>
#include <string>
#include "Retangulo.h"
static bool maxRet(Retangulo& ret, int altura, int largura)
{
if ((ret.altura <= altura) && (ret.largura <= largura))
{
return true;
}
else
{
return false;
}
}
// Método - Modifiers
static void posicao(Retangulo& ret, int x, int y)
{
ret.x = ret.x + x; ret.y = ret.y + y;
}
// Método - Fill-in
static void modRet(Retangulo& r1, Retangulo& r2, Retangulo& r3)
{
r1.x = r2.x + r3.x;
r1.y = r2.y + r3.y;
r1.altura = r2.altura + r3.altura;
r1.largura = r2.largura + r3.largura;
}
int _tmain(int argc, _TCHAR* argv[])
{
Retangulo ret1 (50, 50, 200, 300);
Retangulo ret2 (15, 15, 120, 150);
Retangulo ret3 (0,0,0,0);
ret1.imprimeRet();
cout << "Retangulo está dentro do limite maximo:" << maxRet(ret1, 500, 600) << endl;
cout << endl;
cout << "Modifica posição do retangulo:" << endl; posicao(ret1, 20, 20);
ret1.imprimeRet();
cout << endl;
cout << "Modifica tamanho do retangulo:" << endl; modRet(ret3, ret1, ret2);
ret3.imprimeRet();
system("pause");
return 0;
}
Classe #2 – Retangulo
#include "stdafx.h"
#include <iostream>
using namespace std;
class Retangulo
{
public:
int x;
int y;
int altura;
int largura;
Retangulo()
{ }
Retangulo(int x, int y, int altura, int largura)
{
this->x = x;
this->y = y;
this->altura = altura;
this->largura = largura;
}
void imprimeRet()
{
cout << "X =" << x << " Y= " << y << " Altura=" << altura << " Largura=" << largura << endl;
}
};
C#
Classe #1 – Principal
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DesenvolvimentoAberto
{
class Program
{
// Método - Pure Function
static Boolean maxRet(Retangulo ret, int altura, int largura)
{
if ((ret.altura <= altura) && (ret.largura <= largura))
{
return true;
}
else
{
return false;
}
}
// Método - Modifiers
static void posicao(Retangulo ret, int x, int y)
{
ret.x = ret.x + x;
ret.y = ret.y + y;
}
// Método - Fill-in
static void modRet(Retangulo r1, Retangulo r2, Retangulo r3)
{
r1.x = r2.x + r3.x;
r1.y = r2.y + r3.y;
r1.altura = r2.altura + r3.altura;
r1.largura = r2.largura + r3.largura;
}
static void Main(string[] args)
{
Retangulo ret1 = new Retangulo(50,50,200,300);
Retangulo ret2 = new Retangulo(15,15,120,150);
Retangulo ret3 = new Retangulo();
ret1.imprimeRet();
Console.WriteLine("Retangulo está dentro do limite maximo:" + maxRet(ret1, 500, 600));
Console.WriteLine();
Console.WriteLine("Modifica posição do retangulo:");
posicao(ret1, 20, 20);
ret1.imprimeRet();
Console.WriteLine();
Console.WriteLine("Modifica tamanho do retangulo:");
modRet(ret3, ret1, ret2);
ret3.imprimeRet();
Console.ReadKey();
}
}
}
Classe #2 – Retangulo
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DesenvolvimentoAberto
{
class Retangulo
{
public int x;
public int y;
public int altura;
public int largura;
public Retangulo()
{
}
public Retangulo(int x, int y, int altura, int largura)
{
this.x = x;
this.y = y;
this.altura = altura;
this.largura = largura;
}
public void imprimeRet()
{
Console.WriteLine("X =" + x + " Y= " + y + " Altura="+ altura + " Largura=" + largura );
}
}
}

