Objetos – Métodos – Pure Function, Modifiers, Fill-in – Java, C++ e C#

Publicado: 2 de março de 2014 em C#, C/C++, Java

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 );
             }
     }
 }
Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s