Java의 ommon 코드 냄새 및 해결 방법
코드 냄새는 Java 코드의 잠재적인 문제를 알리며 유지 관리 가능성, 가독성 및 성능에 영향을 미칩니다. 항상 버그는 아니지만 버그를 해결하면 코드베이스가 깨끗하고 효율적으로 유지됩니다. 이 기사에서는 5가지 일반적인 Java 코드 냄새를 조사하고 예제, 설명 및 개선된 솔루션을 제공합니다.
-
지나치게 긴 메소드
문제: 지나치게 긴 메서드는 가독성, 테스트 및 유지 관리를 방해합니다. 도우미 메서드를 사용하더라도 여러 추상화 수준을 결합하면 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());
이점: 향상된 모듈성, 독립적인 테스트 및 명령 재사용, 새로운 단계의 손쉬운 추가.
-
하나님의 수업
문제: "God Class"는 너무 많은 책임을 처리하여 결합도가 높고 유지 관리성이 좋지 않습니다.
예:
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 */ } }
이점: 결합 감소, 모듈성 개선, 유지 관리 용이, 테스트 및 독립적 확장.
-
매직넘버
문제: 리터럴 숫자를 직접 사용하면 코드 명확성이 떨어지고 수정이 위험해집니다.
예:
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; }
이점: 가독성 향상, 업데이트 중 오류 위험 감소, 명확한 비즈니스 로직.
-
중복 코드
문제: 메서드나 클래스 전반에 걸쳐 코드가 반복되면 불일치와 유지 관리 문제가 발생합니다.
예:
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); }
이점: 중복을 제거하고 일관성을 보장하며 수정 및 확장을 단순화합니다.
-
과도한 매개변수 목록
문제: 매개변수가 많은 메소드는 읽고 이해하기 어렵고 호출 중에 오류가 발생하기 쉽습니다.
예:
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 Repeat Yourself) 및 SRP(Single Responsibility 원칙) 원칙을 기억하세요.
위 내용은 Java의 ommon 코드 냄새 및 해결 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











일부 애플리케이션이 제대로 작동하지 않는 회사의 보안 소프트웨어에 대한 문제 해결 및 솔루션. 많은 회사들이 내부 네트워크 보안을 보장하기 위해 보안 소프트웨어를 배포 할 것입니다. ...

시스템 도킹의 필드 매핑 처리 시스템 도킹을 수행 할 때 어려운 문제가 발생합니다. 시스템의 인터페이스 필드를 효과적으로 매핑하는 방법 ...

데이터베이스 작업에 MyBatis-Plus 또는 기타 ORM 프레임 워크를 사용하는 경우 엔티티 클래스의 속성 이름을 기반으로 쿼리 조건을 구성해야합니다. 매번 수동으로 ...

많은 응용 프로그램 시나리오에서 정렬을 구현하기 위해 이름으로 이름을 변환하는 솔루션, 사용자는 그룹으로, 특히 하나로 분류해야 할 수도 있습니다.

IntellijideAultimate 버전을 사용하여 봄을 시작하십시오 ...

Java 객체 및 배열의 변환 : 캐스트 유형 변환의 위험과 올바른 방법에 대한 심층적 인 논의 많은 Java 초보자가 객체를 배열로 변환 할 것입니다 ...

전자 상거래 플랫폼에서 SKU 및 SPU 테이블의 디자인에 대한 자세한 설명이 기사는 전자 상거래 플랫폼에서 SKU 및 SPU의 데이터베이스 설계 문제, 특히 사용자 정의 판매를 처리하는 방법에 대해 논의 할 것입니다 ...

데이터베이스 쿼리에 tkmyBatis를 사용하는 경우 쿼리 조건을 구축하기 위해 엔티티 클래스 변수 이름을 우아하게 가져 오는 방법이 일반적인 문제입니다. 이 기사는 고정 될 것입니다 ...
