Einleitung: Warum sauberer Code kein Luxus, sondern eine Notwendigkeit ist
\nJeder Java-Entwickler kennt die Situation, wenn er ein altes Projekt öffnet und Stunden damit verbringt, zu verstehen, was er selbst vor ein paar Monaten geschrieben hat. Und was soll man erst über fremden Code sagen? Unsauberer Code verlangsamt die Entwicklung, erhöht die Anzahl der Fehler und demotiviert das Team. Robert Martins Buch "Clean Code" ist zur Bibel für Programmierer geworden, aber seine Prinzipien bleiben oft abstrakt. In diesem Artikel analysieren wir die wichtigsten Konzepte von Clean Code in Java mit realen Beispielen, die Sie noch heute anwenden können.
\nSauberer Code geht nicht um perfekte Syntax oder darum, einer Mode zu folgen. Es geht um Respekt gegenüber Kollegen, dem zukünftigen Ich und letztendlich dem Geschäft. Lesbarer Code ist einfacher zu warten, zu testen und zu refaktorisieren. Schauen wir uns an, wie man Java-Code von "funktionierend" in "sauber" verwandelt.
\n\n1. Aussagekräftige Namen: Sprechen Sie die Sprache der Fachdomäne
\nRegel: Der Name sollte die Fragen "warum?", "was?", "wie?" beantworten
\nSchlechte Benennung ist der Hauptfeind von sauberem Code. Variablen wie int a, String d oder List<Integer> list1 transportieren keine Informationen. Ein guter Name sollte die Absicht des Programmierers offenbaren.
// Schlecht\nint d; // elapsed time in days\nList<Integer> lst;\n\n// Gut\nint daysSinceCreation;\nList<Integer> customerIds;\n\nVermeiden Sie Fehlinformationen
\nVerwenden Sie nicht accountList, wenn es sich nicht um eine List, sondern z. B. um ein Set oder eine Map handelt. Kürzen Sie Offensichtliches nicht ab: usrNm statt userName.
Namen von Klassen und Methoden
\n- \n
- Klassen: Substantive (
Customer,OrderProcessor). \n - Methoden: Verben (
calculateTotal(),saveToDatabase()). \n - Boolesche Variablen: Prädikate (
isActive,hasPermission). \n
// Schlecht\npublic class Data {\n public void proc() { ... }\n}\n\n// Gut\npublic class InvoiceCalculator {\n public BigDecimal calculateTotalAmount() { ... }\n}\n\n2. Funktionen: Kurz, atomar und ohne Seiteneffekte
\nErstes Prinzip: Eine Funktion sollte nur eine Sache tun
\nEine ideale Funktion in Java umfasst 4-20 Zeilen. Wenn eine Funktion mehr als eine Aktion ausführt, sollte sie aufgeteilt werden. Ein klassisches Anzeichen: Wenn Sie aus einer Funktion eine andere Funktion mit einem aussagekräftigen Namen extrahieren können – tun Sie es.
\n\n// Schlecht: Die Funktion macht drei Dinge\npublic void processOrder(Order order) {\n if (order == null) throw new IllegalArgumentException();\n // 1. Validierung\n if (order.getItems().isEmpty()) {\n logger.warn("Empty order");\n return;\n }\n // 2. Kostenberechnung\n BigDecimal total = BigDecimal.ZERO;\n for (Item item : order.getItems()) {\n total = total.add(item.getPrice().multiply(BigDecimal.valueOf(item.getQuantity())));\n }\n // 3. E-Mail-Versand\n emailService.sendConfirmation(order.getCustomerEmail(), total);\n}\n\n// Gut: Jede Funktion macht eine Sache\npublic void processOrder(Order order) {\n validateOrder(order);\n BigDecimal total = calculateTotal(order);\n sendConfirmationEmail(order, total);\n}\n\nprivate void validateOrder(Order order) {\n if (order == null || order.getItems().isEmpty()) {\n throw new IllegalArgumentException("Invalid order");\n }\n}\n\nprivate BigDecimal calculateTotal(Order order) {\n return order.getItems().stream()\n .map(item -> item.getPrice().multiply(BigDecimal.valueOf(item.getQuantity())))\n .reduce(BigDecimal.ZERO, BigDecimal::add);\n}\n\nDie Pfadfinderregel: Hinterlasse das Lager sauberer, als du es vorgefunden hast
\nVerbessern Sie die Datei jedes Mal, wenn Sie sie bearbeiten: Benennen Sie eine schlechte Variable um, teilen Sie eine lange Funktion auf. Dies verhindert die Entropie des Codes.
\n<