Le code avec une lisibilité médiocre est difficile pour les autres développeurs de maintenir et d’étendre. Copilot Chat peut être utile à plusieurs égards. Par exemple, en :
- Suggérer des améliorations apportées aux noms de variables
- Éviter les vérifications conditionnelles séquentielles
- Réduction de la logique imbriquée
- fractionner les grandes méthodes en méthodes plus petites et plus lisibles
La documentation de votre code est une autre façon d’améliorer la maintenance de votre code. Pour plus d'informations sur l'utilisation de Copilot Chat pour vous aider à ajouter des commentaires utiles à votre code, consultez les exemples de requêtes dans Documenter le code.
Note
Les réponses décrites dans cet article sont des exemples. Copilot Chat Les réponses ne sont pas déterministes, il est donc possible que vous obteniez des réponses différentes de celles présentées ici.
Noms de variable uniques
Les noms de variables descriptifs et les noms de paramètres facilitent la compréhension de leur objectif.
Exemple de scénario
Ce code JavaScript consigne un message sur l’âge d’une personne dans la console. Les noms de paramètres abstraits rendent difficile la compréhension de l’objectif du code.
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.");
}
}
Exemples d’invite
Dans l'éditeur, sélectionnez la fonction que vous souhaitez modifier, puis demandez Copilot Chat :
Improve the variable names in this function
Exemple de réponse
Copilot propose des noms de variables descriptifs.
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.");
}
}
Éviter les contrôles conditionnels séquentiels
if...else
chaînes peuvent être difficiles à lire, en particulier lorsqu’elles sont longues.
Exemple de scénario
Ce code Python imprime le son que les différents animaux fabriquent, s’ils sont définis ou « Animal inconnu » si le type d’animal n’est pas reconnu. Toutefois, la chaîne d’instructions if...else
rend le code inefficace et fastidieux.
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"))
Exemples d’invite
Simplify this code. Avoid using if/else chains but retain all function return values.
Exemple de réponse
Copilot propose d'utiliser un dictionnaire pour associer les types d'animaux aux classes correspondantes.
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"))
Réduire la logique imbriquée
Les structures profondément imbriquées peuvent rendre le code difficile à suivre, ce qui complique la modification ou l'extension de la logique du code à l'avenir.
Exemple de scénario
Ce code Ruby imprime des informations sur un compte d’utilisateur en fonction de trois paramètres. L’utilisation d’instructions if...else
imbriquées rend le code inutilement complexe.
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)
Exemples d’invite
Rewrite this code to avoid the nested if/else statements
Exemple de réponse
Copilot suggère d'utiliser des clauses de garde pour traiter les conditions au plus tôt et renvoyer les messages appropriés.
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)
Fractionnement des méthodes volumineuses
Il peut être difficile de saisir exactement ce qu’une méthode ou une fonction fait s’il est trop long, ce qui rend difficile à maintenir. Les méthodes ou fonctions qui effectuent plusieurs tâches peuvent ne pas être réutilisables dans d’autres contextes. Il peut également être difficile de tester chaque tâche en isolation.
Exemple de scénario
Cette méthode Java traite une commande client et imprime un message. Elle exécute plusieurs tâches en une seule méthode.
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);
}
Exemples d’invite
How could the processOrder method be refactored to be more useful and easier to maintain
Exemple de réponse
Copilot suggère de décomposer cette méthode en méthodes plus petites et plus ciblées.
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);
}