O que você não sabia sobre Funções: o coração da Programação Funcional

Manoel Campos Dev
25 Feb 202417:22

Summary

TLDRProfessor Manuel Campos introduces functional programming concepts in this educational video, focusing on pure functions, side effects, and immutability. He explains the importance of pure functions in maintaining a program's state without causing side effects, emphasizing immutability as a key starting point. Campos also discusses the principles of SOLID, particularly the Single Responsibility Principle (SRP), and introduces the idea of referential transparency, which ensures predictability in code. The video further explores higher-order functions, their role in abstraction and reducing coupling, and concludes by highlighting the benefits of functional programming in producing higher quality software with fewer bugs and easier maintenance.

Takeaways

  • 😀 The core of functional programming is functions, which are explored in-depth in this lesson.
  • 🔍 Pure functions are discussed, defined as functions that do not cause side effects, such as altering objects, files, or databases.
  • 📚 Immutability is introduced as a foundational concept for creating pure functions, emphasizing that variables should not be altered.
  • 🤔 Side effects are explained with examples, including changing object attributes, file operations, and database interactions.
  • 📝 The importance of separating pure functions from impure ones is highlighted, adhering to the Single Responsibility Principle (SRP).
  • 🔗 The concept of referential transparency is introduced, where a function's output is predictable and consistent for the same inputs.
  • 📉 Functions with referential transparency are contrasted with those without, emphasizing the benefits of clarity, simplicity, and reliability.
  • 🔄 The principle of least astonishment is mentioned, advocating for code that behaves as expected to minimize surprises.
  • 🔀 High-order functions are introduced, which can take other functions as arguments or return them, enhancing abstraction and reusability.
  • 🔧 The benefits of reducing coupling in software engineering are discussed, showing how high-order functions can achieve this.

Q & A

  • What is the core concept of functional programming discussed in the script?

    -The core concept discussed in the script is functions, which are considered the heart of functional programming. The lecture covers pure functions, side effects, immutability, and principles like SRP, which are foundational to functional programming.

  • What are pure functions and why are they important?

    -Pure functions are functions that do not cause side effects. They are important because they make the code more predictable, testable, and easier to maintain, as they always return the same result given the same inputs and do not alter any external state.

  • What is a side effect in the context of programming?

    -A side effect in programming refers to any change in the state of an object, a variable, or the environment outside the program, such as modifying an object's attribute, saving or deleting a file, or inserting a record in a database.

  • How does immutability relate to pure functions?

    -Immutability is a starting point for creating pure functions. If all variables are immutable, the function can only perform calculations and return results without altering any state, which is a characteristic of pure functions.

  • What does the script mean by separating pure functions from impure ones?

    -Separating pure functions from impure ones means keeping the code that performs calculations or transformations (pure) separate from the code that interacts with external systems or states (impure), like databases or files. This separation follows the Single Responsibility Principle (SRP) and improves code maintainability.

  • What is the Single Responsibility Principle (SRP) and how does it apply to functional programming?

    -The Single Responsibility Principle (SRP) is a software design principle that states a class or module should have only one reason to change. In functional programming, it applies by ensuring that functions have a single purpose, such as calculating a result, separate from functions that handle side effects like data storage.

  • What is referential transparency and why is it significant in functional programming?

    -Referential transparency is a concept in functional programming where a function or expression can be replaced with its result without changing the program's behavior. It is significant because it ensures predictability and reliability, making the code easier to understand, test, and debug.

  • How do pure functions inherently possess referential transparency?

    -Pure functions possess referential transparency because they do not cause side effects, do not alter any external state, and always return the same result for the same inputs. This consistency allows their results to be predicted and used interchangeably without affecting the program's outcome.

  • What are first-class functions and how do they contribute to functional programming?

    -First-class functions are functions that are treated like any other value in the programming language. They can be stored in variables, passed as arguments, and returned from other functions. In functional programming, first-class functions contribute to higher-order functions, which increase abstraction and flexibility in code.

  • What are higher-order functions and how do they enhance abstraction in code?

    -Higher-order functions are functions that can take other functions as arguments or return them as results. They enhance abstraction by allowing developers to write more generic and flexible code. This approach reduces coupling and increases the reusability of code, as functions like Filter, Map, and Reduce can operate on different data and conditions without modification.

  • How does the script suggest using functional programming to improve software quality?

    -The script suggests that by using functional programming principles and practices, such as creating pure functions and using higher-order functions, developers can produce higher quality software that is less prone to bugs and easier to maintain.

Outlines

00:00

💡 Introduction to Functional Programming Concepts

Professor Manuel Campos introduces the core concepts of functional programming, emphasizing the importance of functions as the heart of this paradigm. He discusses pure functions, side effects, immutability, and the first principle of a set of principles known as SOLID. The lecture aims to clarify what pure functions are, explaining that they do not cause side effects, which are any changes to the state of an object, variable, or external environment. Examples of side effects include altering object attributes, file operations, and database transactions. The professor highlights the necessity of separating pure functions, which perform calculations, from impure functions that handle side effects, adhering to the principle of separation of concerns (SoC).

05:02

🔍 Deep Dive into Referential Transparency

The concept of referential transparency is explored, which means a function or expression can be replaced with its resulting value without changing the program's behavior. This concept ensures predictability and reliability in code, simplifying testing and maintenance. Functions with referential transparency always return the same result for the same input and do not modify external environments or variables. Examples of functions with and without referential transparency are given, such as a simple addition function versus a function that retrieves the current date and time. The latter's output varies with each call, making it less predictable.

10:03

🛠️ The Benefits of Pure Functions and First-Class Functions

Pure functions are inherently referentially transparent, as they do not cause side effects, modify variables, or interact with external states like files or databases. The video explains that even if a function receives mutable parameters, it should not alter them to maintain purity. In functional programming languages, functions are treated as first-class citizens, meaning they can be stored in variables, passed as arguments, and returned from other functions. This feature enhances the language's flexibility and power, allowing for higher-order functions that can manipulate other functions.

15:05

🌟 High-Order Functions and Reducing Code Coupling

High-order functions, which can take other functions as parameters or return them, are introduced. These functions provide a higher level of abstraction and flexibility, allowing for code that is less coupled and more maintainable. The video uses the example of summing numbers to illustrate how high-order functions like Filter, Map, and Reduce can be used to perform operations on data with minimal code changes. The professor emphasizes that by using high-order functions, developers can write more generic and reusable code, adhering to the principles of software engineering that aim to reduce coupling and increase abstraction.

🚀 Conclusion and Encouragement to Practice Functional Programming

The video concludes by emphasizing that functional programming is about producing higher quality software through good programming practices. The professor encourages viewers to apply functional programming concepts in their code as much as possible and to look forward to more practical lessons in upcoming videos. He invites viewers to like the video, subscribe to the channel, and ask questions in the comments if they have any doubts.

Mindmap

Keywords

💡Functional Programming

Functional Programming is a programming paradigm that treats computation as the evaluation of mathematical functions and avoids changing-state and mutable data. In the video, the professor emphasizes the importance of functional programming by discussing its core concepts, such as pure functions, immutability, and higher-order functions, which are central to building software with fewer bugs and higher maintainability.

💡Pure Functions

Pure functions are central to functional programming. They are functions that, given the same input, will always return the same output without causing any side effects, such as modifying global variables or files. The video explains that pure functions are the building blocks of functional programming, ensuring predictability and ease of testing, as exemplified by the 'soma' function in the script.

💡Side Effects

Side effects refer to any changes in the state of an object, a variable, or the environment outside the function. The video script mentions that side effects include altering an object's attribute, saving or deleting a file, or inserting a record in a database. Understanding and managing side effects are crucial for writing clean and maintainable code in functional programming.

💡Immutability

Immutability means that data cannot be changed once it has been created. In the context of the video, immutability is a foundational principle that supports the creation of pure functions. By ensuring that data remains unchanged, immutability simplifies reasoning about code and enhances the predictability of functions, as there are no unexpected modifications to the data.

💡SOLID Principles

SOLID is an acronym for five design principles intended to make software designs more understandable, flexible, and maintainable. The video mentions SOLID in relation to the Single Responsibility Principle (SRP), which states that a function should only do one thing and do it well. This principle is exemplified in the script by separating the calculation logic from the data-saving logic.

💡First-Class Functions

First-class functions are functions that can be treated like any other first-class citizen in a programming language, meaning they can be passed as arguments, returned from other functions, and assigned to variables. The video script discusses how first-class functions enable a higher level of abstraction and flexibility in functional programming, allowing functions to be manipulated just like any other value.

💡Higher-Order Functions

Higher-order functions are functions that can take other functions as arguments or return them as results. The video script explains that higher-order functions, such as 'map', 'filter', and 'reduce', provide a powerful abstraction mechanism in functional programming, allowing for the creation of reusable and flexible code, as demonstrated by the example where the behavior of these functions is changed by passing different functions as arguments.

💡Referential Transparency

Referential transparency is a property of expressions that they can be replaced with their corresponding values without changing the program's behavior. The video script uses the term to describe a function or expression whose outcome is predictable and consistent, allowing for code that is easier to reason about and test. An example given is a 'soma' function that always returns the same result for the same inputs.

💡Separation of Concerns

Separation of concerns is a design principle for separating a computer program into distinct features that overlap in functionality as little as possible. The video script mentions this principle in the context of separating the logic for calculations from the logic for saving data to a database, which aligns with the idea of keeping different aspects of the program modular and distinct for better maintainability and clarity.

💡Principle of Least Astonishment

The Principle of Least Astonishment, also known as the principle of minimal surprise, suggests that the system should behave in a way that is most expected by the user. The video script refers to this principle when discussing how functions in functional programming should behave predictably, thus avoiding surprises and making the code more intuitive and easier to understand.

💡Abstraction

Abstraction in programming is the process of hiding the complex reality while exposing only the necessary parts. The video script discusses how functional programming, through the use of higher-order functions and immutability, allows for greater abstraction, leading to code that is more generic and flexible. The example of 'filter', 'map', and 'reduce' functions demonstrates how abstraction allows for changing the behavior of these functions without altering their underlying structure.

💡Coupling

Coupling refers to how tightly the elements of a system are bound to each other. The video script explains that reducing coupling is a goal in software engineering, as it allows for more flexibility and easier maintenance. By using higher-order functions, the script demonstrates how one can reduce the dependency of functions on specific implementations, thus achieving a lower level of coupling.

Highlights

Introduction to functional programming concepts by Professor Manuel Campos.

Definition of pure functions and their lack of side effects.

Explanation of side effects in programming, such as altering object attributes or database states.

The importance of immutability as a foundation for creating pure functions.

Discussion on the need for side effects and how to separate them from pure functions.

Introduction to the Single Responsibility Principle (SRP) and its role in software engineering.

Explanation of Referential Transparency and its significance in functional programming.

Examples of functions with referential transparency and their predictability.

The benefits of referential transparency for code clarity, simplicity, and testability.

Introduction to the Principle of Least Astonishment in software engineering.

Examples of functions without referential transparency, such as those that modify files or generate random numbers.

The inherent immutability of pure functions and their automatic referential transparency.

Introduction to First-Class Functions and their treatment as values in functional languages.

Definition and examples of Higher-Order Functions that can take other functions as parameters or return functions.

The role of Higher-Order Functions in increasing abstraction and reducing coupling in code.

Practical example demonstrating the use of Filter, Map, and Reduce functions for abstraction and reusability.

Final thoughts on the goal of functional programming to produce higher quality software with good practices.

Transcripts

play00:00

Olá pessoal aqui é o professor Manuel

play00:02

Campos e vamos lá para mais uma aula do

play00:04

nosso curso de programação funcional

play00:06

essa aula você vai ver o que não sabia

play00:08

sobre funções que é o coração da

play00:11

programação funcional a gente vai

play00:13

abordar o que são funções puras efeito

play00:15

colateral ou Side Effects funções puras

play00:18

e imutabilidade que a gente viu em aulas

play00:21

anteriores srp que é o primeiro de um

play00:24

conjunto de princípios chamados Sid que

play00:26

você já deve ter ouvido falar

play00:27

transparência referencial funções de

play00:30

primeira classe funções de alta ordem e

play00:33

por fim abstração e acoplamento Então

play00:35

vamos lá vamos começar falando que são

play00:37

funções puras uma função pura é aquela

play00:40

que não causa efeito colateral E aí você

play00:43

pode estar se perguntando o que é efeito

play00:45

colateral em funções em programação

play00:48

efeito colateral Side effect em inglês é

play00:51

qualquer alteração no estado de um

play00:53

objeto uma variável de um programa ou do

play00:56

ambiente externo a esse programa então

play00:58

alguns exemplos de efeitos col altera

play01:00

são alterar um atributo de um objeto

play01:03

salvar ou excluir um arquivo inserir um

play01:06

registro no banco de dados que também é

play01:08

uma alteração você tá modificando ali o

play01:10

estado daquela tabela Onde você tá

play01:12

inserindo ou lançar uma exceção por

play01:15

exemplo ao tentar acessar um banco de

play01:16

dados Você tem uma função que faz acesso

play01:19

ao banco que faz leitura de dados do

play01:21

banco a gente sabe que esse tipo de

play01:23

função pode gerar exceções por quê

play01:25

porque o banco de dados pode estar fora

play01:26

do ar pode estar sobrecarregado e não

play01:28

conseguiu responder e você vai receber

play01:30

uma exceção de volta dizendo que não foi

play01:33

possível acessar o banco Se todas as

play01:35

variáveis que você tem são imutáveis são

play01:38

totalmente imutáveis apenas o lançamento

play01:40

de exceções que a gente viu

play01:42

anteriormente ou alterações que a função

play01:44

Faça no ambiente é que podem tornar essa

play01:47

função impura então imutabilidade é o

play01:50

ponto de partida pra gente conseguir

play01:52

criar esse tipo de função mas como a

play01:54

gente viu nas aulas anteriores não tem

play01:56

como em determinados momentos eu vou

play01:58

precisar alterar alguma variável e com

play02:01

efeitos colaterais é a mesma coisa a

play02:03

gente precisa lançar exceções a gente

play02:05

precisa fazer alterações em bancos de

play02:07

dados em arquivos A questão é que quando

play02:10

eu precisar criar efeitos colaterais eu

play02:13

tenho que separar esse código de dentro

play02:15

das minhas funções Então imagina que

play02:16

você tem que realizar uma série de

play02:18

cálculos e depois salvar o resultado

play02:20

desses cálculos no banco de dados os

play02:23

cálculos eles devem ser funções puras

play02:25

que vão lá e fazem apenas isso e te

play02:27

Retornam um resultado sem alterar nada e

play02:29

você teria uma outra função que vai

play02:32

pegar o resultado dessa função anterior

play02:34

e ela sim salvar no banco de dados essa

play02:37

última função ela seria uma função

play02:39

impura pelo fato de estar alterando um

play02:42

ambiente externo que é o nosso banco

play02:44

além da possibilidade dessa função gerar

play02:46

exceções se ela não conseguir por

play02:48

exemplo acessar o banco ou se os dados

play02:51

que você tiver tentando inserir no banco

play02:54

sejam dados Inválidos então quando a

play02:56

gente separa as funções puras de impuras

play02:59

a gente a gente passa a seguir dois

play03:01

princípios O primeiro é o separation of

play03:03

concerns conhecido como sock que é a

play03:06

separação de preocupações é você Separar

play03:09

coisas distintas fazer cálculo é uma

play03:12

coisa salvar dados no banco de dados é

play03:14

outra coisa completamente diferente

play03:17

então se são coisas distintas esse

play03:19

código ele precisa estar separado isso

play03:22

vai inclusive facilitar o entendimento e

play03:24

a manutenção do código se você tem uma

play03:27

função que a única coisa que ela faz é

play03:29

realizar somas Toda vez que você

play03:31

precisar realizar uma soma você pode

play03:34

recorrer a essa função o srp é o s num

play03:38

conjunto de princípios que a gente chama

play03:39

de Solid você já deve ter ouvido falar

play03:41

de Solid pois esse é um conjunto de

play03:43

princípios bastante famoso e muito útil

play03:46

se você tiver interesse no assunto tem

play03:48

uma playlist inteira aqui no canal sobre

play03:50

padrões de projetos onde eu apresento em

play03:53

detalhes cada um desses princípios mas

play03:55

como Solid é um assunto de extrema

play03:57

importância pra engenharia de software

play04:00

caso você queira entender mais sobre

play04:02

esses princípios Eu sugiro esse artigo

play04:04

chamado os princípios Sid em imagens ele

play04:07

é um artigo sensacional e é um excelente

play04:10

ponto de partida para você poder

play04:12

entender como que cada um desses

play04:14

princípios funciona e eu vou deixar o

play04:16

link desse artigo na descrição do vídeo

play04:18

vamos avançar e agora a gente vai falar

play04:20

um pouco sobre transparência referencial

play04:22

o que que é isso é um conceito de

play04:25

programação funcional que diz que uma

play04:27

função ou uma expressão ela tem

play04:30

transparência referencial se em todos os

play04:32

locais que você tiver usando essa função

play04:35

ou essa expressão se você tirar a

play04:38

expressão e colocar o resultado dela no

play04:41

lugar você não vai alterar o

play04:44

funcionamento do código Você vai

play04:46

continuar tendo o mesmo resultado que

play04:48

você tinha anteriormente vamos lá

play04:50

entender isso melhor primeiro o porqu

play04:52

desse termo transparência referencial

play04:55

algo Transparente é algo que a gente não

play04:57

percebe a ideia de que toda vez que você

play04:59

tiver tiver fazendo referência a essa

play05:01

função você consegue perceber ou

play05:04

calcular Qual que é o valor que ela

play05:06

retorna sem ter nenhuma surpresa a gente

play05:08

vai ter transparência referencial para

play05:10

uma função ou uma expressão se quando eu

play05:13

passar um conjunto de valores Ela sempre

play05:16

me retorne o mesmo resultado então se eu

play05:19

usar essa função ou essa expressão que é

play05:21

o que a gente chama de referenciar se eu

play05:24

passar sempre o mesmo conjunto de

play05:26

valores o resultado tem que ser o mesmo

play05:28

para que conjunto É nesse sentido que eu

play05:31

tô falando que a gente não deveria ter

play05:33

surpresas ao receber um retorno dessa

play05:36

função ou dessa expressão Então vamos lá

play05:38

para alguns exemplos de funções com

play05:40

transparência referencial aqui eu tenho

play05:42

uma função soma que ela recebe dois

play05:44

valores e a única coisa que ela faz é

play05:47

somar esses dois valores e devolver o

play05:50

resultado sem fazer nenhuma alteração

play05:52

então ela não modifica as variáveis que

play05:55

foram recebidas ela não depende de

play05:57

ambiente externo como arquivos ou bancos

play05:59

de de dados e ela também não gera

play06:01

exceções a segunda função tem as mesmas

play06:04

propriedades ela vai verificar se uma

play06:06

pessoa é maior de idade ela também não

play06:08

altera essa variável que foi recebida no

play06:11

caso dessa função soma se eu passar os

play06:13

valores 10 e 2 ela sempre tem que

play06:16

retornar 12 não interessa quantas vezes

play06:19

eu faço a referência a essa função com

play06:21

esses valores o resultado sempre tem que

play06:24

ser 12 se os parâmetros são os mesmos o

play06:27

resultado sempre tem que ser o mes mesmo

play06:29

isso quer dizer que no lugar da chamada

play06:32

da função da referência da função Se eu

play06:35

colocar o valor fixo direto o valor que

play06:38

a função retornaria eu vou ter o mesmo

play06:41

resultado final Então a primeira linha e

play06:43

a segunda linha vão ter o mesmo

play06:46

resultado porque a minha função soma ela

play06:48

tem transparência referencial então a

play06:51

transparência referencial ela Visa

play06:53

garantir clareza simplicidade

play06:56

previsibilidade e confiabilidade do do

play06:58

teu código e facilidade para criar

play07:01

testes porque o código ele é mais

play07:02

simples uma vez que você não tá

play07:04

alterando variáveis você não tá fazendo

play07:06

modificações em arquivos em nada disso

play07:09

você não tá gerando exceção então o teu

play07:12

código ele é mais claro e por

play07:14

consequência ele é mais simples é um

play07:16

código mais suscinto é um código mais

play07:18

fácil de você entender uma coisa leva a

play07:21

outra previsibilidade confiabilidade

play07:24

porque você sabe que se você informar 10

play07:27

e 2 o resultado sempre vai ser 12 você

play07:30

não tem a possibilidade de uma hora você

play07:32

informar esses valores e ele te retornar

play07:35

12 e outra hora por exemplo ele te

play07:38

devolver uma exceção porque ele tentou

play07:41

acessar um arquivo e o arquivo não

play07:43

existia por fim se a função é mais

play07:46

simples se ela não altera estado se ela

play07:48

não salva dados em arquivo se ela não

play07:51

altera dados em um banco de dados ou faz

play07:53

acesso a um banco de dados a gente tem

play07:56

menos cenários para testar e como essas

play07:58

funç são mais simples e previsíveis a

play08:01

gente acaba atendendo a outro princípio

play08:03

que é o principle of list astonishment

play08:06

que a gente vai ver a sigla pola é o

play08:08

princípio do menor espanto ou da menor

play08:10

surpresa Esse é um princípio de

play08:12

engenharia de software que é apresentado

play08:14

em alguns livros como código limpo e diz

play08:17

que você deve fazer as coisas da forma

play08:19

que é o mais esperado Então vamos ver

play08:22

exemplos de funções sem transparência

play08:24

Essas são funções que podem retornar um

play08:26

valor diferente a cada vez que são

play08:27

chamados ou são que lançam exceções ou

play08:31

que fazem alterações em arquivos em

play08:33

banco de dados que causam mutabilidade e

play08:36

aqui a gente tem exemplos clássicos Você

play08:38

tem uma função que obtém a data e ou a

play08:41

hora cada vez que você chamar essa

play08:43

função ela pode te devolver um valor

play08:45

diferente nesse primeiro exemplo aí é

play08:47

uma função que te devolve a data e a

play08:49

hora atual Possivelmente se você chamar

play08:52

essa função várias vezes cada vez que

play08:55

você chamar você vai ter um resultado

play08:58

diferente por mais você saiba que esse é

play09:00

o comportamento da função o resultado de

play09:03

fato é meio imprevisível você chamar a

play09:05

função agora e não olhar no relógio você

play09:08

não sabe qual valor exato ela vai te

play09:10

devolver da mesma forma funções que

play09:12

geram números aleatórios nesse caso aqui

play09:15

também é uma função em Java ela na

play09:17

verdade como na grande maioria das

play09:18

linguagens ela vai te gerar um número

play09:21

pseudo aleatório e ele é chamado assim

play09:23

porque existe um cálculo por trás da

play09:25

geração desses números cada vez que eu

play09:28

chamar a função ela pode me devolver um

play09:30

valor diferente e aí por último a gente

play09:32

tem uma função de salvar um arquivo que

play09:35

poderia ser também incluir um um

play09:37

registro no banco de dados Essas funções

play09:40

elas modificam o estado porque ela vai

play09:42

modificar o arquivo ou o banco você pode

play09:44

chamar a função salvar passando o nome

play09:46

de um arquivo e num momento ela salvar e

play09:49

talvez daqui a pouco você chama a função

play09:52

de novo para salvar no mesmo arquivo e

play09:54

ela dá erro o parâmetro foi o mesmo só

play09:56

que o arquivo pode ter sido excluído e

play09:58

por por acaso a função não recria o

play10:01

arquivo caso ele não exista Então você

play10:03

não tem a garantia de que a função

play10:05

sempre vai funcionar da mesma forma com

play10:08

os mesmos valores de parâmetros mas

play10:11

Essas funções elas não tão erradas a

play10:13

gente precisa desse tipo de função só

play10:15

que elas não vão garantir os benefícios

play10:17

que a gente falou anteriormente de

play10:19

simplicidade previsibilidade esse tipo

play10:22

de coisa a boa notícia é que funções

play10:24

puras elas já têm transparência

play10:26

referencial por quê elas não causam um

play10:29

efeito colateral elas não geram exceções

play10:31

elas não alteram variáveis não alteram

play10:34

arquivos nem banco de dados segundo que

play10:37

imutabilidade é regra a nossa função ela

play10:40

pode receber uma série de variáveis de

play10:42

parâmetros que são imutáveis e assim ela

play10:45

não vai conseguir alterar nem que ela

play10:47

quisesse só que ela também pode receber

play10:49

como a gente viu nas aulas anteriores

play10:51

parâmetros mutáveis E assim se ela

play10:54

quisesse ela conseguiria alterar esses

play10:57

parâmetros então mesmo que que tua

play10:59

função receba uma variável que é mutável

play11:02

você sabe que você deve evitar alterar

play11:05

essas variáveis e se sua função é

play11:07

realmente pura ela vai ter transparência

play11:10

referencial E com isso eu poderia trocar

play11:12

a chamada dessa função pelo valor que

play11:15

ela retorna que eu não vou alterar o

play11:17

resultado final em linguagens não

play11:19

funcionais que seriam linguagens que não

play11:21

t suporte a programação funcional

play11:24

variáveis elas só armazenam valores você

play11:26

pode declarar uma variável string para

play11:28

armazenar um nome ou inteiro para

play11:30

armazenar uma idade ou Double para

play11:32

armazenar o peso de uma pessoa então

play11:34

tudo que você armazena em variáveis são

play11:36

valores ou objeto que vai ter um

play11:38

conjunto de valores mas em linguagens

play11:40

funcionais a gente tem um conceito de

play11:43

funções de primeira classe ou First

play11:45

Class functions nessas linguagens

play11:47

funções passam a ter os mesmos

play11:49

privilégios que valores têm você pode

play11:51

armazenar funções em variáveis ou

play11:54

constantes mesma forma que você armazena

play11:56

valores função é tratada como um valor

play11:59

ele é apenas um objeto do tipo function

play12:01

ou variantes como a gente tem em

play12:03

linguagens tipadas como Java Mas isso é

play12:06

assunto para uma próxima aula em

play12:07

linguagens funcionais tudo que você pode

play12:10

fazer com um valor você pode fazer com

play12:12

uma função por exemplo você pode

play12:14

declarar uma variável para armazenar uma

play12:16

função passar uma função por parâmetro

play12:18

para outra função ou fazer uma função

play12:21

retornar outra esses dois últimos pontos

play12:24

é o que há de mais útil em programação

play12:26

funcional isso a gente também vai ver na

play12:28

prática nas aulas seguintes bom então

play12:30

chegamos às funções de alta ordem ou

play12:33

High Order functions Essas são funções

play12:35

que têm as duas últimas características

play12:37

que eu acabei de mostrar é uma função

play12:39

que pode receber outras funções como

play12:41

parâmetro ou retornar funções que a

play12:45

gente tá habituado em programação

play12:46

estruturada e orientada ao objeto é

play12:48

fazer as nossas funções receberem e

play12:51

retornarem valores então aqui em

play12:53

programação funcional a gente tem uma

play12:55

nova possibilidade que é receber e

play12:57

retornar outras funções e isso vai nos

play12:59

trazer um maior nível de abstração

play13:02

abstração é um conceito lá de

play13:03

programação orientada a objetos com

play13:05

código mais abstrato ele é mais genérico

play13:08

mais flexível vamos pegar aquele exemplo

play13:10

de soma de números que a gente viu na

play13:12

primeira aula e o que esse código faz é

play13:15

realizar a soma do dobro dos números

play13:18

pares como a gente já sabe o que Filter

play13:21

map e reduce recebem são funções por que

play13:24

que eu tenho abstração aqui porque o

play13:27

Filter ele vai simplesmente filtrar os

play13:30

dados mas ele não sabe como quem diz o

play13:32

como somos nós no momento de usar o

play13:35

Filter Então quando você passa uma

play13:37

função por parâmetro paraa outra você

play13:39

tem esse maior nível de abstração por

play13:42

isso porque a função que você tá

play13:43

chamando o Filter por exemplo ele

play13:46

internamente ele não tem implementado a

play13:48

forma de obter um número par o Filter

play13:51

ele é uma função reutilizável

play13:53

absurdamente flexível Assim como as

play13:56

outras map reduce justamente porque ela

play13:59

recebe uma função um comportamento por

play14:02

parâmetro eu que digo pro Filter como

play14:04

que eu quero que ele filtre os dados que

play14:06

eu tenho se isso não ficou totalmente

play14:08

claro como modificar esse exemplo agora

play14:11

eu quero a soma do triplo dos números

play14:14

positivos para o vídeo por um instante e

play14:17

percebe o que que foi que mudou nesse

play14:19

código viu que a estrutura é a mesma eu

play14:21

tenho Filter o map e o reduce o reduce

play14:24

inclusive não mudou absolutamente nada

play14:27

eu só tive que mudar Qual foi a função

play14:29

que eu passo pro Filter e qual a função

play14:31

que eu passo pro map então Essas funções

play14:34

Filter map e reduce elas são altamente

play14:37

reutilizáveis com isso além da gente ter

play14:40

um maior nível de abstração Eu tenho um

play14:43

menor acoplamento acoplamento é o nível

play14:45

de dependência abstração a gente

play14:47

normalmente quer aumentar e o

play14:49

acoplamento eu quero reduzir Esses são

play14:52

dois princípios de engenharia de

play14:53

software muito importantes então quanto

play14:56

mais acoplado o meu código tiver quer

play14:58

dizer dizer que mais dependente ele é de

play15:00

determinadas coisas por exemplo se você

play15:03

tá usando um serviço de pagamento como

play15:05

PayPal no seu código você escreveu todo

play15:08

o código para fazer acesso direto a API

play15:10

de pagamento do PayPal Então você tem um

play15:13

altíssimo acoplamento com o PayPal para

play15:15

você trocar o serviço de pagamento por

play15:18

qualquer outro você vai ter que mexer em

play15:20

muito código com funções de alta ordem

play15:23

que é essa possibilidade de eu passar

play15:25

funções por parâmetro e retornar funções

play15:27

a gente consegue reduzir esse

play15:29

acoplamento Filter e map reduce Eles não

play15:32

estão acoplados amarrados ali

play15:34

dependentes de uma função específica a

play15:37

única coisa que o Filter diz é que eu

play15:39

tenho que passar para ele uma função que

play15:41

recebe um valor e essa função tem que

play15:44

retornar um bullan que é uma condição e

play15:47

o que eu fiz aqui no Filter foi

play15:49

exatamente isso eu tenho n que é o

play15:51

parâmetro que é o valor que a função vai

play15:54

receber dessa função que eu tô passando

play15:55

pro Filter e depois da seta eu tenho n

play15:59

maior do que z0 que é uma condição uma

play16:01

condição tem um valor lógico Mas isso

play16:03

não quer dizer que eu tô dependente

play16:05

dessa função em que verifica se o número

play16:08

é positivo a gente viu no slide anterior

play16:10

que eu posso trocar essa função por

play16:12

qualquer outra desde que eu siga essa

play16:15

estrutura essa assinatura eu tenho que

play16:17

receber um valor e devolver um bullan

play16:20

isso é o que o Filter define as funções

play16:22

seguintes map reduce cada uma vai

play16:24

definir uma uma estrutura diferente o

play16:27

map Eu recebo um valor e eu posso

play16:29

devolver qualquer coisa que eu queira

play16:30

então por isso que a gente tem um menor

play16:32

acoplamento um menor nível de

play16:34

dependência quando a gente passa funções

play16:36

por parâmetro para outras funções a

play16:38

gente tem funções de alta ordem então

play16:41

para finalizar eu quero que vocês tenham

play16:43

em mente uma coisa programação funcional

play16:45

É principalmente sobre produzir software

play16:47

de maior qualidade usando boas práticas

play16:50

de programação e engenharia de software

play16:53

e assim a gente vai conseguir construir

play16:54

software de mais qualidade com menos

play16:56

bugs e com muito maior facilidade de

play16:59

manutenção Então por esse vídeo é isso

play17:01

eu espero que vocês tenham gostado não

play17:03

deixem de acompanhar as próximas aulas a

play17:06

gente vai começar com a parte mais

play17:07

prática se gostou não esquece de deixar

play17:09

o seu like e se inscrever no canal se

play17:11

ainda não é inscrito e qualquer dúvida

play17:13

posta nos comentários me diz aí você vai

play17:15

começar a usar programação funcional nos

play17:17

seus códigos o máximo que você puder até

play17:20

mais até o próximo vídeo

Rate This

5.0 / 5 (0 votes)

相关标签
Functional ProgrammingPure FunctionsSide EffectsSoftware EngineeringImmutabilityFirst-Class FunctionsHigh-Order FunctionsSeparation of ConcernsPrinciples of SOLIDProgramming Tutorial
您是否需要英文摘要?