検索
ホームページJava&#&チュートリアルJava のよくあるコードの臭いとその修正方法

ommon Code Smells in Java and How to Fix Them

コードの匂いは、Java コード内の潜在的な問題を示し、保守性、可読性、パフォーマンスに影響を与えます。 常にバグがあるわけではありませんが、バグに対処することでコードベースをクリーンで効率的に保つことができます。この記事では、5 つの一般的な Java コードの匂いを調べ、例、説明、改善された解決策を示します。


  1. 長すぎるメソッド

問題: メソッドが長すぎると、可読性、テスト、メンテナンスが妨げられます。ヘルパー メソッドを使用する場合でも、複数の抽象レベルを組み合わせると単一責任原則 (SRP) に違反します。

例:

public void processOrder(Order order) {
    validateOrder(order);
    calculateDiscount(order);
    updateInventory(order);
    generateInvoice(order);
    sendNotification(order);
}

processOrder には無関係なタスク (検証、割引計算、在庫更新、請求書発行、通知) が混在しているため、意図しない結果を招くことなく変更することが困難です。

解決策: より小さく、焦点を絞ったメソッドにリファクタリングします。コマンド パターンやパイプライン パターンなどのデザイン パターンは、モジュール性を強化します。

リファクタリングされたコード (コマンド パターン):

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

利点: モジュール性の向上、独立したテストとコマンドの再利用、新しいステップの簡単な追加。


  1. 神クラス

問題: 「神クラス」はあまりにも多くの責任を処理するため、結合度が高く、保守性が低下します。

例:

public class OrderManager {
    public void createOrder() { /* Implementation */ }
    public void updateOrder() { /* Implementation */ }
    public void deleteOrder() { /* Implementation */ }
    public void validatePayment() { /* Implementation */ }
    public void sendInvoice() { /* Implementation */ }
}

解決策: 責任をより小規模で集中的なクラスに分割します。

リファクタリングされたコード:

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 */ }
}

利点: 結合の減少、モジュール性の向上、メンテナンス、テストの容易化、独立した拡張。


  1. マジックナンバー

問題: リテラル数値を直接使用すると、コードの明瞭さが低下し、変更の危険が生じます。

例:

public double calculateDiscount(double totalAmount) {
    return totalAmount > 1000 ? totalAmount * 0.1 : totalAmount;
}

解決策: リテラル数値を名前付き定数に置き換えます。

リファクタリングされたコード:

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

利点: 可読性の向上、更新中のエラーのリスクの軽減、ビジネス ロジックの明確化。


  1. コードが重複しています

問題: メソッドまたはクラス間でコードを繰り返すと、不整合が発生し、メンテナンスの悩みが生じます。

例:

public double calculateTax(double amount) { return amount * 0.18; }
public double calculateDiscount(double amount) { return amount * 0.1; }

解決策: 共通ロジックを再利用可能なメソッドに抽象化します。

リファクタリングされたコード:

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

利点: 冗長性を排除し、一貫性を確保し、変更と拡張を簡素化します。


  1. 過剰なパラメータリスト

問題: 多くのパラメータを持つメソッドは読みにくく、理解しにくく、呼び出し中にエラーが発生しやすくなります。

例:

public void processOrder(Order order) {
    validateOrder(order);
    calculateDiscount(order);
    updateInventory(order);
    generateInvoice(order);
    sendNotification(order);
}

解決策: パラメータをオブジェクト内にカプセル化するか、ビルダー パターンを使用します。

リファクタリングされたコード:

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

利点: 可読性と拡張性が向上します。パラメータを追加する場合、メソッド シグネチャを変更する必要はありません。


コードの臭いに積極的に対処すると、より大きな設計上の問題が防止され、技術的負債が軽減され、より堅牢で保守しやすい Java アプリケーションが実現されます。 よりクリーンで効率的なコードを作成するには、DRY (Don't Reply Yourself) と SRP (Single Responsibility Principle) の原則を覚えておいてください。

以上がJava のよくあるコードの臭いとその修正方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)