>Java >java지도 시간 >Java의 ommon 코드 냄새 및 해결 방법

Java의 ommon 코드 냄새 및 해결 방법

Patricia Arquette
Patricia Arquette원래의
2025-01-22 18:05:14998검색

ommon Code Smells in Java and How to Fix Them

코드 냄새는 Java 코드의 잠재적인 문제를 알리며 유지 관리 가능성, 가독성 및 성능에 영향을 미칩니다. 항상 버그는 아니지만 버그를 해결하면 코드베이스가 깨끗하고 효율적으로 유지됩니다. 이 기사에서는 5가지 일반적인 Java 코드 냄새를 조사하고 예제, 설명 및 개선된 솔루션을 제공합니다.


  1. 지나치게 긴 메소드

문제: 지나치게 긴 메서드는 가독성, 테스트 및 유지 관리를 방해합니다. 도우미 메서드를 사용하더라도 여러 추상화 수준을 결합하면 SRP(단일 책임 원칙)를 위반합니다.

예:

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

processOrder 관련 없는 작업(검증, 할인 계산, 재고 업데이트, 송장 발행, 알림)이 혼합되어 있어 의도하지 않은 결과 없이 수정하기가 어렵습니다.

해결책: 더 작고 집중적인 방법으로 리팩터링합니다. 명령 패턴이나 파이프라인 패턴과 같은 디자인 패턴은 모듈성을 향상시킵니다.

리팩터링된 코드(명령 패턴):

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

이점: 향상된 모듈성, 독립적인 테스트 및 명령 재사용, 새로운 단계의 손쉬운 추가.


  1. 하나님의 수업

문제: "God Class"는 너무 많은 책임을 처리하여 결합도가 높고 유지 관리성이 좋지 않습니다.

예:

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

해결책: 책임을 소규모의 집중적인 수업으로 분리하세요.

리팩터링된 코드:

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

이점: 결합 감소, 모듈성 개선, 유지 관리 용이, 테스트 및 독립적 확장.


  1. 매직넘버

문제: 리터럴 숫자를 직접 사용하면 코드 명확성이 떨어지고 수정이 위험해집니다.

예:

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

해결책: 리터럴 숫자를 명명된 상수로 바꾸세요.

리팩터링된 코드:

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

이점: 가독성 향상, 업데이트 중 오류 위험 감소, 명확한 비즈니스 로직.


  1. 중복 코드

문제: 메서드나 클래스 전반에 걸쳐 코드가 반복되면 불일치와 유지 관리 문제가 발생합니다.

예:

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

해결책: 공통 논리를 재사용 가능한 방법으로 추상화합니다.

리팩터링된 코드:

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

이점: 중복을 제거하고 일관성을 보장하며 수정 및 확장을 단순화합니다.


  1. 과도한 매개변수 목록

문제: 매개변수가 많은 메소드는 읽고 이해하기 어렵고 호출 중에 오류가 발생하기 쉽습니다.

예:

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

해결책: 객체 내에 매개변수를 캡슐화하거나 빌더 패턴을 사용하세요.

리팩터링된 코드:

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

이점: 가독성과 확장성이 향상됩니다. 매개변수 추가에는 메소드 서명 변경이 필요하지 않습니다.


코드 냄새를 해결하면 더 큰 설계 문제를 사전에 방지하고 기술적 부채를 줄여 더욱 강력하고 유지 관리하기 쉬운 Java 애플리케이션을 만들 수 있습니다. 더욱 깔끔하고 효율적인 코드를 위해 DRY(Don't Repeat Yourself) 및 SRP(Single Responsibility 원칙) 원칙을 기억하세요.

위 내용은 Java의 ommon 코드 냄새 및 해결 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.