Skip to main content

Aprimorando a legibilidade e a capacidade de manutenção do código

O Copilot Chat pode sugerir maneiras de tornar seu código mais fácil de entender e de manter.

É difícil para outros desenvolvedores manterem e estenderem código com legibilidade ruim. O Copilot Chat pode ajudar você de várias maneiras. Por exemplo:

Documentar o código é outra maneira de melhorar a capacidade de manutenção dele. Para saber mais sobre como usar o Copilot Chat para ajudar você a adicionar comentários úteis ao seu código, confira os prompts de exemplo Documentando o código.

Note

As respostas mostradas neste artigo são exemplos. Respostas do Copilot Chat são não determinísticas, portanto, você pode obter respostas diferentes das mostradas aqui.

Aprimorando nomes de variável

Nomes de variável e de parâmetro descritivos facilitam a compreensão da finalidade deles.

Cenário de exemplo

Esse código JavaScript registra em log uma mensagem sobre a idade de uma pessoa no console. Nomes de parâmetro abstratos dificultam a compreensão da finalidade do código.

function logPersonsAge(a, b, c) {
  if (c) {
    console.log(a + " is " + b + " years old.");
  } else {
    console.log(a + " does not want to reveal their age.");
  }
}

Solicitação de exemplo

No editor, selecione a função que deseja alterar e pergunte ao Copilot Chat:

Improve the variable names in this function

Exemplo de resposta

O Copilot sugere nomes de variável descritivos.

function logPersonAge(name, age, revealAge) {
  if (revealAge) {
    console.log(name + " is " + age + " years old.");
  } else {
    console.log(name + " does not want to reveal their age.");
  }
}

Evitando verificações condicionais sequenciais

Cadeias if...else podem ser difíceis de ler, especialmente quando são longas.

Cenário de exemplo

Este código Python imprime o som que vários animais fazem, se definidos, ou "Unknown animal" se o tipo de animal não for reconhecido. No entanto, a cadeia de instruções if...else torna o código ineficiente e complicado.

class Animal:
    def speak(self):
        pass

class Dog(Animal):
    def speak(self):
        return "Woof!"

class Cat(Animal):
    def speak(self):
        return "Meow!"

class Bird(Animal):
    def speak(self):
        return "Tweet!"

def animal_sound(animal_type):
    if animal_type == "dog":
        return Dog().speak()
    elif animal_type == "cat":
        return Cat().speak()
    elif animal_type == "bird":
        return Bird().speak()
    else:
        return "Unknown animal"

print(animal_sound("dog"))
print(animal_sound("cat"))
print(animal_sound("bird"))
print(animal_sound("fish"))

Solicitação de exemplo

Simplify this code. Avoid using if/else chains but retain all function return values.

Exemplo de resposta

O Copilot sugere o uso de um dicionário para mapear os tipos de animais para as classes correspondentes.

class Animal:
    def speak(self):
        pass

class Dog(Animal):
    def speak(self):
        return "Woof!"

class Cat(Animal):
    def speak(self):
        return "Meow!"

class Bird(Animal):
    def speak(self):
        return "Tweet!"

def animal_sound(animal_type):
    animals = {
        "dog": Dog,
        "cat": Cat,
        "bird": Bird
    }
    animal_class = animals.get(animal_type, Animal)
    return animal_class().speak() if animal_class != Animal else "Unknown animal"

print(animal_sound("dog"))
print(animal_sound("cat"))
print(animal_sound("bird"))
print(animal_sound("fish"))

Reduzindo a lógica aninhada

Estruturas profundamente aninhadas podem tornar o código difícil de acompanhar, dificultando a modificação ou a extensão da lógica do código no futuro.

Cenário de exemplo

Este código Ruby imprime informações sobre uma conta de usuário com base em três parâmetros. O uso de instruções if...else aninhadas torna o código desnecessariamente complexo.

def determine_access(user_role, has_permission, is_active)
  if user_role == "admin"
    if has_permission
      if is_active
        "Active admin account with full access."
      else
        "Inactive admin account."
      end
    else
      "Admin account lacks necessary permissions."
    end
  else
    "Access denied."
  end
end

puts determine_access("admin", true, true)
puts determine_access("admin", true, false)
puts determine_access("admin", false, true)
puts determine_access("user", true, true)

Solicitação de exemplo

Rewrite this code to avoid the nested if/else statements

Exemplo de resposta

O Copilot sugere o uso de cláusulas de proteção para lidar com as condições antecipadamente e retornar as mensagens apropriadas.

def determine_access(user_role, has_permission, is_active)
  return "Access denied." unless user_role == "admin"
  return "Admin account lacks necessary permissions." unless has_permission
  return "Inactive admin account." unless is_active

  "Active admin account with full access."
end

puts determine_access("admin", true, true)
puts determine_access("admin", true, false)
puts determine_access("admin", false, true)
puts determine_access("user", true, true)

Dividindo métodos grandes

Pode ser difícil entender exatamente o que um método ou uma função faz quando ela é muito longa, dificultando a manutenção. Métodos ou funções que executam várias tarefas podem não ser reutilizáveis em outros contextos. Também pode ser difícil testar cada tarefa isoladamente.

Cenário de exemplo

Esse método Java processa um pedido de cliente e imprime uma mensagem. Ele executa várias tarefas em um só método.

public void processOrder(Order order) {
  if (order == null || order.getItems().isEmpty()) {
    throw new IllegalArgumentException("Order is invalid.");
  }

  double totalPrice = 0.0;
  for (Item item : order.getItems()) {
    totalPrice += item.getPrice() * item.getQuantity();
  }
  order.setTotalPrice(totalPrice);

  if (totalPrice > 0) {
    order.setStatus("Processed");
  } else {
    order.setStatus("Pending");
  }

  System.out.println("Order for customer " + order.getCustomerName() + " has been processed. Total price: " + totalPrice);
}

Solicitação de exemplo

How could the processOrder method be refactored to be more useful and easier to maintain

Exemplo de resposta

O Copilot sugere dividir esse método em métodos menores e mais focados.

public void processOrder(Order order) {
    validateOrder(order);
    double totalPrice = calculateTotalPrice(order);
    updateOrderStatus(order, totalPrice);
    printOrderSummary(order, totalPrice);
}

private void validateOrder(Order order) {
    if (order == null || order.getItems().isEmpty()) {
        throw new IllegalArgumentException("Order is invalid.");
    }
}

private double calculateTotalPrice(Order order) {
    double totalPrice = 0.0;
    for (Item item : order.getItems()) {
        totalPrice += item.getPrice() * item.getQuantity();
    }
    order.setTotalPrice(totalPrice);
    return totalPrice;
}

private void updateOrderStatus(Order order, double totalPrice) {
    if (totalPrice > 0) {
        order.setStatus("Processed");
    } else {
        order.setStatus("Pending");
    }
}

private void printOrderSummary(Order order, double totalPrice) {
    System.out.println("Order for customer " + order.getCustomerName() + " has been processed. Total price: " + totalPrice);
}

Leitura adicional