Maison >Java >javaDidacticiel >Odeurs de code courantes en Java et comment les corriger

Odeurs de code courantes en Java et comment les corriger

Patricia Arquette
Patricia Arquetteoriginal
2025-01-22 18:05:14995parcourir

ommon Code Smells in Java and How to Fix Them

Les odeurs de code signalent des problèmes potentiels dans votre code Java, ayant un impact sur la maintenabilité, la lisibilité et les performances. Bien qu'il ne s'agisse pas toujours de bogues, leur résolution permet de maintenir votre base de code propre et efficace. Cet article examine cinq odeurs de code Java courantes, en fournissant des exemples, des explications et des solutions améliorées.


  1. Méthodes trop longues

Le problème : Les méthodes excessivement longues entravent la lisibilité, les tests et la maintenance. Même avec des méthodes d'assistance, la combinaison de plusieurs niveaux d'abstraction viole le principe de responsabilité unique (SRP).

Exemple :

<code class="language-java">public void processOrder(Order order) {
    validateOrder(order);
    calculateDiscount(order);
    updateInventory(order);
    generateInvoice(order);
    sendNotification(order);
}</code>

processOrder mélange des tâches non liées (validation, calcul des remises, mises à jour des stocks, facturation et notifications), ce qui rend difficile toute modification sans conséquences inattendues.

Solution : Refactorisez en méthodes plus petites et ciblées. Les modèles de conception tels que Command Pattern ou Pipeline Pattern améliorent la modularité.

Code refactorisé (modèle de commande) :

<code class="language-java">interface OrderCommand { void execute(Order order); }

class ValidateOrderCommand implements OrderCommand {
    public void execute(Order order) { /* Validation logic */ }
}

// ... other commands (ApplyDiscountCommand, etc.)

class OrderProcessor {
    List<OrderCommand> commands;

    public OrderProcessor(List<OrderCommand> commands) { this.commands = commands; }

    public void processOrder(Order order) {
        for (OrderCommand command : commands) { command.execute(order); }
    }
}

// Usage
List<OrderCommand> commands = List.of(new ValidateOrderCommand(), new ApplyDiscountCommand(), ...);
OrderProcessor processor = new OrderProcessor(commands);
processor.processOrder(new Order());</code>

Avantages : Modularité améliorée, tests indépendants et réutilisation des commandes, ajout facile de nouvelles étapes.


  1. Cours de Dieu

Le problème : Une « classe divine » gère trop de responsabilités, ce qui conduit à un couplage élevé et à une mauvaise maintenabilité.

Exemple :

<code class="language-java">public class OrderManager {
    public void createOrder() { /* Implementation */ }
    public void updateOrder() { /* Implementation */ }
    public void deleteOrder() { /* Implementation */ }
    public void validatePayment() { /* Implementation */ }
    public void sendInvoice() { /* Implementation */ }
}</code>

Solution : Séparez les responsabilités en classes plus petites et ciblées.

Code refactorisé :

<code class="language-java">public class OrderService {
    public void createOrder() { /* Implementation */ }
    // ... other order-related methods
}

public class PaymentService {
    public void validatePayment() { /* Implementation */ }
}

public class NotificationService {
    public void sendInvoice() { /* Implementation */ }
}</code>

Avantages : Couplage réduit, modularité améliorée, maintenance, tests et extension indépendantes plus faciles.


  1. Nombres magiques

Le problème : L'utilisation de nombres littéraux réduit directement la clarté du code et rend les modifications risquées.

Exemple :

<code class="language-java">public double calculateDiscount(double totalAmount) {
    return totalAmount > 1000 ? totalAmount * 0.1 : totalAmount;
}</code>

Solution : Remplacez les nombres littéraux par des constantes nommées.

Code refactorisé :

<code class="language-java">private static final double DISCOUNT_THRESHOLD = 1000;
private static final double DISCOUNT_RATE = 0.1;

public double calculateDiscount(double totalAmount) {
    return totalAmount > DISCOUNT_THRESHOLD ? totalAmount * DISCOUNT_RATE : totalAmount;
}</code>

Avantages : Lisibilité améliorée, risque d'erreur réduit lors des mises à jour, logique métier plus claire.


  1. Code en double

Le problème : Un code répété dans plusieurs méthodes ou classes entraîne des incohérences et des problèmes de maintenance.

Exemple :

<code class="language-java">public double calculateTax(double amount) { return amount * 0.18; }
public double calculateDiscount(double amount) { return amount * 0.1; }</code>

Solution : Abstraction de la logique commune dans une méthode réutilisable.

Code refactorisé :

<code class="language-java">private double applyRate(double amount, double rate) { return amount * rate; }

public double calculateTax(double amount) { return applyRate(amount, 0.18); }
public double calculateDiscount(double amount) { return applyRate(amount, 0.1); }</code>

Avantages : Élimine la redondance, assure la cohérence, simplifie la modification et l'extension.


  1. Listes de paramètres excessives

Le problème : Les méthodes avec de nombreux paramètres sont difficiles à lire, à comprendre et sujettes à des erreurs lors des appels.

Exemple :

<code class="language-java">public void processOrder(Order order) {
    validateOrder(order);
    calculateDiscount(order);
    updateInventory(order);
    generateInvoice(order);
    sendNotification(order);
}</code>

Solution : Encapsulez les paramètres dans un objet ou utilisez un modèle de générateur.

Code refactorisé :

<code class="language-java">interface OrderCommand { void execute(Order order); }

class ValidateOrderCommand implements OrderCommand {
    public void execute(Order order) { /* Validation logic */ }
}

// ... other commands (ApplyDiscountCommand, etc.)

class OrderProcessor {
    List<OrderCommand> commands;

    public OrderProcessor(List<OrderCommand> commands) { this.commands = commands; }

    public void processOrder(Order order) {
        for (OrderCommand command : commands) { command.execute(order); }
    }
}

// Usage
List<OrderCommand> commands = List.of(new ValidateOrderCommand(), new ApplyDiscountCommand(), ...);
OrderProcessor processor = new OrderProcessor(commands);
processor.processOrder(new Order());</code>

Avantages : Améliore la lisibilité et l'extensibilité ; l'ajout de paramètres ne nécessite pas de modifications de signature de méthode.


La résolution proactive des odeurs de code évite les problèmes de conception plus importants et réduit la dette technique, ce qui conduit à des applications Java plus robustes et plus maintenables. N'oubliez pas les principes DRY (Don't Repeat Yourself) et SRP (Single Responsibility Principe) pour un code plus propre et plus efficace.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:Comment j'apprends JavaArticle suivant:Comment j'apprends Java