Skip to main content

Verbessern der Lesbarkeit und Wartbarkeit von Code

Copilot Chat kann Möglichkeiten vorschlagen, deinen Code leichter nachvollziehbar und verwaltbar zu gestalten.

Schlecht lesbarer Code kann durch andere Entwickler schwer verwaltet und erweitert werden. Copilot Chat kann dich auf verschiedene Weise unterstützen. Beispiel:

Die Dokumentation deines Codes stellt eine weitere Möglichkeit dar, die Wartbarkeit deines Codes zu verbessern. Informationen zur Verwendung von Copilot Chat zum Hinzufügen hilfreicher Kommentare zu deinem Code findest du in den Beispielprompts in Dokumentieren eines Codes.

Note

Bei den in diesem Artikel veranschaulichten Antworten handelt es sich um Beispiele. Da die Copilot Chat-Antworten nicht deterministisch sind, erhältst du möglicherweise andere Antworten als die hier dargestellten.

Verbessern von Variablennamen

Durch beschreibende Variablen- und Parameternamen ist es einfacher, ihren Zweck nachzuvollziehen.

Beispielszenario

Dieser JavaScript-Code protokolliert eine Meldung über das Alter einer Person in der Konsole. Durch die abstrakten Parameternamen ist es schwierig, den Zweck des Codes nachzuvollziehen.

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.");
  }
}

Beispiel für Prompt

Wähle im Editor die Funktion aus, die du ändern möchtest, und stelle Copilot Chat die folgende Frage:

Improve the variable names in this function

Beispielantwort

Copilot schlägt beschreibende Variablennamen vor.

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.");
  }
}

Vermeiden sequenzieller Bedingungsüberprüfungen

if...else-Ketten können schwer lesbar sein. Das gilt insbesondere für lange Ketten.

Beispielszenario

Dieser Python-Code gibt den Laut aus, den verschiedene Tiere machen, sofern eine Definition vorhanden ist. Wird der Typ des Tieres nicht erkannt, gibt der Code „Unknown animal“ aus. Durch die Kette der if...else-Anweisungen ist der Code jedoch ineffizient und umständlich.

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"))

Beispiel für Prompt

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

Beispielantwort

Copilot schlägt vor, ein Wörterbuch zu verwenden, um die Tiertypen ihren entsprechenden Klassen zuzuordnen.

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"))

Reduzierung geschachtelter Logik

Durch tief geschachtelte Strukturen kann den Code schwer nachvollzogen werden, wodurch es sich in Zukunft als schwierig erweist, die Logik des Codes zu ändern oder zu erweitern.

Beispielszenario

Dieser Ruby-Code gibt Informationen zu einem Benutzerkonto basierend auf drei Parametern aus. Die Verwendung geschachtelter if...else-Anweisungen macht den Code unnötig komplex.

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)

Beispiel für Prompt

Rewrite this code to avoid the nested if/else statements

Beispielantwort

Copilot schlägt vor, Schutzklauseln zu verwenden, um die Bedingungen frühzeitig zu adressieren und die entsprechenden Nachrichten zurückzugeben.

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)

Aufteilen großer Methoden

Es kann schwierig sein, die Funktionsweise einer Methode oder Funktion nachzuvollziehen, wenn diese zu lang sind. Das erschwert zudem die Wartung. Methoden oder Funktionen, die mehrere Aufgaben ausführen, können in anderen Kontexten möglicherweise nicht wiederverwendbar sein. Es kann ebenfalls schwierig sein, jede Aufgabe isoliert zu testen.

Beispielszenario

Diese Java-Methode verarbeitet eine Kundenbestellung und gibt eine Nachricht aus. Sie führt mehrere Aufgaben in einer einzigen Methode aus.

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);
}

Beispiel für Prompt

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

Beispielantwort

Copilot schlägt vor, diese Methode in kleinere, zielgerichtetere Methoden zu unterteilen.

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);
}

Weitere Informationen