Executando verificação de segurança...
6

[ChatGPT] Escrevendo Mensagens de Commit e Comentando Código

Como o ChatGPT pode ajudá-lo a escrever mensagens de commit e comentários de código de maneira mais eficiente e eficaz


Introdução
Inserindo Contexto
Exemplo Prático
Observações
Limitações do ChatGPT
Dicas para Escrever Commits
Dicas para Comentários
Considerações Finais

Introdução

Escrever mensagens de commit e comentários de código pode ser uma tarefa desafiadora para muitos desenvolvedores.

Pessoalmente; eu sou programador há mais de 30 anos e ainda acho chato, tedioso e às vezes não tenho criatividade para escrever mensagens de commit e comentar código.
Pois é; o ChatGPT está me quebrando um galho!

É importante fornecer informações precisas e úteis, mas às vezes é difícil encontrar as palavras certas ou pensar em como explicar o que você fez.
O código que você próprio escreve não lhe parece tão óbvio e autoexplicativo no presente momento em que você está escrevendo?

Nesse artigo, vou mostrar como o ChatGPT pode ajudá-lo a escrever mensagens de commit e comentários de código de maneira mais eficiente e eficaz.
Usando exemplos de código em linguagem C, mostrarei como inserir contexto na conversa com o ChatGPT e como solicitar a ele para escrever mensagens de commit e comentários de código.

Vou também discutir os limites do ChatGPT e fornecer dicas adicionais para escrever mensagens de commit e comentários de código de maneira eficiente.

🔝 (Voltar para o Início)

Inserindo Contexto

É importante inserir contexto na conversa com o ChatGPT antes de pedir para ele escrever mensagens de commit ou comentários de código porque isso permite que o modelo tenha uma compreensão mais profunda do que você está tentando fazer.

Na grande maioria das vezes; basta inserir o Código fonte no prompt do ChatGPT, conforme o exemplo prático; porém o ChatGPT tem algumas limitações que eu explico mais adiante, para os raros casos em que os comentários do ChatGPT não forem satisfatórios, seguem algumas orientações.

Quanto mais contexto você fornecer, mais informações o ChatGPT terá para gerar uma resposta apropriada.

Você pode fornecer informações sobre o código que você acabou de escrever ou o problema que você está tentando resolver; então o ChatGPT pode gerar uma mensagem de commit que descreva claramente o que você fez e por quê.

Da mesma forma você pode fornecer informações sobre o código em questão ou a tarefa que o código realiza; isso permitirá ao ChatGPT gerar comentários de código que expliquem de maneira precisa o que o código está fazendo e como ele se relaciona com outras partes do projeto.

🔝 (Voltar para o Início)

Exemplo Prático

Fornecer o código no campo de entrada do ChatGPT é uma maneira prática de inserir contexto na conversa.
Abaixo mostro um exemplo utilizando a linguagem C:


Eu: // main.c

#include <stdio.h>
#include "funcoes_matematicas.h"

int main() {
int n;
printf("Insira um número: ");
scanf("%d", &n);
printf("O fatorial de %d é %d\n", n, fatorial(n));
return 0;
}

ChatGPT: Este é o código...

Este é o código de um programa em C que calcula o fatorial de um número dado pelo usuário. O programa começa incluindo as bibliotecas "stdio.h" e "funcoes_matematicas.h", que fornecem funções para entrada e saída de dados e funções matemáticas, respectivamente.

Em seguida, é declarada uma função chamada "main", que é a função principal do programa. Dentro da função "main", uma variável inteira chamada "n" é declarada e um prompt é exibido para o usuário para que ele insira um número. O número inserido pelo usuário é armazenado na variável "n" usando a função "scanf".

Em seguida, a função "fatorial" é chamada com o argumento "n" e o resultado é armazenado em uma variável. Finalmente, o resultado é exibido para o usuário usando a função "printf".

Observe que a função "fatorial" é declarada em um arquivo separado chamado "funcoes_matematicas.h". É importante incluir este arquivo no início do programa para poder usar a função "fatorial".

Eu: // funcoes_matematicas.h

#ifndef FUNCOES_MATEMATICAS_H
#define FUNCOES_MATEMATICAS_H

int fatorial(int n);

#endif

ChatGPT: Este é o código...

Este é o código de um arquivo de cabeçalho em C chamado "funcoes_matematicas.h". Ele contém a declaração de uma função chamada "fatorial" que calcula o fatorial de um número dado.

O código começa com uma verificação de macros "ifndef" e "define". Essas macros são usadas para garantir que o arquivo de cabeçalho não seja incluído mais de uma vez em um programa. Isso é útil quando você tem um arquivo de cabeçalho que é incluído por vários outros arquivos.

Em seguida, é declarada a função "fatorial" que recebe um inteiro como argumento e retorna um inteiro.

Finalmente, é usada outra macro "endif" para fechar a verificação de macros "ifndef" e "define". Isso indica o fim da declaração da função "fatorial".

Eu: Escreva comentários no código

ChatGPT:

//   funcoes_matematicas.h

#ifndef FUNCOES_MATEMATICAS_H
#define FUNCOES_MATEMATICAS_H

// Função para calcular o fatorial de um número
int fatorial(int n);

#endif // FUNCOES_MATEMATICAS_H

Eu: // funcoes_matematicas.c

#ifndef FUNCOES_MATEMATICAS_C
#define FUNCOES_MATEMATICAS_C

#include <stdio.h>

#include "funcoes_matematicas.h"

int fatorial(int n) {
if (n == 0) {
return 1;
}
return n * fatorial(n - 1);
}

#endif

ChatGPT: Este é o código...

Este é o código de um arquivo de implementação em C chamado "funcoes_matematicas.c". Ele contém a implementação da função "fatorial" que foi declarada no arquivo de cabeçalho "funcoes_matematicas.h".

O código começa com uma verificação de macros "ifndef" e "define". Essas macros são usadas para garantir que o arquivo de implementação não seja incluído mais de uma vez em um programa. Isso é útil quando você tem um arquivo de implementação que é incluído por vários outros arquivos.

Em seguida, o arquivo de cabeçalho "funcoes_matematicas.h" é incluído, o que permite que a função "fatorial" seja usada no arquivo de implementação.

A função "fatorial" é então implementada usando a recursão. Se o número passado como argumento for zero, a função retorna 1, que é o fatorial de zero. Caso contrário, a função retorna o número passado como argumento multiplicado pelo fatorial de um número menor.

Finalmente, é usada outra macro "endif" para fechar a verificação de macros "ifndef" e "define". Isso indica o fim da implementação da função "fatorial".

Eu: Escreva comentários no código

ChatGPT:

//   funcoes_matematicas.c

#ifndef FUNCOES_MATEMATICAS_C
#define FUNCOES_MATEMATICAS_C

#include <stdio.h>

#include "funcoes_matematicas.h"

// Função para calcular o fatorial de um número
int fatorial(int n) {
    if (n == 0) {
        return 1; // fatorial de zero é sempre um
    }
    return n * fatorial(n - 1);
}

#endif // FUNCOES_MATEMATICAS_C

Eu: // funcoes_matematicas.c

#ifndef FUNCOES_MATEMATICAS_C
#define FUNCOES_MATEMATICAS_C

#include <stdio.h>

#include "funcoes_matematicas.h"

int fatorial(int n) {
int resultado = 1;
for (int i = 2; i <= n; i++) {
resultado *= i;
}
return resultado;
}

#endif

ChatGPT: Este é o código...

Este é o código de uma versão alternativa da função "fatorial" que foi implementada usando um loop "for" em vez de recursão.

O código começa declarando uma variável inteira chamada "resultado" e inicializando-a com 1. Em seguida, o loop "for" começa em 2 e vai até o número passado como argumento, incrementando a variável de controle "i" em 1 a cada iteração. Dentro do loop, a variável "resultado" é atualizada multiplicando-se por "i".

Quando o loop termina, a função retorna o valor da variável "resultado", que é o fatorial do número passado como argumento.

Observe que essa implementação da função "fatorial" não é recursiva, o que significa que ela não chama a si mesma para calcular o fatorial de um número menor. Em vez disso, ela usa um loop "for" para calcular o fatorial de forma iterativa. Isso pode ser mais eficiente do que a implementação recursiva, mas a escolha da implementação depende do contexto e das necessidades do programa.

Eu: escreva uma menságem de commit para essa atualização

ChatGPT: Aqui está uma possível mensagem de commit para essa atualização:

"Implementação da função fatorial usando um loop for em vez de recursão. Esta implementação pode ser mais eficiente em alguns casos e é uma alternativa à implementação recursiva existente."

Eu: em qual caso essa implementação é melhor?

ChatGPT: Essa implementação...

Essa implementação da função "fatorial" que usa um loop "for" em vez de recursão pode ser mais eficiente em casos em que o número passado como argumento é muito grande. Isso ocorre porque a implementação recursiva precisa criar uma nova chamada da função a cada iteração, o que pode consumir muito espaço na pilha de chamadas de função. Quando o número passado como argumento é muito grande, a pilha de chamadas de função pode ficar muito grande e, em alguns casos, pode resultar em um erro de estouro de pilha.

Por outro lado, a implementação iterativa usando um loop "for" não cria novas chamadas da função e, portanto, não enfrenta o risco de estouro de pilha. No entanto, ela pode ser menos eficiente em casos em que o número passado como argumento é pequeno, pois precisa realizar mais iterações do loop "for".

Portanto, a escolha da implementação depende do contexto e das necessidades do programa. É importante avaliar qual das duas implementações é mais adequada para cada caso específico.

Eu: escreva uma menságem de commit para a atualização explicando isso de forma resumida

ChatGPT: "Função fatorial com loop for. Mais eficiente quando "n" é muito grande."

Eu: // funcoes_matematicas.c

#ifndef FUNCOES_MATEMATICAS_C
#define FUNCOES_MATEMATICAS_C

#include <stdio.h>
#include <stdlib.h>

#include "funcoes_matematicas.h"

int fatorial(int n) {
if (n < 0) {
fprintf(stderr, "Erro: número negativo fornecido para cálculo do fatorial.\n");
exit(1);
}
int resultado = 1;
for (int i = 2; i <= n; i++) {
resultado *= i;
}
return resultado;
}

#endif

ChatGPT: Este é o código...

Este é o código de uma versão atualizada da função "fatorial" que inclui uma verificação para garantir que o número passado como argumento seja válido para o cálculo do fatorial.

A função verifica se o número passado como argumento é negativo. Se for, uma mensagem de erro é exibida usando a função "fprintf" e o programa é finalizado com o código de erro 1 usando a função "exit". Isso pode ser útil para garantir que o programa não tente calcular o fatorial de um número inválido e pare de executar de forma limpa em caso de erro.

Se o número passado como argumento for válido, a função continua normalmente, calculando o fatorial usando um loop "for" e retornando o resultado.

Eu: escreva uma menságem de commit para essa atualização

ChatGPT: Aqui está uma possível mensagem de commit para essa atualização:

"Adição de verificação de entrada para garantir que o número passado como argumento para a função fatorial seja válido. Em caso de número inválido, o programa exibe uma mensagem de erro e finaliza com código de erro 1."

Eu: Escreva comentários no código

ChatGPT:

//   funcoes_matematicas.c

#ifndef FUNCOES_MATEMATICAS_C
#define FUNCOES_MATEMATICAS_C

#include <stdio.h>
#include <stdlib.h>

#include "funcoes_matematicas.h"

// Função para calcular o fatorial de um número
int fatorial(int n) {
    // Verifica se o número fornecido é válido para o cálculo do fatorial.
    if (n < 0) {
        fprintf(stderr, "Erro: número negativo fornecido para cálculo do fatorial.\n");
        exit(1); // finaliza o programa com código de erro 1
    }
    int resultado = 1;
    // Loop que vai de 2 até o "n" fornecido.
    // Cada iteração multiplica "resultado" pela variável de controle "i".
    for (int i = 2; i <= n; i++) {
        resultado *= i;
    }
    return resultado;
}

#endif // FUNCOES_MATEMATICAS_C

🔝 (Voltar para o Início)

Observações

  • No início do código insira um comentário com o nome do arquivo; durante a conversa com o ChatGPT você pode se referir ao arquivo dizendo por exemplo:
    O que faz a linha 3 no arquivo "main.c"?

  • O limite máximo do prompt é 4.096 caracteres.
    Você pode dividir um arquivo grande em partes.
    Clique aqui para ver um exemplo.

      Eu: // arquivo ".gitpod.yml" dividido em 2 partes
      // Parte 1/2

      tasks:
      - name: Run Dev Server
      init: nvm install && npm install

      Eu: // arquivo ".gitpod.yml" dividido em 2 partes
      // Parte 2/2

      ports:
      - port: 3000
      onOpen: notify
      visibility: private
      - port: 1080
      onOpen: ignore
      visibility: private
      - port: 1025
      onOpen: ignore
      visibility: private

      Eu: junte as partes e mostre-me o ".gitpod.yml"

      ChatGPT: Sure, here is...

      tasks:
          - name: Run Dev Server
              init: nvm install && npm install
      ports:
          - port: 3000
              onOpen: notify
              visibility: private
          - port: 1080
              onOpen: ignore
              visibility: private
          - port: 1025
              onOpen: ignore
              visibility: private

      It shows you how the task is defined to run the command...


  • Se você disser ao ChatGPT:
    Comente o código
    Então ele vai te dar um longo texto explicando tudo o que o código faz.
    Se ao invés disso você disser:
    Escreva comentários no código
    Então ele vai inserir os comentários no código.

🔝 (Voltar para o Início)

Limitações do ChatGPT

Um dos principais limites do ChatGPT é que ele não é capaz de compreender o código de maneira tão detalhada quanto um programador profissional.
Isso significa que pode cometer erros ao escrever mensagens de commit ou comentários de código se não for fornecido o suficiente contexto ou informações precisas.

Lembre-se que o ChatGPT reflete o texto em que foi treinado, erros podem ocorrer em situações que extrapolem sua base de conhecimentos.

Apesar desses limites, o ChatGPT é uma ferramenta útil para ajudá-lo a escrever mensagens de commit e comentários de código de maneira mais eficiente e eficaz.

🔝 (Voltar para o Início)

Dicas para Escrever Commits

Aqui vão algumas dicas adicionais para ajudá-lo a escrever mensagens de commit de maneira eficiente:

  • Comece com um resumo conciso: As mensagens de commit devem começar com um resumo conciso do que foi feito. Isso ajuda a fornecer uma visão geral rápida da alteração e permite que os outros desenvolvedores entendam rapidamente o que foi feito.
  • Mantenha as mensagens de commit curtas: As mensagens de commit devem ser curtas e diretas, explicando o que foi feito de maneira clara e precisa. Evite incluir informações desnecessárias ou usar jargões técnicos sem explicação.
  • Use o presente simples: As mensagens de commit devem ser escritas no presente simples, explicando o que está sendo feito no momento em que a alteração é feita. Isso ajuda a manter a clareza e a precisão.
  • Seja específico: Seja específico ao descrever o que você está fazendo e por quê. Isso ajuda os outros desenvolvedores a entender o que você está fazendo e por que.
  • Forneça contexto: Forneça contexto sobre o problema que você está tentando resolver ou a tarefa que você está realizando. Isso ajuda os outros desenvolvedores a entender o que você está fazendo e por que.
  • Use palavras-chave: Algumas palavras-chave, como "fix", "update" ou "improve", podem ajudar a fornecer contexto sobre o que foi feito. No entanto, é importante não abusar dessas palavras e ser específico sobre o que foi feito.

🔝 (Voltar para o Início)

Dicas para Comentários

Eis mais algumas dicas para ajudá-lo a com os comentários de código:

  • Comente o código de maneira útil: Os comentários de código devem explicar o que o código está fazendo de maneira clara e precisa. Evite comentários óbvios ou inúteis, como "Incrementa o contador".
  • Seja específico: Seja específico ao descrever o que o código está fazendo e por quê. Isso ajuda os outros desenvolvedores a entender o que você está fazendo e por que.
  • Forneça contexto: Forneça contexto sobre o problema que você está tentando resolver ou a tarefa que você está realizando. Isso ajuda os outros desenvolvedores a entender o que você está fazendo e por que.
  • Use o padrão de comentário adequado: Cada linguagem de programação tem seu próprio padrão de comentário. Certifique-se de seguir o padrão adequado para a linguagem de programação que você está usando para garantir que os comentários sejam legíveis e fáceis de seguir.
  • Não comente cada linha de código: Evite comentar cada linha de código. Em vez disso, tente fornecer comentários mais amplos que expliquem o que o código está fazendo de maneira mais geral.
  • Mantenha os comentários atualizados: Certifique-se de atualizar os comentários sempre que alterar o código para que eles continuem sendo precisos e úteis.

🔝 (Voltar para o Início)

Considerações Finais

O ChatGPT pode ajudá-lo a economizar tempo na escrita de mensagens de commit e comentários de código, permitindo que você se concentre nas tarefas importantes e que como programador você deve gostar mais; que é escrever código.

É importante alertar que o ChatGPT não é uma substituição para o pensamento crítico e a revisão de um programador profissional.

🔝 (Voltar para o Início)

4
2

Interessante essa forma de utilizar o ChatGPT. Farei isso com códigos antigos que escrevi durante a faculdade. Na época eu não comentava direito os códigos e hoje fica difícil de lê-los.

1

😁👍 Eu também estou fazendo exatamente a mesma coisa;
pegando alguns programas lá do "fundo do baú" e pedindo para o ChatGPT escrever comentários mais decentes do que os meus.

2

Muito boas as dicas!

Sobre comentários, geralmente eu comento bem. Mas tem uma aplicação que eu desenvolvi mais na correria que eu acabei n me ligando de comentar alguns trechos que na época eram óbvios.

Então, quando peguei o código de novo pra conferir os comentários, me deparei com uma linha que não fazia sentido, mas que eu fui obrigado a inserir o comentário que dizia, basicamente:

# Não sei o que faz, mas, se removido, quebra tudo. Então, vai ficar aí

Não é mole, não... Kkkkkk

1
1

Opa, vi só agora kkkkkk é em Python.
Aqui:

    try:
        print('\n' + (" "*10) + 'Type port below for your program to RECEIVE data from the server.\n' +
                     (" "*10) + '(recommended: 40301)')
        bind_input_port = int(input((" "*14) + '| Insert the port to RECEIVE from:  '))
    except:
        type(bind_input_port) == int  # Can't remember the reason, but the program runs, so I won't change it yet
        

Contexto

É um programa Open-source que permite conexão MQTT para dispositivos e softwares que não têm essa conexão de forma nativa (talvez por serem obsoletos ou proprietários demais).

Eu desenvolvi em 2020, mas nunca publiquei, por perfeccionismo. Então, o que eu fiz ano passado foi sentar pra dar uma olhada e refatorada onde fosse necessário, além de melhorar os comentários, pra quem fosse ler. Foi aí que me deparei com esse trecho, que na hora não captei o objetivo.

Porém, pra não cair na problemática do perfeccionismo de novo, resolvi publicar assim mesmo, na ideia de que "O que não é perfeito pra mim, pode já ser mais do que o suficiente pra sanar uma dor de alguém", e então publiquei.

O repositório com o código fonte e as versões compiladas pra Windows e Mac tá disponível aqui!

1

Puxa!
Realmente, verificar se é inteiro sem usar essa verificação para nada é bem estranho.

Só de curioso fui ver se o ChatGPT daria algum comentário bom,
mas foi isso que ele escreveu:

This line is checking if the type of bind_input_port is an integer and does not seem to have any effect on the code. It could be redundant or left over from debugging.

1

Pois é kkkkkk e esse "left over for the debugging" me pegou, pq na hora do debugging, muito tempo dps, eu n entendi nada kkkkk

Mas em algum momento eu abro o projeto de novo pra refatorar. Eu ainda pretendo portar pra orientação a objetos, pq melhoraria diversos aspectos

2

Muito bom post, não tinha pensado nessa posibilidade. Mas usei ele(a) para escrever os textos do meu portfólio, já que sou uma porta quando se trata de escrever, já tô até dependente dele(a) para gerar textos.