Programação, Fundamentos 2

Flavio Ribeiro Lima
6 min readNov 29, 2021

--

Continuando o estudo sobre programação, nesse post vamos conhecer mais conceitos.

Função/Método

Nas linguagens de programação, além de declarar variáveis, é possível declarar também funções, podemos chamar também de método. Mas conceitualmente falando, podemos dizer que funções sempre retornam valor, e métodos podem ou não retornar um valor. O termo também pode mudar de linguagem para linguagem, por ex: quando utilizo Javascript, costumo chamar de função, quando C# chamo de método, por isso não estranhe ver as duas formas.

Os métodos são um maneira de organizar uma certa quantidade de código que realizam algum trabalho específico dentro do programa.

Por exemplo, um sistema com uma enorme quantidade operações como um ERP (Enterprise Resource Planning, Sistema Integrado de Gestão Empresarial) ou um CRM (Customer Relationship Management, Gestão de Relacionamento com o Cliente), são sistemas muito grandes (muitas linhas de código), todo esse código é organizado dentro de pacotes específicos, que por sua vez é organizado em vários métodos que realizam operações bem definidas.

Podemos pegar como exemplo uma simples calculadora, que realiza diversas operações, mas cada operação está organizada dentro de um método, veja abaixo:

Programa Calculadora

  • Botão + (somar) invoca/chama o método Somar() e retorna o resultado;
  • Botão - (subtrair) invoca/chama o método Subtrair() e retorna o resultado;

Como podemos observar, os métodos são uma boa maneira de organizar o código e disponibilizar operações para problemas específicos.

Como declarar um método

A declaração de um método varia bastante entre as linguagens, por isso vamos ver alguns exemplos:

C#

Javascript

Python

Go

Como podemos notar, a forma de realizar a declaração varia entre as linguagens, mas existem muitos pontos em comum e regras similares.

Anatomia de um método (C#)

Pelo fato do C# ser uma linguagem fortemente tipada, é necessário definir o tipo do retorno do método.

A composição, tipo do retorno, nome do método e lista de parâmetros compõe o que chamamos de assinatura do método.

OBS: Normalmente em C# e Java por exemplo, a declaração do método é precedida pelo operador de visibilidade: public, private, protected ou outro, mas vamos abordar isso quando falarmos do paradigma orientação a objetos, onde os métodos são organizados dentro de classes.

Em Javascript…

Note que declarar um método, mesmo em diferentes linguagens, é muito similar.

Outro ponto importante é, dado que o Javascript é uma linguagem fracamente tipada, não existe a definição do tipo de retorno, e sim a palavra chave function para denotar a declaração de uma função, assim como ocorre em Python que utiliza a palavra chave def.

Outra questão é, a maioria das linguagens utiliza as chaves para denotar o inicio e fim do método, o corpo, já em Python o que define isso, pasmem, são espaços em branco.

Retorno

Métodos podem ter ou não valor de retorno. Nas linguagens fortemente tipadas, como vimos anteriormente, quando houver retorno, na assinatura do método terá a indicação do tipo de retorno, caso não haja, ao invés do tipo, terá a palavra chave void (mudo). Veja abaixo exemplo em C#:

Em Javascript:

Em linguagens dinâmicas como Javascript e Python por exemplo, não há uma palavra chave na assinatura que indica se irá retornar valor ou não, supomos que teremos retorno pelo nome do método, e apenas ao analisar o corpo do método, encontramos a palavra chave return, indicando que teremos um retorno de fato.

Chamadas à um método que retorna valor, podemos armazenar esse valor em uma variável, veja abaixo em C#.

Boas Práticas

Assim como as variáveis, é de extrema importância que o nome do método reflita sua função, e pra isso novamente recorremos ao clean code, que nos mostra boas práticas ao se nomear métodos e a escrita do corpo.

Além dos cuidados ao nomear um método, o código deve ser conciso, ter uma responsabilidade bem definida e ser reaproveitável. Iremos abordar essas questões e outras, em outros posts, onde falaremos sobre clean code e SOLID.

Métodos Anônimos

Muitas linguagens permitem escrever métodos anônimos, que são métodos que não possuem nome, geralmente são atribuídos à alguma variável ou passados como parâmetro para outro método. Veja os exemplos.

Como pode ver acima, na linha 3 declaramos uma função anonima e atribuímos à uma variável, na linha 4 fizemos a chamada, e na linha 5 usamos o console.log(), que é um recurso disponibilizado pelos navegadores para enviar mensagens para o console. (Pressione a tecla F12, e vá até a aba Console).

Na linha 8 fizemos uma nova declaração de função anonima, que aceita como parâmetros, uma mensagem no primeiro parâmetro e uma função no segundo, repare que na linha 9 fazemos a chamada da função que foi passada por parâmetro, esse processo é conhecido como callback.

Nas linhas 13 e 14, fazemos a chamada da função anonima, e informamos a função direto no segundo parâmetro, que inclusive, poderia ser qualquer função, para realizar qualquer tarefa.

No C#

Esse processo no C#, como pode ver acima, é um pouco mais trabalhoso, dado que se trata de uma linguagem fortemente tipada. Nós precisamos primeiro declarar o que é conhecido como delegate na linha 3 com a assinatura desejada. Após isso, nas linhas 6 e 10, fazemos a declaração de um método anonimo, que pode realizar qualquer tarefa, desde que obedeça a assinatura definida no delegate. Exitem outros detalhes no código C# acima, como a declaração da classe com a palavra class, a definição do método main como static, mas vamos deixar essas explicações para outro momento.

Arrow Function

Algumas linguagens também oferecem uma forma bastante prática e simples de se escrever um método, as arrow function, elas permitem a declaração de um método de uma forma muito simples e abreviada, veja os exemplos:

Javascript

C#

Para aprender mais, pesquise sobre arrow function.

Métodos aninhados

Algumas linguagens permitem a declaração de métodos aninhados, ou seja, escrever um método dentro de outro método. Veja o exemplo em Javascript.

Acima na linha 1 declaramos a função ObterDadosCliente e na linha 5 declaramos a função ObterEndereco dentro da função ObterDadosCliente.

Recursividade

Ato de chamar o método dentro dele mesmo, ou seja, um método pode chamar a si mesmo. Essa abordagem facilita a resolução de alguns problemas. Veja abaixo o calculo do fatorial em C, usando recursividade.

Acima, na linha 9 a função factorial é declarada, na linha 12, note que ela chama a si mesmo.

Escopo

Métodos criam o que chamamos de escopo de declaração, assim como outras estruturas como classes, if e etc. Uma variável declarada dentro de um método, não pode ser utilizada em outro. Veja abaixo:

Acima, na linha 3 declaramos a variável nome, essa variável só pode ser utilizada dentro do método ObterDadosCliente() porque foi declarada dentro dele, então na linha 10 que é outro método, não pode ser utilizada. Isso ocorre em diversas outras estruturas, que veremos em outras publicações.

Organização

A organização dos métodos, varia muito entre as linguagens e cada uma trata essa organização de uma forma e conforme seu paradigma.

Linguagens orientada a objetos fortemente tipada

Em linguagens desse tipo, como C# e Java por exemplo, os métodos são organizados em classes, usamos a palavra chave class, e as classes por sua vez são organizadas em pacotes que podem ser lógicos ou físicos (arquivos), no C# utilizamos a palavra chave namespace, no Java package. O namespace em C# é uma organização lógica, um único arquivo compilado do C# (.dll), pode conter diversos namespaces.

Linguagens dinâmicas

Em linguagens dinâmicas, em que você pode ou não usar o paradigma orientação a objetos, os métodos ficam organizados conforme você queira, normalmente em arquivos separados para distinguir sua função, não que isso não possa ocorrer em linguagens fortemente tipadas.

Em Javascript por ex., criamos um arquivo .js para cada conjunto de métodos, então teremos um arquivo .js para cada problema especifico, que são conhecidos como bibliotecas. Atualmente o Javascript também suporta a palavra chave class, nos possibilitando organizar nossos métodos dessa forma também.

Outra linguagem dinâmica que suporta o uso de class é o Python, assim como o PHP.

Linguagem procedural fortemente tipada.

A linguagem C, não suporta o uso de classes, seus métodos ficam organizados em arquivos conforme sua função.

Linguagem funcional

Linguagens como F# suportam o uso de namespace ou modulo, para organizar suas funções, o Clojure também suporta namespace.

Para entender a organização de código que cada linguagem oferece, é necessário estuda-la um pouco mais a fundo.

Conclusão

Podemos observar que, apesar de algumas diferenças entre as linguagens, existem regras básicas que são válidas em todas.

Muito obrigado e até a próxima.

--

--

Flavio Ribeiro Lima

Desenvolvedor de Software. Entusiasta de boas práticas, padrões de desenvolvimento e arquitetura de sistemas.