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 def. Um método modificador muda a forma como os objetos funcionam.
Fill-in
Um dos argumentos é um objeto vazio que é preenchido em 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.
Exemplo:
Neste exemplo escrevemos três métodos diferentes: Pure function, Modifier e um fill-in, e manipulamos objetos utilizando estes métodos.
Python
#!/usr/bin/env python # -*- coding: latin-1 -*- # Desenvolvimento Aberto # objetos.py class Retangulo: x = 0 y = 0 altura = 0 largura = 0 # Workaround para efeito de Overload # Constructor () def __init__ (self, x= None, y= None, altura= None, largura= None): if (x is not None) and (y is not None) and (altura is not None) and (largura is not None): self.x = x self.y = y self.altura = altura self.largura = largura def imprimeRet(self): print "X=", self.x, "Y =", self.y, "Altura=", self.altura, "Largura=", self.largura # Método Pure Function def maxRet(ret = Retangulo(), altura = 0, largura = 0): if ( ret.altura <= altura) and (ret.largura <= largura): return True else: return False # Método Modifier def posicao(ret = Retangulo(), x = 0, y = 0): ret.x = ret.x + x ret.y = ret.y + y # Método Fill-in def modRet(r1 = Retangulo(), r2 = Retangulo(), r3 = Retangulo()): r1.x = r2.x + r3.x r1.y = r2.y + r3.y r1.altura = r2.altura + r3.altura r1.largura = r2.largura + r3.largura ret1 = Retangulo(50,50,200,300) ret2 = Retangulo(15,15,120,150) ret3 = Retangulo() ret1.imprimeRet() resultado = maxRet(ret1, 500, 600) print "Retangulo está dentro do limite maximo:", resultado print "" print "Modifica posição do retangulo:" posicao(ret1, 20, 20) ret1.imprimeRet() print "" print "Modifica tamanho do retangulo:" modRet(ret3, ret1, ret2); ret3.imprimeRet() raw_input()